【Dubbo實戰】 Dubbo+Zookeeper+Spring整合應用篇
Dubbo與Zookeeper、Spring整合使用
Dubbo采用全Spring配置方式,透明化接入應用,對應用沒有任何API侵入,只需用Spring加載Dubbo的配置即可,Dubbo基于Spring的Schema擴展進行加載。
一:單機模式安裝zookeeper
1,下載zookeeper注冊中心,下載地址:http://www.apache.org/dyn/closer.cgi/zookeeper/ 下載后解壓即可,進入E:\zookeeper-3.3.6\zookeeper-3.3.6\bin,
雙擊zkServer.cmd啟動注冊中心服務。
zkServer.sh【Linux】或zkServer.cmd【Windows】
2,在你執行啟動腳本之前,還有幾個基本的配置項需要配置一下,Zookeeper的配置文件在 conf 目錄下,這個目錄下有 zoo_sample.cfg 和 log4j.properties,你需要做的就是將zoo_sample.cfg 改名為 zoo.cfg,因為 Zookeeper在啟動時會找這個文件作為默認配置文件。下面詳細介紹一下,這個配置文件中各個配置項的意義。

?tickTime:這個時間是作為Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳。
?dataDir:顧名思義就是 Zookeeper保存數據的目錄,默認情況下,Zookeeper 將寫數據的日志文件也保存在這個目錄里。
?dataLogDir:顧名思義就是Zookeeper 保存日志文件的目錄
?clientPort:這個端口就是客戶端連接Zookeeper 服務器的端口,Zookeeper 會監聽這個端口,接受客戶端的訪問請求
配置好后,zookeeper會監聽本機的2181端口。
當這些配置項配置好后,你現在就可以啟動 Zookeeper 了,啟動后要檢查 Zookeeper 是否已經在服務,可以通過 netstat – ano 命令查看是否有你配置的 clientPort 端口號在監聽服務。
二:服務提供者
定義服務接口:(該接口需單獨打包,在服務提供方和消費方共享)
package com.unj.dubbotest.provider;
import java.util.List;
public interface DemoService {
String sayHello(String name);
public List getUsers();
}
在服務提供方實現接口:(對服務消費方隱藏實現)
package com.unj.dubbotest.provider.impl;
import java.util.ArrayList;
import java.util.List;
import com.unj.dubbotest.provider.DemoService;
public class DemoServiceImpl implements DemoService {
public String sayHello(String name) {
return "Hello " + name;
}
public List getUsers() {
List list = new ArrayList();
User u1 = new User();
u1.setName("hejingyuan");
u1.setAge(20);
u1.setSex("f");
User u2 = new User();
u2.setName("xvshu");
u2.setAge(21);
u2.setSex("m");
list.add(u1);
list.add(u2);
return list;
}
}用Spring配置聲明暴露服務:
<?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.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
">
<!-- 具體的實現bean -->
<bean id="demoService" class="com.unj.dubbotest.provider.impl.DemoServiceImpl" />
<!-- 提供方應用信息,用于計算依賴關系 -->
<dubbo:application name="xs_provider" />
<!-- 使用multicast廣播注冊中心暴露服務地址 -->
<!--<dubbo:registry address="multicast://224.5.6.7:1234" /> -->
<!-- 使用zookeeper注冊中心暴露服務地址 --即zookeeper的所在服務器ip地址和端口號 -->
<dubbo:registry address="zookeeper://192.168.24.213:2181" />
<!-- 用dubbo協議在20880端口暴露服務 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 聲明需要暴露的服務接口 -->
<dubbo:service interface="com.unj.dubbotest.provider.DemoService"
ref="demoService" />
</beans>加載Spring配置,啟動服務(或者將項目建為web項目,然后在web.xml中配置好spring的啟動,然后扔到tomcat中即可提供服務):
package com.unj.dubbotest.provider.impl;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Provider {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "applicationContext.xml" });
context.start();
System.in.read(); // 為保證服務一直開著,利用輸入流的阻塞來模擬
}
}三:服務消費者
通過Spring配置引用遠程服務:
<?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.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
">
<!-- 消費方應用名,用于計算依賴關系,不是匹配條件,不要與提供方一樣 -->
<dubbo:application name="hjy_consumer" />
<!-- 使用zookeeper注冊中心暴露服務地址 -->
<!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->
<dubbo:registry address="zookeeper://192.168.24.213:2181" />
<!-- 生成遠程服務代理,可以像使用本地bean一樣使用demoService -->
<dubbo:reference id="demoService"
interface="com.unj.dubbotest.provider.DemoService" />
</beans>調用服務測試:
package com.alibaba.dubbo.demo.pp;
import java.util.List;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.unj.dubbotest.provider.DemoService;
public class Consumer {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "applicationContext.xml" });
context.start();
DemoService demoService = (DemoService) context.getBean("demoService");
String hello = demoService.sayHello("hejingyuan");
System.out.println(hello);
List list = demoService.getUsers();
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
System.in.read();
}
}測試結果:

附:Dubbo的管理頁面
需要下載:dubbo-admin-2.5.3的war包
下載地址:http://download.csdn.net/detail/u013286716/7041185
操作如下:
1,替換掉tomcat/webapps下自帶的ROOT文件夾內容(即替換tomcat的啟動主頁),將下載的war包解壓到webapps/ROOT中,直接替換即可
注意:jdk不要使用1.8,本次實驗使用的為1.6
2,啟動tomcat,訪問ip:8080即可或者如果是本地的話使用localhost:8080
輸入用戶名密碼,在E:\apache-tomcat-7.0.6-dubbo\webapps\ROOT\WEB-INF下的dubbo.properties文件中即可查看到,如:

3,訪問 http://192.168.24.213:38080/

4,啟動我們的服務提供者和消費者即可查看到


整體說明:
Zookeeper(注冊中心)部署到213的機子上,服務提供者和服務消費者均在215的機子上運行,當然我們也可以分別將服務提供者和服務消費者部署到不同的兩臺機子上。
優點:
服務提供者和服務消費者只需要知道注冊中心即可,它們之間打交道需通過注冊中心這個第三方,只要是注冊中心中已經注冊的服務,我們均可以使用,實現了服務提供者和服務消費者間的解耦。
來自: http://blog.csdn.net/hejingyuan6/article/details/47403299