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 ServerFx
s.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启动的时候都做了些什么。