前言
大家好,今天开始给大家分享 — Dubbo 专题之 Dubbo 只订阅/注册服务。在前一个章节中我们介绍了直连提供者,我们在这个章节会介绍 Dubbo中只订阅服务和只注册服务。那么什么是只订阅和只注册服务呢?顾名思义就是只订阅发布的服务和只注册服务。下面就让我详细了解下吧!
1. 只订阅和注册服务简介
我们在前面的《Dubbo服务注册与发现》章节中学习了当我们对外提供服务时需要向注册中心注册暴露服务的相关元数据信息。而我们的只订阅服务
的含义其实就是Dubbo应用可以从注册中心拉取暴露的服务列表,但是不能注册应用本身相关服务到注册中心去。然而我们的只注册服务
却是相反,只能向注册中心注册本应用暴露的服务不能从注册中心拉取注册的服务列表。如下图:
从图中可以看出在只订阅服务情况下服务A只订阅了注册中心、在只注册服务情况下服务A只注册服务到注册中心。
2. 配置方式
只订阅和注册配置方式分别有两种:
2.1 只订阅服务
<dubbo:registry address="zookeeper://127.0.0.1:2181" register="false" />
或
<dubbo:registry address="zookeeper://127.0.0.1:2181?register=false" />
2.2 只注册服务
<dubbo:registry address="zookeeper://127.0.0.1:2181" subscribe="false" />
或
<dubbo:registry address="zookeeper://127.0.0.1:2181?subscribe=false" />
3. 使用场景
那么这两种方式我们的场景使用场景我们简单介绍两种:
- 我们通常在开发环境和测试环境会共用一个注册中心,那么当我们正常开发的应用需要调用测试环境的服务时我们需要屏蔽掉正常开发的服务被其他测试服务调用。此时我们需要配置当前服务不向注册中心注册服务,但是需要订阅注册中心的服务。
-
当我们在开发 Dubbo 应用时,我们有这样一个场景:我们开发的 Dubbo 服务只暴露服务给调用者调用,而不需要调用其他 Dubbo 服务时我们就可以只注册不订阅服务。
4. 示例演示
同样我们使用获取图书列表例子进行演示,项目结构如下:
下面我们重点关注一下服务提供者配置文件dubbo-provider-xml.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:application name="demo-provider" metadata-type="remote"/>
<!--只订阅-->
<dubbo:registry address="zookeeper://127.0.0.1:2181" register="false" />
<!--只注册-->
<!--<dubbo:registry address="zookeeper://127.0.0.1:2181" subscribe="false" />-->
<bean id="bookFacade" class="com.muke.dubbocourse.serviceconfig.provider.BookFacadeImpl"/>
<!--暴露本地服务为Dubbo服务-->
<dubbo:service interface="com.muke.dubbocourse.common.api.BookFacade" ref="bookFacade" />
</beans>
上面的 XML 配置文件中register="false"
指定只订阅服务而不注册服务,subscribe="false"
指定只注册服务而不订阅服务。
Tips:我们可以通过
ZooInspector
等工具查看在zookeeper
注册中心注册的节点进行结果验证。
5. 原理分析
下面我们简单的看下只订阅服务情况的源码:org.apache.dubbo.registry.integration.
代码如下:
RegistryProtocol#doRefer
private <T> Invoker<T> doRefer(Cluster cluster, Registry registry, Class<T> type, URL url) {
RegistryDirectory<T> directory = new RegistryDirectory<T>(type, url);
directory.setRegistry(registry);
directory.setProtocol(protocol);
// all attributes of REFER_KEY
Map<String, String> parameters = new HashMap<String, String>(directory.getConsumerUrl().getParameters());
URL subscribeUrl = new URL(CONSUMER_PROTOCOL, parameters.remove(REGISTER_IP_KEY), 0, type.getName(), parameters);
//判断是否注册服务
if (directory.shouldRegister()) {
directory.setRegisteredConsumerUrl(subscribeUrl);
//注册服务到注册中心
registry.register(directory.getRegisteredConsumerUrl());
}
directory.buildRouterChain(subscribeUrl);
//订阅服务
directory.subscribe(toSubscribeUrl(subscribeUrl));
...
return registryInvokerWrapper;
}
从上面的中文注释位置可以看到判断shouldRegister
是否为true
,如果我们在 XML 配置register="false"
那么将不会注册用于服务到注册中心。如果 配置register="true"
则服务将会注册到注册中心。这里的shouldRegister
来之我们的配置文件 XML,它的源码如下:org.apache.dubbo.registry.integration.
RegistryDirectory#RegistryDirectory
public RegistryDirectory(Class<T> serviceType, URL url) {
super(url);
if (serviceType == null) {
throw new IllegalArgumentException("service type is null.");
}
//获取我们的register="false"配置
shouldRegister = !ANY_VALUE.equals(url.getServiceInterface()) && url.getParameter(REGISTER_KEY, true);
....
}
从RegistryDirectory
的构造函数中可以知道我们的shouldRegister
是从 URL 获取,而我们的 URL是通过读取配置构建而来的。
6. 小结
在本小节中我们主要学习了 Dubbo 中的只订阅服务和只注册服务两种模式,其中它们分别有2种配置方式。同时我们也知道了在一些特定的场景中使用这两种模式。我们也从源码层面分析了 Dubbo 是怎样去实现只订阅服务的原理过程。
本节课程的重点如下:
1.理解 Dubbo 中只订阅/注册服务模式
2.了解什么场景可以使用2种模式
3.了解了怎样使用2种模式
4.了解其实现原理
作者
个人从事金融行业,就职过易极付、思建科技、某网约车平台等重庆一流技术团队,目前就职于某银行负责统一支付系统建设。自身对金融行业有强烈的爱好。同时也实践大数据、数据存储、自动化集成和部署、分布式微服务、响应式编程、人工智能等领域。同时也热衷于技术分享创立公众号和博客站点对知识体系进行分享。关注公众号:青年IT男 获取最新技术文章推送!
博客地址: http://youngitman.tech
微信公众号:
知识星球: