micro.newService()中newOptionsweb
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 }
初始化了一堆基礎設置,來看看Routerrouter.DefaultRouter,
在router/router.go中的DefaultRouter = NewRouter()
segmentfault
// NewRouter creates new Router and returns it func NewRouter(opts ...Option) Router { return newRouter(opts...) } // newRouter creates new router and returns it func newRouter(opts ...Option) Router { // get default options options := DefaultOptions() // apply requested options for _, o := range opts { o(&options) } // construct the router r := &router{ options: options, subscribers: make(map[string]chan *Advert), } // create the new table, passing the fetchRoute method in as a fallback if // the table doesn't contain the result for a query. r.table = newTable(r.fetchRoutes) // start the router and return r.start() return r }
這裏作了如下事情:app
fetchRoutes()檢索給定服務的全部路由,並在路由表中建立它們dom
r.manageRoutes(srv, "create", domain)fetch
r.manageRoute(route, action)插件
newTable()
建立新table,返回table{}r.start(),啓動路由code
若是註冊表監視程序失敗或路由表更新失敗,則返回錯誤。router
執行到到router的時候,服務都已經在註冊中心註冊好了,這裏router會獲取全部服務,建好路由表了server
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、Grafana協程