Dubbo 直连提供者
前言
1. 直连提供者简介
直连服务提供者意思就是我们可以不使用注册中心获取服务提供者列表,而是通过我们在消费端指定调用特定的服务。这种点对点直连方式,将以服务接口为单位,忽略注册中心的提供者列表。同时我们在消费端配置点对点连接,不会影响其他服务消费端对此服务从注册中心拉去服务的列表。
上图展示了两种方式:第一种是服务消费端从获取到的服务列表中选择调用的服务、第二种直连方式是通过在消费端指定特定服务进行调用,而不是从服务列表中选取服务。
2. Dubbo 直连的方式
Dubbo 中提供3种配置直接的方式:
-
XML 配置
<dubbo:reference id="bookFacade"
interface="com.muke.dubbocourse.common.api.BookFacade" url="dubbo://localhost:20890"> -
JVM 参数
java -Dcom.muke.dubbocourse.common.api.BookFacade=dubbo://localhost:20890
-
映射文件
使用
-Ddubbo.resolve.file
指定映射文件路径。例如:指定dierect.properties
java -Ddubbo.resolve.file=dierect.properties
dierect.properties
文件配置内容:com.muke.dubbocourse.common.api.BookFacade=dubbo://localhost:20890
Tips:此配置优先级高于
<dubbo:reference>
中的配置。
在上面介绍的这3种直连方式中他们的加载是存在优先级,它们的加载顺序:JVM 参数 > 映射文件 > XML 配置。
3. 使用场景
我们上面介绍了什么是直连服务以及3种使用直连服务的方式。那么直连服务到底有哪些使用场景呢?我们下面简单介绍下我们工作中可以使用到的场景:
-
当我们在测试环境时候我们希望直接连接服务提供者进行测试,从而绕开了复杂的注册中心环境切换。
-
假设我们的应用服务提供了一个检查服务存活状态的服务,假设我们部署多台机器我们希望对每一台服务进行存活检查,那么我们需要循环调用所有服务的存活检查接口。
4. 示例演示
下面我们同样以获取图书列表服务为例,代码结构如下:
这里主要介绍 XML 配置方式其他2种方式小伙伴可以自行拓展实验。下面我们主要介绍服务消费端的配置文件dubbo-consumer-xml.xml
:
从上面的 XML 配置文件中可以看出,我们在配置<dubbo:reference>
标签的时候指定url="dubbo://localhost:20890"
。它的意思是指定我们引用的服务所在机器IP、端口、使用协议,而不需要从注册中心获取此接口注册的服务提供者列表中进行选择服务。
5. 原理分析
其实原理非常简单就是通过我们配置的url
参数加上接口名称的组合,封装为 URL 然后创建 Invoker 代理对象。 结合 Dubbo 源码分析:org.apache.dubbo.config.ReferenceConfig#createProxy
private T createProxy(Map<String, String> map) {
if (shouldJvmRefer(map)) {
...
} else {
urls.clear();
//如果我们指定的url不为空
if (url != null && url.length() > 0) {
String[] us = SEMICOLON_SPLIT_PATTERN.split(url);
if (us != null && us.length > 0) {
for (String u : us) {
//dubbo://localhost:20890 转换为 URL
URL url = URL.valueOf(u);
//判断 URL Path是否为空
if (StringUtils.isEmpty(url.getPath())) {
//设置Path 后为:dubbo://localhost:20890/com.muke.dubbocourse.common.api.BookFacade
url = url.setPath(interfaceName);
}
if (UrlUtils.isRegistry(url)) {
urls.add(url.addParameterAndEncoded(REFER_KEY, StringUtils.toQueryString(map)));
} else {
urls.add(ClusterUtils.mergeUrl(url, map));
}
}
}
} else { // assemble URL from register center's configuration
...
}
if (urls.size() == 1) {
//获取调用代理Invoker
invoker = REF_PROTOCOL.refer(interfaceClass, urls.get(0));
} else {
...
}
}
// create service proxy
return (T) PROXY_FACTORY.getProxy(invoker, ProtocolUtils.isGeneric(generic));
}
从上面主要核心源码中文解析可以看出,在我们指定了url
后会被拼接上接口名称(dubbo://localhost:20890/com.muke.dubbocourse.common.api.BookFacade
)来构建 Invoker 代理对象。
6. 小结
在本小节中我们主要学习了 Dubbo 中的直连服务提供者的原理和3种配置方式,分别是 XML 配置、映射文件、JVM 参数配置,这三种配置同时存在优先级。同时我们也学习了直连服务提供者场景的使用场景,可以在特定场景中简化我们的开发和测试。
本节课程的重点如下:
-
理解 Dubbo 中直连服务提供者
-
了解直连服务提供者原理
-
了解直连服务提供者使用方式
-
了解直连服务提供者使用场景
作者
个人从事金融行业,就职过易极付、思建科技、某网约车平台等重庆一流技术团队,目前就职于某银行负责统一支付系统建设。自身对金融行业有强烈的爱好。同时也实践大数据、数据存储、自动化集成和部署、分布式微服务、响应式编程、人工智能等领域。同时也热衷于技术分享创立公众号和博客站点对知识体系进行分享。关注公众号:青年IT男 获取最新技术文章推送!
博客地址:
微信公众号: