Spring+Dubbo+Zookeeper簡單框架與使用

、實例搭建

1、搭建框架前先下載Zookeeper(http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.3.6/zookeeper-3.3.6.tar.gz)

2、解壓Zookeeper到指定文件目錄,在bin目錄下雙擊zkServer.cmd(Windows),啟動Zookeeper服務,正常應該是如下圖所示,錯誤則看第三步

Spring+Dubbo+Zookeeper簡單框架與使用

3、若啟動失敗,則在conf目錄下,新建zoo.cfg配置文件

Spring+Dubbo+Zookeeper簡單框架與使用

配置如下,主要修改路徑地址(參考:http://blog.csdn.net/morning99/article/details/40426133)

Spring+Dubbo+Zookeeper簡單框架與使用

# The number of milliseconds of each tick 心跳間隔 毫秒每次

tickTime=2000

# The number of ticks that the initial

# synchronization phase can take

initLimit=10

# The number of ticks that can pass between

# sending a request and getting anacknowledgement

syncLimit=5

# the directory where the snapshot isstored. //鏡像數據位置

dataDir=F:\Work\Zookeeper\data

#日誌位置

dataLogDir=F:\Work\Zookeeper\logs

# the port at which the clients willconnect 客戶端連接的端口

clientPort=2181

參數詳解:

1.tickTime:CS通信心跳數

Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳。tickTime以毫秒為單位。

2.initLimit:LF初始通信時限

集群中的follower服務器(F)與leader服務器(L)之間初始連接時能容忍的最多心跳數(tickTime的數量)。

3.syncLimit:LF同步通信時限

集群中的follower服務器與leader服務器之間請求和應答之間能容忍的最多心跳數(tickTime的數量)。

4.dataDir:數據文件目錄

Zookeeper保存數據的目錄,默認情況下,Zookeeper將寫數據的日誌文件也保存在這個目錄裡。

5.dataLogDir:日誌文件目錄

Zookeeper保存日誌文件的目錄。

6.clientPort:客戶端連接端口

客戶端連接 Zookeeper 服務器的端口,Zookeeper 會監聽這個端口,接受客戶端的訪問請求。

7.服務器名稱與地址:集群信息(服務器編號,服務器地址,LF通信端口,選舉端口)

這個配置項的書寫格式比較特殊,規則如下:

server.N=YYY:A:B

eg:

server.0=233.34.9.144:2008:6008

server.1=233.34.9.145:2008:6008

Zookeeper配置參數詳解:http://blog.csdn.net/poechant/article/details/6650249

3、配置pom.xml(Provider與Consumer配置一致)

junit

junit

4.12

test

org.apache.tomcat

servlet-api

6.0.45

com.alibaba

dubbo

2.5.3

org.springframework

spring

2.5.6

org.springframework

spring-core

4.3.3.RELEASE

org.apache.zookeeper

zookeeper

3.5.2-alpha

com.github.sgroschupf

zkclient

0.1

Provider方:

結構如下圖(和Consumer方類似)

Spring+Dubbo+Zookeeper簡單框架與使用

4、具體類的編寫(和Consumer方一致)

在model下新建一個User類,但是由於使用Dubbo,所以一定要實現序列化Serializable類

public class User implements Serializable{private static final long serialVersionUID = -1009733312893309388L;private String name;private String sex;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}}

然後在service下新建一個DemoService接口(和Consumer方一致),impl下新建DemoServiceImpl實現接口

public interface DemoService {String sayHello(String name);  public List getUsers();}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("jack");  u1.setAge(20);  u1.setSex("女");  User u2 = new User();  u2.setName("tom");  u2.setAge(21);  u2.setSex("男");  User u3 = new User();  u3.setName("rose");  u3.setAge(19);  u3.setSex("男");  list.add(u1);  list.add(u2);  list.add(u3);  return list;}} 

然後provider下新建一個Provider類,實現在Zookeeper中註冊

public class Provider {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"application.xml"});  context.start();  try {System.in.read();// 為保證服務一直開著,利用輸入流的阻塞來模擬 } catch (IOException e) {e.printStackTrace();}}}

5、application.xml的配置

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

">

Consumer方:

目錄結構

Spring+Dubbo+Zookeeper簡單框架與使用

我理解的是Provider方在Zookeeper註冊,暴露服務地址以及DemoService接口,然後Consumer方就可以調用其暴露出來的接口,具體實現由Provider完成,Consumer方只需要擁有與Provider方一致的接口,調用接口方法就實現遠程調用。

主要貼出與Provider不同的代碼,其他與其類似或一致的就不貼了。

1、consumer下新建Consumer類

public class Consumer {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(  new String[] { "application.xml" });  context.start();  DemoService demoService = (DemoService) context.getBean("demoService"); //  String hello = demoService.sayHello("tom"); //調用sayHello方法 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));  }  }  try {System.in.read();} catch (IOException e) {e.printStackTrace();} }}

2、application.xml的配置

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

">

然後先啟動Provider再啟動Consumer,結果如下圖:

Spring+Dubbo+Zookeeper簡單框架與使用

二、常見問題

1、Dubbo採用Spring配置方式,加入Schema即可,如下

Spring+Dubbo+Zookeeper簡單框架與使用

但是可能報錯:

Multiple annotations found at this line:

- cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'dubbo:application'.

- schema_reference.4: Failed to read schema document 'http://code.alibabatech.com/schema/dubbo/dubbo.xsd',

because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not

.

解決方案:

在maven下載的dubbo.jar(路徑:C:\Users\Administrator\.m2\repository\com\alibaba\dubbo\2.5.3)解壓文件中可以找到dubbo.xsd(搜索查找即可)

Spring+Dubbo+Zookeeper簡單框架與使用

Spring+Dubbo+Zookeeper簡單框架與使用

然後Window-->Preferences-->XML-->XML Catalog-->Add-->Catalog Entry

由於Uri Location的路徑中不能包含 .,所以我將其重新拷貝到另一個地方了,一定要修改Key,配置如下:

Spring+Dubbo+Zookeeper簡單框架與使用

然後右鍵項目,選擇Validate!


分享到:


相關文章: