写点什么

Dubbo 直连提供者

用户头像
青年IT男
关注
发布于: 2021 年 04 月 25 日
Dubbo 直连提供者

前言

大家好,今天开始给大家分享 — Dubbo 专题之 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 种使用直连服务的方式。那么直连服务到底有哪些使用场景呢?我们下面简单介绍下我们工作中可以使用到的场景:


  1. 当我们在测试环境时候我们希望直接连接服务提供者进行测试,从而绕开了复杂的注册中心环境切换。

  2. 假设我们的应用服务提供了一个检查服务存活状态的服务,假设我们部署多台机器我们希望对每一台服务进行存活检查,那么我们需要循环调用所有服务的存活检查接口。

4. 示例演示

下面我们同样以获取图书列表服务为例,代码结构如下:



这里主要介绍 XML 配置方式其他 2 种方式小伙伴可以自行拓展实验。下面我们主要介绍服务消费端的配置文件dubbo-consumer-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-consumer" logger="log4j"/>
<!--url直接指定服务提供者所做机器以及端口--> <dubbo:reference id="bookFacade" interface="com.muke.dubbocourse.common.api.BookFacade" url="dubbo://localhost:20890">
</dubbo:reference>
</beans>
复制代码


从上面的 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 参数配置,这三种配置同时存在优先级。同时我们也学习了直连服务提供者场景的使用场景,可以在特定场景中简化我们的开发和测试。


本节课程的重点如下:


  1. 理解 Dubbo 中直连服务提供者

  2. 了解直连服务提供者原理

  3. 了解直连服务提供者使用方式

  4. 了解直连服务提供者使用场景

作者

个人从事金融行业,就职过易极付、思建科技、某网约车平台等重庆一流技术团队,目前就职于某银行负责统一支付系统建设。自身对金融行业有强烈的爱好。同时也实践大数据、数据存储、自动化集成和部署、分布式微服务、响应式编程、人工智能等领域。同时也热衷于技术分享创立公众号和博客站点对知识体系进行分享。关注公众号:青年 IT 男 获取最新技术文章推送!


博客地址: http://youngitman.tech

微信公众号:



知识星球:


发布于: 2021 年 04 月 25 日阅读数: 18
用户头像

青年IT男

关注

站在巨人肩上看得更远! 2018.04.25 加入

从事金融行业,就职过易极付、思建科技、网约车平台等一流技术团队,目前就职于银行负责支付系统建设。对金融行业有强烈的爱好。实践大数据、数据存储、自动化集成和部署、分布式微服务、响应式编程、人工智能等领域

评论

发布
暂无评论
Dubbo 直连提供者