Server启动
代码入口:temporal/cmd/server/main.go
Choose here javascripttypescripthtmlcssshellpythongolangjavacc++c#phprubyswiftkotlinscalarustdartelixirhaskellluaperlrsql
s, err := temporal.NewServer(temporal.ForServices(services),temporal.WithConfig(cfg),temporal.WithDynamicConfigClient(dynamicConfigClient),temporal.WithLogger(logger),temporal.InterruptOn(temporal.InterruptCh()),temporal.WithAuthorizer(authorizer),temporal.WithClaimMapper(func(cfg *config.Config) authorization.ClaimMapper {return claimMapper}),
)
if err != nil {return cli.Exit(fmt.Sprintf("Unable to create server. Error: %v.", err), 1)
}err = s.Start()
func (s *ServerFx) Start() error {err := s.app.Start(context.Background())if err != nil {return err}......return nil
}
通过上面可以看到sever是通过一个app实例来启动的,那么这个app是什么呢?
我们找到这个app初始化的地方:
func NewServerFx(topLevelModule fx.Option, opts ...ServerOption) (*ServerFx, error) {var s ServerFxs.app = fx.New(topLevelModule,fx.Supply(opts),fx.Populate(&s.startupSynchronizationMode),fx.Populate(&s.logger),)if err := s.app.Err(); err != nil {return nil, err}return &s, nil
}
可以看到,这个app实际上一个fx实例,这个fx是一个uber开源的库,这个库是golang中非常流行的依赖注入解决方案库,具体后面有时间再单独拿出来讲解。
模块启动逻辑
这里我们主要来看下server启动的时候加载了哪些模块,我们找到topLevelModule:
TopLevelModule = fx.Options(pprof.Module,fx.Provide(NewServerFxImpl),fx.Provide(ServerOptionsProvider),TraceExportModule,fx.Provide(PersistenceFactoryProvider),fx.Provide(HistoryServiceProvider),fx.Provide(MatchingServiceProvider),fx.Provide(FrontendServiceProvider),fx.Provide(InternalFrontendServiceProvider),fx.Provide(WorkerServiceProvider),fx.Provide(ApplyClusterMetadataConfigProvider),fx.Invoke(ServerLifetimeHooks),FxLogAdapter,
)
通过对fix的了解我们知道,fx.invoke()方法就是执行一些模块的启动逻辑,相当于我们写的init()方法,在服务启动的时候自动执行,所以我们可以通过全局搜索fx.invoke来找到temporal server启动的时候都做了些什么。