乐趣区

关于micro:go-micro-router

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
}

初始化了一堆根底设置,来看看 Router
router.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
}

这里做了以下事件:

  1. 初始化并设置 Options
  2. 初始化 router{}
  3. fetchRoutes()检索给定服务的所有路由,并在路由表中创立它们

    1. r.options.Registry.GetService{}获取所有服务
    2. r.manageRoutes(srv, “create”, domain)

      1. 每个节点初始化 Route{}
      2. r.manageRoute(route, action)

        1. r.table.Create(route)在路由表中创立新的路由
  4. 调用 newTable() 创立新 table,返回 table{}
  5. r.start(), 启动路由

    1. r.options.Prewarm 是否预热路由表,须要就调用 r.manageRegistryRoutes(r.options.Registry, “create”)创立所有路由
    2. 增加默认网关到路由表
    3. registry watcher 监听服务注册变动
    4. 启动协程,监听退出信号,服务注册变动信号,watchRegistry 监督注册表并依据接管到的事件更新路由表。

如果注册表监督程序失败或路由表更新失败,则返回谬误。

执行到到 router 的时候,服务都曾经在注册核心注册好了,这里 router 会获取所有服务,建好路由表了

退出移动版