1. 程式人生 > >10.dubbo服務多版本、多分組、分組聚合

10.dubbo服務多版本、多分組、分組聚合

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();
	}
    } 
}