【dubbo-go 源码解析】URL:如何应用到 Dubbo-go?| Go主题月

464 阅读5分钟

前文已介绍过 URL 为什么可以作为统一数据模型,知道了为什么之后,则需要了解如何使用,所以 Dubbo-go 中的 URL 是如何设计与应用?在整个 Dubbo-go 的服务周期又是如何使用?接下来一一解答。

设计

接着是几个 URL 的典型例子:

描述使用 dubbo 作为通讯协议的 Provider:

描述一个注册中心服务:

了解 URL 如何设计之后,接下来就是在生命周期中的应用。

应用

URL 在 Dubbo-go 的生命周期中,最重要是有三部分的应用,分别是:组织服务信息、暴露服务、引用服务。该三部分在 Dubbo-go 之中,是有一定的关系。而最能体现其中关系的则是 Dubbo-go 启动时,读取配置文件到解析成服务信息的整个过程,如图 1 所示。所以接下来以启动 Provider 与 Consumer 为例,讲解这三部分在 Dubbo-go 中如何应用。

图 1

配置文件

在开始正式讲解之前,需要先对配置文件有个基础的了解。Dubbo-go 是用 yml 格式的文件作为基础配置文件的格式。配置文件是每一个 Dubbo-go 应用基础,它用于定义 Dubbo-go 对外暴露哪些服务、引用外部哪些服务等各种信息,所以每一个 Dubbo-go 应用都会有一份对应的配置文件。以下是 Dubbo-go Provider 与 Dubbo-go Consumer 的配置文件例子,Provider 包含:注册中心信息与对外暴露服务的信息,而 Consumer 包含:注册中心信息与引用服务的信息。

Provider 配置文件 1

Consumer 配置文件 1

Dubbo-go 启动时,读取配置的信息后,将其组织成暴露服务与引用服务所需要的信息,则是接下来需要做的事情。

组织服务信息

图 2

在服务暴露之前,将暴露服务所需要的信息提取,组织成服务暴露的 URL。大致可以分成以下两大部分(如图 2 所示,对应代码在 ServiceConfig.Export() ):

  • 生成注册中心 URL

  • 解析注册中心信息。(参考:Provider 配置文件 1 - registries)。

  • 生成注册中心 URL,本例为:

  • 以 K-V 的形式存储,K 为 demoZk,V 为上一步中生成的 URL。以备后续使用。

  • 生成暴露服务 URL

  • 解析协议信息,获取对应协议名,本例中为:“dubbo”(参考:Provider 配置文件 1 - protocols - name)。

  • 通过协议名 dubbo 匹配服务信息中的协议,获取到 UserProvider 中信息(参考:图 3 中红色部分)。

  • 使用所需要的信息,组织服务信息,如:协议、接口名、接口暴露的方法等。

  • 生成服务暴露所需要的 URL,本例中为:

图 3

生成了 URL 之后,则可以通过其直接暴露服务到注册中心。›

暴露服务

向注册中心暴露服务,需要注册提供者地址的情况下,ServiceConfig 解析 2 个 URL,分别为注册中心配置 URL 与 暴露服务 URL。该两个 URL 在通过组织服务信息的时候已经生成。分别为:

  • 注册中心 URL :

  • 暴露服务 URL :

因 Dubbo-go 支持多注册中心。所以在暴露服务之前,则需要匹配本次暴露的服务需要发布到哪一个注册中心,通过 services 中的 regitstry 字段,匹配 registries 中在【**组织服务信息】**生成的 K-V 结构,查找到对应注册中心的信息,并将需要暴露的信息发布到对应的注册中心(如图 4 中绿色部分所示)。

图 4

基于自适应协议头的机制,通过 URL 的协议头 registry:// 可以识别出为注册中心配置。就会调用 protocol.Protocol.export() 方法,将 export 参数中的提供者 URL,通过读取 protocol,先执行注册的 protocol(registryProtocol),再执行 dubbo 暴露的 protocol (DubboProtocol)进行服务暴露。dubbo://127.0.0.1:20000/com.ikurento.user.UserProvider,通过 Provider 的 URL 中 dubbo:// 协议头识别出 DubboProtocol 的 export() 方法,启动服务并监听端口。

既然有服务的暴露,那肯定也有引用的服务。在 Dubbo-go 中,引用的服务也是基于 URL 对暴露的服务进行调用。

引用服务

图 5

接下来是分析如何通过 URL 引用服务,使用的配置文件为 【Consumer 配置文件 1】,整体流程与暴露服务区别不大。将引用服务所需要的信息提取,组织成引用服务的 URL ,最终通过 URL 生成 Invoker 以备在运行时程序直接调用。大致可以分成以下两大部分(如图 5 所示,对应代码在  ReferenceConfig.Refer() ):

  • 生成订阅暴露服务 URL 并订阅

  • 解析注册中心信息。(参考:Consumer 配置文件 1 - registries)。

  • 生成注册中心 URL,本例为:

  • 通过生成的注册中心 URL 订阅注册中心,用于订阅并生成引用的服务信息,以备程序运行过程中可以及时更新。

  • 生成引用服务的 URL

  • 解析协议信息,获取对应协议名,本例中为:“dubbo”(参考:Consumer 配置文件 1 - references - protocol)。

  • 通过协议名 dubbo 匹配服务信息中的协议,获取到对应协议的实现类 DubboProtocol。

  • 使用所需要的信息,组织服务信息,如:协议、接口名、引用的接口等。

  • 通过组织好的引用服务信息生成引用服务 URL,本例中为:

最终调用 DubboProtocol.Refer 通过 URL 生成 Invoker 以备在运行时程序直接调用。

总结

到此,相信你已经知道了使用 URL 的利弊,URL 在 Dubbo-go 中是怎样设计及应用,也知道了 URL 从组织服务信息到暴露服务及引用服务整个过程。

关于它,还有很多深层的知识值得我们一一探索和学习,比如:

  • Dubbo-go 如何通过 URL 实现调用的安全性?

  • Dubbo-go 如何通过 URL 实现客户端动态参数的传递到服务端?

这一系列问题的答案,都需要在后续的文章中,慢慢寻找答案。

加入社区

关注公众号【部长技术之路】,公众号后台回复关键字【dubbogo】加入 dubbo-go 社区。