go micro router

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
}

初始化了一堆基礎設置,來看看Router
router.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

  1. 初始化並設置Options
  2. 初始化router{}
  3. fetchRoutes()檢索給定服務的全部路由,並在路由表中建立它們dom

    1. r.options.Registry.GetService{}獲取全部服務
    2. r.manageRoutes(srv, "create", domain)fetch

      1. 每一個節點初始化Route{}
      2. r.manageRoute(route, action)插件

        1. r.table.Create(route)在路由表中建立新的路由
  4. 調用newTable()建立新table,返回table{}
  5. r.start(),啓動路由code

    1. r.options.Prewarm是否預熱路由表,須要就調用r.manageRegistryRoutes(r.options.Registry, "create")建立全部路由
    2. 添加默認網關到路由表
    3. registry watcher監聽服務註冊變更
    4. 啓動協程,監聽退出信號,服務註冊變更信號,watchRegistry監視註冊表並根據接收到的事件更新路由表。

若是註冊表監視程序失敗或路由表更新失敗,則返回錯誤。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協程

相關文章
相關標籤/搜索