10.dubbo服务多版本、多分组、分组聚合

来源:互联网 发布:mysql 前后空格为什么 编辑:程序博客网 时间:2024/06/01 09:24

1.多版本

当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。

可以按照以下的步骤进行版本迁移:

  1. 在低压力时间段,先升级一半提供者为新版本
  1. 再将所有消费者升级为新版本
  1. 然后将剩下的一半提供者升级为新版本

提供者和消费者在调动与被调用之间指定相同的版本号

(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://code.alibabatech.com/schema/dubbo"      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd      http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">          <dubbo:application name="d_zk_provider_app" />          <dubbo:registry  address="zookeeper://192.168.88.131:2181" />     <dubbo:protocol  name="dubbo" port="20880" />   <!-- 暴露老版本 -->    <dubbo:service interface="com.tyf.d_zk_provider.modelService"             ref="modelService1"            version="1.0.0"            /> <!-- 老版本实现 -->       <bean id="modelService1" class="com.tyf.d_zk_provider.modelServiceImpl"  />         <!-- 暴露新版本 -->    <dubbo:service interface="com.tyf.d_zk_provider.modelService"             ref="modelService2"            version="2.0.0"            /> <!-- 新版本实现 -->       <bean id="modelService2" class="com.tyf.d_zk_provider.modelServiceImpl"  />         <!-- 两个版本之间暴露的接口是一样的 --></beans> 

查看dubbo-admin可以看到注册了两个服务实例只是版本号不同



(2)消费者

只需要修改引用的接口版本号就可以调用同一个接口的不同版本

<?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://code.alibabatech.com/schema/dubbo"      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd      http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">                   <dubbo:application name="d_zk_consumer_app"  />         <!-- 定义多个注册中心id区分 -->    <dubbo:registry id="zk1" address="zookeeper://192.168.88.131:2181" />           <!-- 修改version就可以调用同一接口的不同版本 -->    <dubbo:reference id="modelService" interface="com.tyf.d_zk_provider.modelService"  version="2.0.0"/>    </beans>

2.多分组

和多版本类似。同一个接口有多种实现的时候可以设置不同的分组分别将他们暴露。消费者在引用时可以指定不同的分组
(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://code.alibabatech.com/schema/dubbo"      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd      http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">          <dubbo:application name="d_zk_provider_app" />          <dubbo:registry  address="zookeeper://192.168.88.131:2181" />     <dubbo:protocol  name="dubbo" port="20880" />   <!-- 分组1 -->    <dubbo:service interface="com.tyf.d_zk_provider.modelService"             ref="modelService1"            group="gro_1"            />    <!-- 分组2 -->    <dubbo:service interface="com.tyf.d_zk_provider.modelService"             ref="modelService2"            group="gro_2"            />      <!-- 实现1 -->    <bean id="modelService1" class="com.tyf.d_zk_provider.modelServiceImpl"  />    <!-- 实现2 -->    <bean id="modelService2" class="com.tyf.d_zk_provider.modelServiceImpl"  />          <!-- 两个分组之间暴露的接口是一样的 --></beans> 
在dubbo中也是注册成两个服务来实现的

(2)消费者
消费者在引用的时候指定分组可以获取到同一接口的不同实现。消费者配置文件
<?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://code.alibabatech.com/schema/dubbo"      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd      http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">                   <dubbo:application name="d_zk_consumer_app"  />         <!-- 定义多个注册中心id区分 -->    <dubbo:registry id="zk1" address="zookeeper://192.168.88.131:2181" />           <!-- 将同一接口注入成不同的实现 -->    <dubbo:reference id="modelService" interface="com.tyf.d_zk_provider.modelService"  group="gro_1"/>        <dubbo:reference id="modelService" interface="com.tyf.d_zk_provider.modelService"  group="gro_2" />    </beans> 


3.分组聚合

就是消费者可以调用整个group或者其中的几个。将他们分别调用一次,最后返回一个结果
(1)提供者
提供者配置文件同上同一个接口有gro_1和gro_2两种实现
(2)消费者
分组结果要用一个Merger实现来来接收
package com.tyf.d_zk_consumer;import com.alibaba.dubbo.rpc.cluster.Merger;public class myMerger implements Merger<String> {//将每个group都调用一次,结果存到arg数组里面,数组每个参数类型就是提供者接口的返回类型public String merge(String... arg) {for(int  i=0;i<arg.length;i++){System.out.println(arg[i]);}return null;}}
将这个类与配置文件绑定,创建一个文本文件
/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.Merger
my=com.tyf.d_zk_consumer.myMerger
这里my是一个name将它配置到消费者配置文件中,完整配置文件如下
<?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://code.alibabatech.com/schema/dubbo"      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd      http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">                   <dubbo:application name="d_zk_consumer_app"  />        <dubbo:registry id="zk1" address="zookeeper://192.168.88.131:2181" />           <!-- 调用同一接口的所有实现,*指定调用所有group。也可以调用其中某几个用逗号隔开 -->    <dubbo:reference id="modelService" interface="com.tyf.d_zk_provider.modelService"  group="*" merger="true">         <dubbo:method name="serviceTest" merger="my" />    </dubbo:reference>    </beans> 
启动类
package com.tyf.d_zk_consumer;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.tyf.d_zk_provider.modelService;public class d_zk_consumer_App {    public static void main(String[] args) {         try {           ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(           new String[] {"/META-INF/d_zk_consumer.xml"}           );             context.start();       // 获取远程服务代理            modelService service = (modelService)context.getBean("modelService");            // 调用远程服务,获取调用结果           service1.serviceTest();           } catch (Exception e) {e.printStackTrace();}    } }