前文已介绍过 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 社区。