1. 概述
1.1 dubbo要解决的需求
在大规模服务化之前,应用可能只是通过 RMI 或 Hessian 等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过 F5 等硬件进行负载均衡。
当服务越来越多时,服务 URL 配置管理变得非常困难
,F5 硬件负载均衡器的单点压力也越来越大。 此时需要一个服务注册中心,动态地注册和发现服务,使服务的位置透明。并通过在消费方获取服务提供方地址列表,实现软负载均衡和 Failover
,降低对 F5 硬件负载均衡器的依赖,也能减少部分成本。
当进一步发展,服务间依赖关系变得错踪复杂,甚至
分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系
。 这时,需要自动画出应用间的依赖关系图,以帮助架构师理清关系
。
接着,服务的调用量越来越大,服务的容量问题就暴露出来,
这个服务需要多少机器支撑?什么时候该加机器
? 为了解决这些问题,第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。其次,要可以动态调整权重,在线上,将某台机器的权重一直加大,并在加大的过程中记录响应时间的变化,直到响应时间到达阈值,记录此时的访问量,再以此访问量乘以机器数反推总容量
。
1.2 架构
节点 角色说明
Provider | 暴露服务的服务提供方 |
---|---|
Consumer | 调用远程服务的服务消费方 |
Registry | 服务注册与发现的注册中心 |
Monitor | 统计服务的调用次数和调用时间的监控中心 |
Container | 服务运行容器 |
调用关系说明
服务容器
负责启动,加载,运行服务提供者。
服务提供者
在启动时,向注册中心注册
自己提供的服务。
服务消费者
在启动时,向注册中心订阅
自己所需的服务。
注册中心
返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者
,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
服务消费者和提供者
,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
Dubbo 架构具有以下几个特点,分别是连通性、健壮性、伸缩性、以及向未来架构的升级性。
连通性
注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小
监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示
服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销
服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销
注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外
注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者
注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表
注册中心和监控中心都是可选的,服务消费者可以直连服务提供者
健壮性
监控中心宕掉不影响使用,只是丢失部分采样数据
数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
注册中心对等集群,任意一台宕掉后,将自动切换到另一台
注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
服务提供者无状态,任意一台宕掉后,不影响使用
服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复
伸缩性
伸缩性
注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心
服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者
2. dubbo配置
2.1 XML 配置
2.2 动态配置中心
配置中心(v2.7.0)在 Dubbo 中承担两个职责:
1.外部化配置。启动配置的集中式存储 ,如zookerper,nacos(简单理解为 dubbo.properties 的外部化存储)。
2.服务治理。服务治理规则的存储与通知。
XML配置
<dubbo:config-center address="zookeeper://127.0.0.1:2181"/>
或者properties配置
dubbo.config-center.address=zookeeper://127.0.0.1:2181
或者Java显式配置
ConfigCenterConfig configCenter = new ConfigCenterConfig();
configCenter.setAddress("zookeeper://127.0.0.1:2181");
为了兼容 2.6.x 版本配置,在使用 Zookeeper 作为注册中心,且没有显示配置配置中心的情况下,Dubbo 框架会默认将此 Zookeeper 用作配置中心,但将只作服务治理用途。
动态配置类详解
dubbo:config-center 配置
配置中心。对应的配置类:org.apache.dubbo.config.ConfigCenterConfig
属性 | 对应URL参数 | 类型 | 是否必填 | 缺省值 | 描述 | 兼容性 |
---|---|---|---|---|---|---|
protocol | config.protocol | string | 可选 | zookeeper | 使用哪个配置中心:apollo、zookeeper、nacos等。 以zookeeper为例 1. 指定protocol,则address可以简化为127.0.0.1:2181 ; 2. 不指定protocol,则address取值为zookeeper://127.0.0.1:2181 | 2.7.0+ |
address | config.address | string | 必填 | 配置中心地址。 取值参见protocol说明 | 2.7.0+ | |
highest-priority | config.highestPriority | boolean | 可选 | true | 来自配置中心的配置项具有最高优先级,即会覆盖本地配置项。 | 2.7.0+ |
namespace | config.namespace | string | 可选 | dubbo | 通常用于多租户隔离,实际含义视具体配置中心而不同。 如: zookeeper - 环境隔离,默认值dubbo ; apollo - 区分不同领域的配置集合,默认使用dubbo 和application | 2.7.0+ |
cluster | config.cluster | string | 可选 | 含义视所选定的配置中心而不同。 如Apollo中用来区分不同的配置集群 | 2.7.0+ | |
group | config.group | string | 可选 | dubbo | 含义视所选定的配置中心而不同。 nacos - 隔离不同配置集 zookeeper - 隔离不同配置集 | 2.7.0+ |
check | config.check | boolean | 可选 | true | 当配置中心连接失败时,是否终止应用启动。 | 2.7.0+ |
config-file | config.configFile | string | 可选 | dubbo.properties | 全局级配置文件所映射到的key zookeeper - 默认路径/dubbo/config/dubbo/dubbo.properties apollo - dubbo namespace中的dubbo.properties键 | 2.7.0+ |
timeout | config.timeout | integer | 3000ms | 获取配置的超时时间 | 2.7.0+ | |
username | string | 如果配置中心需要做校验,用户名 Apollo暂未启用 | 2.7.0+ | |||
password | string | 如果配置中心需要做校验,密码 Apollo暂未启用 | 2.7.0+ | |||
parameters | Map<string, string> | 扩展参数,用来支持不同配置中心的定制化配置参数 | 2.7.0+ | |||
include-spring-env | boolean | 可选 | false | 使用Spring框架时支持,为true时,会自动从Spring Environment中读取配置。 默认依次读取 key为dubbo.properties的配置 key为dubbo.properties的PropertySource | 2.7.0+ |
2.1.1 外部化配置
外部化配置目的之一是
实现配置的集中式管理
,这部分业界已经有很多成熟的专业配置系统如 Apollo, Nacos 等,Dubbo 所做的主要是保证能配合这些系统正常工作。
外部化配置和其他本地配置在内容和格式上并无区别,可以简单理解为 dubbo.properties 的外部化存储,配置中心更适合将一些公共配置如注册中心、元数据中心配置等抽取以便做集中管理。
# 将注册中心地址、元数据中心地址等配置集中管理,可以做到统一环境、减少开发侧感知。
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.registry.simplified=true
dubbo.metadata-report.address=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.application.qos.port=33333
优先级
外部化配置默认较本地配置有更高的优先级,因此这里配置的内容会覆盖本地配置值
作用域
外部化配置有
全局
和应用
两个级别,全局配置是所有应用共享的,应用级配置是由每个应用自己维护且只对自身可见的。当前已支持的扩展实现有Zookeeper、Apollo。
Zookeeper
<dubbo:config-center address="zookeeper://127.0.0.1:2181"/>
默认所有的配置都存储在 /dubbo/config 节点,具体节点结构图如下:
namespace
,用于不同配置的环境隔离。
config
,Dubbo约定的固定节点,不可更改,所有配置和服务治理规则都存储在此节点下。
dubbo/application
,分别用来隔离全局配置、应用级别配置:dubbo是默认group值,application对应应用名
dubbo.properties
,此节点的node value存储具体配置内容
Apollo
<dubbo:config-center protocol="apollo" address="127.0.0.1:2181"/>
Apollo中的一个核心概念是命名空间 - namespace(和上面zookeeper的namespace概念不同),在这里全局和应用级别配置就是通过命名空间来区分的。
默认情况下,Dubbo会从名叫dubbo(由于 Apollo 不支持特殊后缀 .properties )的命名空间中读取全局配置(<dubbo:config-center namespace=“your namespace”>)
由于 Apollo 也默认将会在 dubbo namespace 中存储服务治理规则(如路由规则),建议通过单独配置 group 将服务治理和配置文件托管分离开,以 XML 配置方式为例:
<dubbo namespace="governance" group ="dubbo"/>
这里,服务治理规则将存储在 governance namespace,而配置文件将存储在 dubbo namespace,如下图所示:
关于文件配置托管,相当于是把 dubbo.properties 配置文件的内容存储在了 Apollo 中,应用通过关联共享的 dubbo namespace 继承公共配置, 应用也可以按照 Apollo 的做法来覆盖个别配置项。
自己加载外部化配置
理论上只要 Dubbo 框架能拿到需要的配置就可以正常的启动,它并不关心这些配置是自己加载到的还是应用直接塞给它的,所以Dubbo还提供了以下API,让用户将自己组织好的配置塞给 Dubbo 框架(配置加载的过程是用户要完成的),这样 Dubbo 框架就不再直接和 Apollo 或 Zookeeper 做读取配置交互。
// 应用自行加载配置
Map<String, String> dubboConfigurations = new HashMap<>();
dubboConfigurations.put("dubbo.registry.address", "zookeeper://127.0.0.1:2181");
dubboConfigurations.put("dubbo.registry.simplified", "true");
//将组织好的配置塞给Dubbo框架
ConfigCenterConfig configCenter = new ConfigCenterConfig();
configCenter.setExternalConfig(dubboConfigurations);
2.1.2 服务治理
Zookeeper
默认节点结构:
namespace
,用于不同配置的环境隔离。
config
,Dubbo 约定的固定节点,不可更改,所有配置和服务治理规则都存储在此节点下。
dubbo
,所有服务治理规则都是全局性的,dubbo 为默认节点
configurators/tag-router/condition-route
r,不同的服务治理规则类型,node value 存储具体规则内容
Apollo
所有的服务治理规则都是全局性的
,默认从公共命名空间 dubbo 读取和订阅
:
不同的规则以不同的 key 后缀区分:
configurators
,覆盖规则
tag-router
,标签路由
condition-router
,条件路由
2.3 属性 配置
如果你的应用足够简单,例如,不需要多注册中心或多协议,并且需要在spring容器中共享配置,那么,我们可以直接使用 dubbo.properties 作为默认配置。
Dubbo 可以自动加载 classpath 根目录下的 dubbo.properties,但是你同样可以使用 JVM 参数来指定路径:-Ddubbo.properties.file=xxx.properties。
官方文档
2.4 自动加载环境变量
2.5 API 配置
API 属性与配置项一对一,各属性含义,请参见:配置参考手册,比如:ApplicationConfig.setName(“xxx”) 对应 <dubbo:application name=“xxx” />
官方文档
2.6 注解配置
2.7 配置加载流程
应用启动阶段,Dubbo框架如何将所需要的配置采集起来(包括应用配置、注册中心配置、服务配置等),以完成服务的暴露和引用流程。
首先,从Dubbo支持的配置来源说起,默认有四种配置来源:
JVM System Properties
,-D 参数
Externalized Configuration
,外部化配置
ServiceConfig、ReferenceConfig
等编程接口采集的配置
本地配置文件
dubbo.properties
覆盖关系
下图展示了配置覆盖关系的优先级,从上到下优先级依次降低
:
2.8 启动时检查
在启动时检查依赖的服务是否可用, 官方文档:
2.9 多协议
在 Dubbbo 中配置多协议
Dubbo 允许配置多协议,
在不同服务上支持不同协议
或者同一服务上同时支持多种协议
。
不同服务不同协议
不同服务在性能上适用不同协议进行传输,比如
大数据用短连接协议
,小数据大并发用长连接协议
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
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="world" />
<dubbo:registry id="registry" address="10.20.141.150:9090" username="admin" password="hello1234" />
<!-- 多协议配置 -->
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:protocol name="rmi" port="1099" />
<!-- 使用dubbo协议暴露服务 -->
<dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" protocol="dubbo" />
<!-- 使用rmi协议暴露服务 -->
<dubbo:service interface="com.alibaba.hello.api.DemoService" version="1.0.0" ref="demoService" protocol="rmi" />
</beans>
多协议暴露服务
需要与 http 客户端相互操作
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
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="world" />
<dubbo:registry id="registry" address="10.20.141.150:9090" username="admin" password="hello1234" />
<!-- 多协议配置 -->
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:protocol name="hessian" port="8080" />
<!-- 使用多个协议暴露服务 -->
<dubbo:service id="helloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" protocol="dubbo,hessian" />
</beans>
协议参考手册
常用的是前两个协议
3. 参考手册
https://dubbo.apache.org/zh/docs/v2.7/user/references/
4. REST支持
4.1 概述
dubbo支持多种远程调用方式
,例如dubbo RPC(二进制序列化 + tcp协议)、http invoker(二进制序列化 + http协议,至少在开源版本没发现对文本序列化的支持)、hessian(二进制序列化 + http协议)、WebServices (文本序列化 + http协议)等等,但缺乏对当今特别流行的REST风格远程调用(文本序列化 + http协议)的支持
。
有鉴于此
,我们基于标准的Java REST API——JAX-RS 2.0
(Java API for RESTful Web Services的简写),为dubbo提供了接近透明的REST调用支持
。由于完全兼容Java标准API,所以为dubbo开发的所有REST服务,未来脱离dubbo或者任何特定的REST底层实现一般也可以正常运行。
4.2 快速入门
在dubbo中开发一个REST风格的服务会比较简单,下面以一个注册用户的简单服务为例说明。
这个服务要实现的功能是提供如下URL(注:这个URL不是完全符合REST的风格,但是更简单实用):
http://localhost:8080/users/register
而任何客户端都可以将包含用户信息的JSON字符串POST到以上URL来完成用户注册。
首先,开发服务的接口
:
public interface UserService {
void registerUser(User user);
}
然后,开发服务的实现
:
@Path("users")
public class UserServiceImpl implements UserService {
@POST
@Path("register")
@Consumes({MediaType.APPLICATION_JSON})
public void registerUser(User user) {
// save the user...
}
}
上面的服务实现代码非常简单,但是
由于REST服务是要被发布到特定HTTP URL,供任意语言客户端甚至浏览器来访问,所以这里要额外添加了几个JAX-RS的标准annotation来做相关的配置
:
@Path(“users”)
:指定访问UserService的URL相对路径
是/users,即http://localhost:8080/users
@Path(“register”)
:指定访问registerUser()方法的URL相对路径
是/register,再结合上一个@Path为UserService指定的路径,则调用UserService.register()的完整路径为http://localhost:8080/users/register
@POST
:指定访问registerUser()用HTTP POST方法
@Consumes({MediaType.APPLICATION_JSON})
:指定registerUser()接收JSON格式的数据
。REST框架会自动将JSON数据反序列化为User对象
最后,在spring配置文件中添加此服务,即完成所有服务开发工作:
<!-- 用rest协议在8080端口暴露服务 -->
<dubbo:protocol name="rest" port="8080"/>
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="xxx.UserService" ref="userService"/>
<!-- 和本地bean一样实现服务 -->
<bean id="userService" class="xxx.UserServiceImpl" />
GET的例子参考:官方文档
4.3 配置REST Server的实现
目前在dubbo中,我们支持5种嵌入式rest server的实现,并同时支持采用外部应用服务器来做rest server的实现。
rest server的实现是通过如下server这个XML属性来选择的
:
<dubbo:protocol name="rest" server="jetty"/>
以上配置选用了嵌入式的jetty来做rest server,同时,
如果不配置server属性,rest协议默认也是选用jetty
。jetty是非常成熟的java servlet容器,并和dubbo已经有较好的集成(目前5种嵌入式server中只有jetty和后面所述的tomcat、tjws,与dubbo监控系统等完成了无缝的集成),所以,如果你的dubbo系统是单独启动的进程,你可以直接默认采用jetty即可。
<dubbo:protocol name="rest" server="tomcat"/>
在嵌入式tomcat上,REST的性能比jetty上要好得多(参见后面的基准测试),
建议在需要高性能的场景下采用tomcat
。
如果你的dubbo系统不是单独启动的进程,而是部署到了Java应用服务器中,则建议你采用以下配置
:
<dubbo:protocol name="rest" server="servlet"/>
通过将server设置为servlet,dubbo将采用外部应用服务器的servlet容器来做rest server。同时,
还要在dubbo系统的web.xml中添加如下配置
:
<web-app>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/META-INF/spring/dubbo-demo-provider.xml</param-value>
</context-param>
<listener>
<listener-class>org.apache.dubbo.remoting.http.servlet.BootstrapListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.apache.dubbo.remoting.http.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
即
必须将dubbo的BootstrapListener和DispatherServlet添加到web.xml,以完成dubbo的REST功能与外部servlet容器的集成
。
注意:如果你是用spring的ContextLoaderListener来加载spring,则必须保证BootstrapListener配置在ContextLoaderListener之前,否则dubbo初始化会出错。
5. 灵活的注册服务
Dubbo
支持同一服务向多注册中心同时注册
,或者不同服务分别注册到不同的注册中心上去
,甚至可以同时引用注册在不同注册中心上的同名服务。
5.1 服务向多个注册中心注册
比如:中文站有些服务来不及在青岛部署,只在杭州部署,而青岛的其它应用需要引用此服务,就可以将服务同时注册到两个注册中心。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
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="world" />
<!-- 多注册中心配置 -->
<dubbo:registry id="hangzhouRegistry" address="10.20.141.150:9090" />
<dubbo:registry id="qingdaoRegistry" address="10.20.141.151:9010" default="false" />
<!-- 向多个注册中心注册 -->
<dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" registry="hangzhouRegistry,qingdaoRegistry" />
</beans>
5.2 不同服务使用不同注册中心
比如:CRM 有些服务是专门为国际站设计的,有些服务是专门为中文站设计的。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
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="world" />
<!-- 多注册中心配置 -->
<dubbo:registry id="chinaRegistry" address="10.20.141.150:9090" />
<dubbo:registry id="intlRegistry" address="10.20.154.177:9010" default="false" />
<!-- 向中文站注册中心注册 -->
<dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" registry="chinaRegistry" />
<!-- 向国际站注册中心注册 -->
<dubbo:service interface="com.alibaba.hello.api.DemoService" version="1.0.0" ref="demoService" registry="intlRegistry" />
</beans>
5.3 引用多个注册中心的服务
比如:CRM 需同时调用中文站和国际站的 PC2 服务,PC2 在中文站和国际站均有部署,接口及版本号都一样,但连的数据库不一样。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
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="world" />
<!-- 多注册中心配置 -->
<dubbo:registry id="chinaRegistry" address="10.20.141.150:9090" />
<dubbo:registry id="intlRegistry" address="10.20.154.177:9010" default="false" />
<!-- 引用中文站服务 -->
<dubbo:reference id="chinaHelloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" registry="chinaRegistry" />
<!-- 引用国际站站服务 -->
<dubbo:reference id="intlHelloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" registry="intlRegistry" />
</beans>
如果只是测试环境临时需要连接两个不同注册中心,使用竖号分隔多个不同注册中心地址:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
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="world" />
<!-- 多注册中心配置,竖号分隔表示同时连接多个不同注册中心,同一注册中心的多个集群地址用逗号分隔 -->
<dubbo:registry address="10.20.141.150:9090|10.20.154.177:9010" />
<!-- 引用服务 -->
<dubbo:reference id="helloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" />
</beans>
6. 服务分组
使用服务分组区分服务接口的不同实现
当一个接口有多种实现时,可以用 group 区分。
7. 多版本
在 Dubbo 中可以为同一个服务配置多个版本
当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。
可以按照以下的步骤进行版本迁移:
1、在低压力时间段,先升级一半提供者为新版本
2、再将所有消费者升级为新版本
3、然后将剩下的一半提供者升级为新版本
老版本服务提供者配置:
<dubbo:service interface="com.foo.BarService" version="1.0.0" />
新版本服务提供者配置:
<dubbo:service interface="com.foo.BarService" version="2.0.0" />
老版本服务消费者配置:
<dubbo:reference id="barService" interface="com.foo.BarService" version="1.0.0" />
新版本服务消费者配置:
<dubbo:reference id="barService" interface="com.foo.BarService" version="2.0.0" />
如果不需要区分版本,可以按照以下的方式配置
提示
2.2.0 以上版本支持
<dubbo:reference id="barService" interface="com.foo.BarService" version="*" />