在前文(【dubbo-go 源码解析】Dubbo-go 中服务如何自动被发现?|Go主题月)中已经介绍过,元数据信息分别包括:应用级元数据与服务元数据,而 Consumer 最关心的则是服务级元数据。接下来看看元数据的实现。
-
元数据中心:使用配置中心作为元数据中心。Provider 启动后,会将所有服务级别的元数据信息序列化之后,发布到元数据中心。Consumer 则在收到元数据中心更新信息后,重新生成本地 Invoker。
-
内建元数据中心
-
Consumer 内建元数据中心:在 Consumer 端内建元数据中心,主要考虑元数据中心相对静态,优缺点也是很明显。优点在于可以减少请求 Provider 的次数,而缺点在于 Provdier 服务元数据信息变更不能通知 Consumer。
-
Provider 内建元数据中心:通过标准的 Dubbo 协议暴露的元数据中心,根据参数,将内存中符合条件的服务元数据信息返回给 Consumer。
相信现在已经对服务发现模式及在 Dubbo-go 中使用的元数据信息有所了解。既然是元数据中心,肯定会提供相关的服务。对于服务来说,最关键提供什么服务与如何存放数据。所以,在后续内容中,将以 Consumer 内建元数据中心而展开。
在前文(参考:【dubbo-go 源码解析】Dubbo-go 服务发现如何改成应用级?|Go主题月)中已经提到,Consumer 已经获得了 Consumer 需要访问的是哪种注册中心。获得其构造方法之后,则需要通过 serviceURL(标示 Consumer 信息)注册 Consumer 到注册中心(样例 1)。
`func (proto *registryProtocol) Refer(url *common.URL) protocol.Invoker {`
`...`
`err = reg.Register(serviceUrl) <<< 注册/发布服务 URL 到注册中心`
`...`
`}`
复制代码
样例 1
因使用的是 service_discovery 协议所以会调用 serviceDiscoveryRegistry.Register 方法(样例 2)。在该方法中,将URL(服务元数据)注册进元数据中心以便后续提供服务。到此可能会产生另外一个问题:往服务中注册元数据,那怎么使用?Dubbo-go 获取 URL 中的 Service Key 作为 Key 缓存整个服务元数据信息。在需要使用时,通过应用级别信息,找到应用与服务的对应关系,并通过 Service Key 获取对应服务元数据信息。最后与应用信息结合在一起(后续会提到)。本质上来说,就是:
-
注册:缓存 key -> URL 到内存。
-
使用:应用 -> 应用与服务关系 -> key -> 获取 URL -> 转换服务元数据
`func (s *serviceDiscoveryRegistry) Register(url *common.URL) error {`
`if !shouldRegister(url) {`
`return nil`
`}`
`ok, err := s.metaDataService.ExportURL(url) <<< 将元数据(URL)注册进元数据中心`
`...`
`}`
复制代码
样例 2
元数据信息具体的数据结构是怎样的呢?具体每一个 key 有什么用呢?这个问题大家可以自己尝试探究一下,在此我就不一一细说了。
接下来,主要是讲解元数据与应用信息如何结合,组织成 Dubbo-go RPC 可调用的 Invoker。
欢迎加入社区
在公众号【部长技术之路】后台回复关键字【dubbogo】加入社区。