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 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
}
这里做了以下事件:
- 初始化并设置 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 会获取所有服务,建好路由表了