likes
comments
collection
share

Dubbo源码|十五、Dubbo服务暴露—注册中心URL

作者站长头像
站长
· 阅读数 14

开篇

本文介绍Dubbo的服务暴露过程中注册中心URL的生成。

服务导出主要得做两件事情分别为:

  1. 根据服务配置的参数信息,启动对应的容器netty、tomcat等
  2. 将服务的信息注册到配置的注册中心上

URL概念

URL有两个主要的作用:作为资源、方便扩展。

资源

URLDubbo中表示一种资源,是一个统一、通用的概念。像注册中心、Dubbo服务、协议、监控中心等都表示一种资源,代表一种具体的资源。

例如:注册中心用URL表示,当注册中心使用zookeeper作为注册中心时,他可以表示为:

zookeeper://ip:port?timeout=1000&paramter1=xxx&paramter2=xxx

如果使用redis作为注册中心的话:

redis://ip:port?timeout=1000&paramter1=xxx&paramter2=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);
}
  1. 如果unexportedtrue,直接抛出异常,当服务销毁时(destroy方法被调用),会变为true
  2. 如果已经导出了,直接返回。
  3. 标记服务被导出。
  4. 如果导出路径path为空,则使用接口名作为路径。
  5. 执行导出url。

导出URL

Dubbo源码|十五、Dubbo服务暴露—注册中心URL

  1. 先把要导出的接口、ServiceConfig、具体的实现类,放入到一个提供者缓存中providers
  2. 查询所有的注册中心,构造出注册中心URL。
  3. 遍历所有的协议,将每个协议都进行导出服务。

获取注册中心

Dubbo源码|十五、Dubbo服务暴露—注册中心URL

该方法主要做的工作如下:

  1. ServiceBean(也就是AbstractInterfaceConfig)中获取设置的注册中心配置信息,对每一个注册中心配置进行遍历。
  2. 判断注册地址是否为空,如果是空的话,则使用0.0.0.0作为注册地址。
  3. 判断注册中心地址是否为N/A,如果是的话,直接忽略。
  4. 将应用信息、注册中心信息中的配置参数放入map中(通过get方法获取的)。
  5. 设置path值为org.apache.dubbo.registry.RegistryService
  6. map中添加运行时参数,例如dubbo的版本信息、时间戳等。
  7. 判断map中是否包含协议信息,如果没有,添加默认dubbo协议。
  8. 调用parseURLs方法,构造URL。
  9. 如果协议的值为service-discovery-registry,则处理一些兼容逻辑。

构造URL

Dubbo源码|十五、Dubbo服务暴露—注册中心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&timestamp=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&registry=zookeeper&timestamp=1670934644931

后记

本篇介绍了URL的基本概念,以及注册中心URL的生成,下篇将介绍如何将服务导出到注册中心。