10.dubbo服務多版本、多分組、分組聚合
阿新 • • 發佈:2019-02-06
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)提供者 提供者配置檔案在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://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>
(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.Mergermy=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();
}
}
}