Dubbo源码|十五、Dubbo服务暴露—注册中心URL
开篇
本文介绍Dubbo的服务暴露过程中注册中心URL的生成。
服务导出主要得做两件事情分别为:
- 根据服务配置的参数信息,启动对应的容器netty、tomcat等
- 将服务的信息注册到配置的注册中心上
URL概念
URL有两个主要的作用:作为资源、方便扩展。
资源
URL
在Dubbo
中表示一种资源,是一个统一、通用的概念。像注册中心、Dubbo服务、协议、监控中心等都表示一种资源,代表一种具体的资源。
例如:注册中心用URL表示,当注册中心使用zookeeper作为注册中心时,他可以表示为:
zookeeper://ip:port?timeout=1000¶mter1=xxx¶mter2=xxx
如果使用redis作为注册中心的话:
redis://ip:port?timeout=1000¶mter1=xxx¶mter2=xxx
一个使用dubbo协议
的Dubbo服务可以表示为:
dubbo://ip:port/org.apache.dubbo.demo.DemoService?version=1.0&group=test&timeout=1000
一个使用http协议
的Dubbo服务可以表示为:
http://ip:port/org.apache.dubbo.demo.DemoService?version=1.0&group=test&timeout=1000
扩展
因为Dubbo的URL相当于制定了一个规范,如果我们想再加一个自定义的注册中心的话,只需要定一个协议,按照URL的格式拼接好就好了,主体逻辑不用变。
服务导出
先看导出代码:
protected synchronized void doExport() {
if (unexported) {
throw new IllegalStateException("The service " + interfaceClass.getName() + " has already unexported!");
}
if (exported) {
return;
}
exported = true;
if (StringUtils.isEmpty(path)) {
path = interfaceName;
}
doExportUrls();
bootstrap.setReady(true);
}
- 如果
unexported
为true
,直接抛出异常,当服务销毁时(destroy
方法被调用),会变为true
。 - 如果已经导出了,直接返回。
- 标记服务被导出。
- 如果导出路径path为空,则使用接口名作为路径。
- 执行导出url。
导出URL
- 先把要导出的接口、
ServiceConfig
、具体的实现类,放入到一个提供者缓存中providers
。 - 查询所有的注册中心,构造出注册中心URL。
- 遍历所有的协议,将每个协议都进行导出服务。
获取注册中心
该方法主要做的工作如下:
- 从
ServiceBean
(也就是AbstractInterfaceConfig
)中获取设置的注册中心配置信息,对每一个注册中心配置进行遍历。 - 判断注册地址是否为空,如果是空的话,则使用
0.0.0.0
作为注册地址。 - 判断注册中心地址是否为
N/A
,如果是的话,直接忽略。 - 将应用信息、注册中心信息中的配置参数放入map中(通过get方法获取的)。
- 设置
path
值为org.apache.dubbo.registry.RegistryService
。 - 让
map
中添加运行时参数,例如dubbo
的版本信息、时间戳等。 - 判断
map
中是否包含协议信息,如果没有,添加默认dubbo
协议。 - 调用
parseURLs
方法,构造URL。 - 如果协议的值为
service-discovery-registry
,则处理一些兼容逻辑。
构造URL
根据传入的地址,解析出URL,如果地址中含有分号;
,则会根据分号进行分割,解析出多个URL。
再进一步解析地址时,如果地址里包含逗号,
,则会根据逗号分割,转换为backup的形式,例如:
如果地址为192.168.1.10,192.168.1.11
,则会转变为192.168.1.10?backup=192.168.1.11
。
最后解析出的URL格式如下:
zookeeper://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-annotation-provider&dubbo=2.0.2&id=registryConfig&pid=33963×tamp=1670934644931
得到URL后,会对URL做进一步转换,更改为通用的注册中心地址,更改协议头为registry
,并把具体的协议用registry
参数表示:
registry://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-annotation-provider&dubbo=2.0.2&id=registryConfig&pid=33963®istry=zookeeper×tamp=1670934644931
后记
本篇介绍了URL的基本概念,以及注册中心URL的生成,下篇将介绍如何将服务导出到注册中心。