、實例搭建
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服務,正常應該是如下圖所示,錯誤則看第三步
3、若啟動失敗,則在conf目錄下,新建zoo.cfg配置文件
配置如下,主要修改路徑地址(參考:http://blog.csdn.net/morning99/article/details/40426133)
# 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方類似)
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 ListgetUsers();}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方:
目錄結構
我理解的是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); //獲取用戶列表 Listlist = 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,結果如下圖:
二、常見問題
1、Dubbo採用Spring配置方式,加入Schema即可,如下
但是可能報錯:
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(搜索查找即可)
然後Window-->Preferences-->XML-->XML Catalog-->Add-->Catalog Entry
由於Uri Location的路徑中不能包含 .,所以我將其重新拷貝到另一個地方了,一定要修改Key,配置如下:
然後右鍵項目,選擇Validate!
閱讀更多 JAVA小酷 的文章