Dubbo——基於Zookeeper服務框架搭建及案例演示


一、了解SOA微服務架構

在大規模服務化之前,應用可能只是通過RMI或Hessian等工具,簡單的暴露和引用遠程服務,通過配置服務的URL地址進行調用,通過F5等硬件進行負載均衡。

(1) 當服務越來越多時,服務URL配置管理變得非常困難,F5硬件負載均衡器的單點壓力也越來越大。

此時需要一個服務注冊中心,動態的注冊和發現服務,使服務的位置透明。

並通過在消費方獲取服務提供方地址列表,實現軟負載均衡和Failover,降低對F5硬件負載均衡器的依賴,也能減少部分成本。

(2) 當進一步發展,服務間依賴關系變得錯蹤復雜,甚至分不清哪個應用要在哪個應用之前啟動,架構師都不能完整的描述應用的架構關系。

這時,需要自動畫出應用間的依賴關系圖,以幫助架構師理清理關系。

(3) 接着,服務的調用量越來越大,服務的容量問題就暴露出來,這個服務需要多少機器支撐?什么時候該加機器?

為了解決這些問題,第一步,要將服務現在每天的調用量,響應時間,都統計出來,作為容量規划的參考指標。

其次,要可以動態調整權重,在線上,將某台機器的權重一直加大,並在加大的過程中記錄響應時間的變化,直到響應時間到達閥值,記錄此時的訪問量,再以此訪問量乘以機器數反推總容量。

以上是Dubbo最基本的幾個需求,更多服務治理問題參見:

http://code.alibabatech.com/blog/experience_1402/service-governance-process.html

二、搭建Dubbo服務環境

1)安裝配置啟動Zookeeper:

dubbo框架需要在注冊中心上面注冊服務之后才可以進行調用,所以必須要先安裝注冊中心,一般選用zookeeper來做注冊中心,首先下載zookeeper的安裝包(http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.3.6/),Windows下直接解壓,進入conf文件夾,復制zoo_sample.cfg文件為zoo.cfg文件,修改配置如下:

 1 # The number of milliseconds of each tick
 2 tickTime=2000
 3 # The number of ticks that the initial 
 4 # synchronization phase can take
 5 initLimit=10
 6 # The number of ticks that can pass between 
 7 # sending a request and getting an acknowledgement
 8 syncLimit=5
 9 # the directory where the snapshot is stored.
10 # example sakes.
11 # zk數據存儲位置
12 dataDir=E:\\zookeeper-3.3.6\\data
13 # zk日志存儲位置
14 dataLogDir=E:\\zookeeper-3.3.6\\log
15 # the port at which the clients will connect
16 clientPort=2181
zoo.xfg

進入bin目錄,運行zkServer.cmd啟動Zookeeper服務。

2)配置啟動dubbo-admin:

配置一個獨立的tomcat准備作為dubbo-admin啟動的容器,下載dubbo-admin的war包(http://download.csdn.net/detail/liweifengwf/7784901),發布到tomcat中,打開解壓包中/WEB-INF/dubbo.properties文件,配置如下:

1 dubbo.registry.address=zookeeper://127.0.0.1:2181
2 dubbo.admin.root.password=root
3 dubbo.admin.guest.password=root
dubbo.properties

將解壓包下所有文件移入ROOT目錄下,啟動tomcat可直接訪問,無需帶上下文uri,至此,dubbo服務所需環境以及dubbo服務治理控制台已搭建完畢

三、Dubbo服務的開發、發布與調用

服務提供者

1)定義服務接口: (該接口需單獨打包,在服務提供方和消費方共享)

新建一個maven工程,並創建一個服務接口(結構及代碼如下),mvn clean install運行打包到本地倉庫

1 package com.alibaba.dubbo.demo;
2  
3 public interface DemoService {
4  
5     String sayHello(String name);
6  
7 }
DemoService.java

2)在服務提供方實現接口:(對服務消費方隱藏實現)

接下來創建 dubbo-provider 工程,在pom.xml里面引用剛才的服務接口的jar包,編寫服務實現類

 1 package com.alibaba.dubbo.demo.provider;
 2  
 3 import com.alibaba.dubbo.demo.DemoService;
 4  
 5 public class DemoServiceImpl implements DemoService {
 6  
 7     public String sayHello(String name) {
 8         return "Hello " + name;
 9     }
10  
11 }
DemoServiceImpl.java

用Spring配置聲明暴露服務:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
 6  
 7     <!-- 提供方應用信息,用於計算依賴關系 -->
 8     <dubbo:application name="hello-world-app"  />
 9  
10     <!-- 使用multicast廣播注冊中心暴露服務地址 -->
11     <dubbo:registry address="multicast://224.5.6.7:1234" />
12  
13     <!-- 用dubbo協議在20880端口暴露服務 -->
14     <dubbo:protocol name="dubbo" port="20880" />
15  
16     <!-- 聲明需要暴露的服務接口 -->
17     <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" />
18  
19     <!-- 和本地bean一樣實現服務 -->
20     <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" />
21  
22 </beans>
provider.xml

加載Spring配置,啟動提供者服務:

 1 import org.springframework.context.support.ClassPathXmlApplicationContext;
 2  
 3 public class Provider {
 4  
 5     public static void main(String[] args) throws Exception {
 6         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"http://10.20.160.198/wiki/display/dubbo/provider.xml"});
 7         context.start();
 8  
 9         System.in.read(); // 按任意鍵退出
10     }
11  
12 }
Provider.java

啟動完成,可以在dubbo控制台看到已經暴露的提供者服務

服務消費者

 1)創建一個新maven工程dobbo-consumer,在pom.xml里面引用剛才的服務接口的jar包

 2)通過Spring配置引用遠程服務:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
 6  
 7     <!-- 消費方應用名,用於計算依賴關系,不是匹配條件,不要與提供方一樣 -->
 8     <dubbo:application name="consumer-of-helloworld-app"  />
 9  
10     <!-- 使用multicast廣播注冊中心暴露發現服務地址 -->
11     <dubbo:registry address="multicast://224.5.6.7:1234" />
12  
13     <!-- 生成遠程服務代理,可以和本地bean一樣使用demoService -->
14     <dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" />
15  
16 </beans>
consumer.xml

3)加載Spring配置,並調用遠程服務:(也可以使用IoC注入)

import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.alibaba.dubbo.demo.DemoService;
 
public class Consumer {
 
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"http://10.20.160.198/wiki/display/dubbo/consumer.xml"});
        context.start();
 
        DemoService demoService = (DemoService)context.getBean("demoService"); // 獲取遠程服務代理
        String hello = demoService.sayHello("world"); // 執行遠程方法
 
        System.out.println( hello ); // 顯示調用結果
    }
 
}
Consumer.java

 

至此,服務提供者發布成功,服務消費者調用成功,可以在dubbo-admin控制台看到相關信息

 

 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM