go micro cmd

micro.newService()中newOptionsgit

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()github

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結構體中web

  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)
    //...太長省略
}

這裏作了不少事情segmentfault

  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()便可獲取數組

go micro 分析系列文章
go micro server 啓動分析
go micro client
go micro broker
go micro cmd
go micro config
go micro store
go micro registry
go micro router
go micro runtime
go micro transport
go micro web
go micro registry 插件consul
go micro plugin
go micro jwt 網關鑑權
go micro 鏈路追蹤
go micro 熔斷與限流
go micro wrapper 中間件
go micro metrics 接入Prometheus、Grafanaapp

相關文章
相關標籤/搜索