【dubbo-go 源码解析】元数据是什么?|Go主题月

在前文(【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】加入社区。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享