一、了解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
進入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
將解壓包下所有文件移入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 }
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 }
用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>
加載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 }
啟動完成,可以在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>
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 ); // 顯示調用結果 } }
至此,服務提供者發布成功,服務消費者調用成功,可以在dubbo-admin控制台看到相關信息