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}
初始化了一堆根底设置,来看看Routerrouter.DefaultRouter,
在router/router.go中的DefaultRouter = NewRouter()
// NewRouter creates new Router and returns itfunc NewRouter(opts ...Option) Router { return newRouter(opts...)}// newRouter creates new router and returns itfunc 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}
这里做了以下事件:
- 初始化并设置Options
- 初始化router{}
fetchRoutes()检索给定服务的所有路由,并在路由表中创立它们
- r.options.Registry.GetService{}获取所有服务
r.manageRoutes(srv, "create", domain)
- 每个节点初始化Route{}
r.manageRoute(route, action)
- r.table.Create(route)在路由表中创立新的路由
- 调用
newTable()
创立新table,返回table{} r.start(),启动路由
- r.options.Prewarm是否预热路由表,须要就调用r.manageRegistryRoutes(r.options.Registry, "create")创立所有路由
- 增加默认网关到路由表
- registry watcher监听服务注册变动
- 启动协程,监听退出信号,服务注册变动信号,watchRegistry监督注册表并依据接管到的事件更新路由表。
如果注册表监督程序失败或路由表更新失败,则返回谬误。
执行到到router的时候,服务都曾经在注册核心注册好了,这里router会获取所有服务,建好路由表了