乐趣区

关于micro:go-micro-cmd

micro.newService() 中 newOptions

func newOptions(opts ...Option) Options {
    opt := Options{
        Auth:      auth.DefaultAuth,
        Broker:    broker.DefaultBroker,
        Cmd:       cmd.DefaultCmd,
        Config:    config.DefaultConfig,
        Client:    client.DefaultClient,
        Server:    server.DefaultServer,
        Store:     store.DefaultStore,
        Registry:  registry.DefaultRegistry,
        Router:    router.DefaultRouter,
        Runtime:   runtime.DefaultRuntime,
        Transport: transport.DefaultTransport,
        Context:   context.Background(),
        Signal:    true,
    }
    
    for _, o := range opts {o(&opt)
    }
    
    return opt
}

初始化了一堆根底设置,先来看看 cmd cmd.DefaultCmd,
在 config/cmd/cmd.go DefaultCmd = newCmd()

type Cmd interface {
    // The cli app within this cmd
    App() *cli.App
    // Adds options, parses flags and initialise
    // exits on error
    Init(opts ...Option) error
    // Options set within this command
    Options() Options}

type cmd struct {
    opts Options
    app  *cli.App
}

type Option func(o *Options)

func newCmd(opts ...Option) Cmd {
    options := Options{
        Auth:      &auth.DefaultAuth,
        Broker:    &broker.DefaultBroker,
        Client:    &client.DefaultClient,
        Registry:  &registry.DefaultRegistry,
        Server:    &server.DefaultServer,
        Selector:  &selector.DefaultSelector,
        Transport: &transport.DefaultTransport,
        Router:    &router.DefaultRouter,
        Runtime:   &runtime.DefaultRuntime,
        Store:     &store.DefaultStore,
        Tracer:    &trace.DefaultTracer,
        Profile:   &profile.DefaultProfile,
        Config:    &config.DefaultConfig,

        Brokers:    DefaultBrokers,
        Clients:    DefaultClients,
        Registries: DefaultRegistries,
        Selectors:  DefaultSelectors,
        Servers:    DefaultServers,
        Transports: DefaultTransports,
        Routers:    DefaultRouters,
        Runtimes:   DefaultRuntimes,
        Stores:     DefaultStores,
        Tracers:    DefaultTracers,
        Auths:      DefaultAuths,
        Profiles:   DefaultProfiles,
        Configs:    DefaultConfigs,
    }

    for _, o := range opts {o(&options)
    }

    if len(options.Description) == 0 {options.Description = "a go-micro service"}

    cmd := new(cmd)
    cmd.opts = options
    cmd.app = cli.NewApp()
    cmd.app.Name = cmd.opts.Name
    cmd.app.Version = cmd.opts.Version
    cmd.app.Usage = cmd.opts.Description
    cmd.app.Before = cmd.Before
    cmd.app.Flags = DefaultFlags
    cmd.app.Action = func(c *cli.Context) error {return nil}

    if len(options.Version) == 0 {cmd.app.HideVersion = true}

    return cmd
}

这里的 cmd 构造体中

  1. opts 就是 options.go 中定义的各种属性,基本上 micro 中每个模块的 option 都在 options.go 中,而后是一堆设置属性的函数(函数选项模式)
  2. app 是 cli.app 实例,这个 cli 是 fork 的一个开源 cli 库 urfave/cli , 文档
  3. newCmd() 也初始化了很多 Options,承受参数赋值 o(&options)
  4. 初始化 cmd,设置一些根底值,包含 DefaultFlags,这些能够在命令行帮忙文本呈现,另外还有 cmd.app.Before = cmd.Before
func (c *cmd) Before(ctx *cli.Context) error
{
    //... 太长省略
    // 这里上面第三步正文
    authFn := func() auth.Auth { return *c.opts.Auth}
    cacheFn := func() *client.Cache { return (*c.opts.Client).Options().Cache}
    microClient := wrapper.CacheClient(cacheFn, grpc.NewClient())
    microClient = wrapper.AuthClient(authFn, microClient)
    //... 太长省略
}

这里做了很多事件

  1. 设置 clientOpts []client.Option,从命令行取以下参数放入数组:client_retries,client_request_timeout,client_pool_size,client_pool_ttl,
  2. 设置 serverOpts []server.Option,从命令行取以下参数放入数组:server_metadata(数组),server_name,server_version,server_id,server_address,server_advertise,register_ttl,register_interval,
  3. 设置 microClient,先定义了 authFn,cacheFn 用于初始化 client.client,相当于在 client 上 wrapper 包装 auth 和 cache,默认的 cache 是 memory
  4. 设置 authOpts,auth 的 options,从命令行取以下参数放入数组:auth_address,auth_id,auth_public_key,auth_private_key,service_namespace,auth_provider,auth_provider_client_id,auth_provider_endpoint,auth_provider_redirect,auth_provider_scope
  5. 设置 auth,如果命令行参数 auth 给了指定的 auth,就初始化指定的,没有就应用默认的 noop(没有验证)
  6. 生成服务 serverID
  7. 设置 broker options:brokerOpts,命令行参数 broker_address
  8. 设置 registry options:registryOpts,命令行参数 registry_address。设置服务注册 registry,命令行参数 registry,命令行有指定就初始化指定的服务注册核心,不然就用默认的,目前默认是 mdns(单机无效)
  9. 设置 selector,命令行参数 selector,命令行有指定就初始化指定的 selector(目前 2.x 版本是长期状态,v3 有较大变动)
  10. 设置路由 router,命令行参数 service_namespace,router_address,router,命令行有指定就初始化指定的
  11. 设置 store options,storeOpts 命令行参数 store_address,store_database,store_table,store,默认 memory,基于 patrickmn/go-cache
  12. 设置 runtime options,runtimeOpts,命令行参数 runtime_source,runtime,命令行有指定就初始化指定的
  13. 设置 tracer,profile,命令行参数 tracer,profile
  14. 设置 broker,命令行参数 broker,这里如果有自定义命令行参数,会同步增加到 serverOpts,clientOpts
  15. 设置 transport options,命令行参数 transport_address,transport 这里如果有自定义命令行参数,会同步增加到 serverOpts,clientOpts
  16. 设置 config 源,命令行参数 config,service_namespace,如果 config 设为 service 会有非凡设置
  17. 设置 client,命令行参数 client
  18. 设置 server,命令行参数 client

终于设置完了。。。
总结,micro 微服务启动过程中,通过 cmd 设置好了许多组件,cmd.Options() 即可获取

退出移动版