References

Utilities

Command

定义子命令 serverCmd,并在 init 方法中挂载至 RootCmd 上,serverCmd 的 RunE 指向方法 serverCmdF。

  1. var serverCmd = &cobra.Command{
  2. Use: "server",
  3. Short: "Run the Mattermost server",
  4. RunE: serverCmdF,
  5. SilenceUsage: true,
  6. }

跟进 serverCmdF 方法,有如下关键代码,根据 configStore 名称,可以猜测 config.NewStore 创建的 Store 应该是用于保存配置文件的,那么 runServer 方法有可能从中读取或修改配置文件。

  1. func serverCmdF(command *cobra.Command, args []string) error {
  2. // ...
  3. configStore, err := config.NewStore(configDSN, !disableConfigWatch)
  4. if err != nil {
  5. return err
  6. }
  7. return runServer(configStore, disableConfigWatch, usedPlatform, interruptChan)
  8. }

app.Option

在 runServer 方法中,首先创建了 app.Option 数组,从名字并不难猜测这是关于 Server 的配置内容的,可是数组内容中的各行看起来更像方法。

  1. options := []app.Option{
  2. app.ConfigStore(configStore),
  3. app.RunJobs,
  4. app.JoinCluster,
  5. app.StartElasticsearch,
  6. app.StartMetrics,
  7. }

找到 Option 定义,确认 Option 是方法类型,且参数为 Server,足够了。

  1. type Option func(s *Server) error

Server

Core Components

首先进行核心组件的初始化,如下图所示
server-main-component.svg

FakeApp

App 作为 Server 的代理。
framework-server-app-relationship.svg

MakeHTTPService

make-http-service.svg

MakeImageProxy

make-image-proxy.svg

Email Batching Job

make-email-batching.svg

Initial Jobs

init-job-server.svg

Start HTTP Server

http-server.svg

API

api-routes.svg

WebSocket

Router

websocket-router.svg

API

websocket-api.svg