採用spring3.2+dubbo2.5.3+zookeeper3.3.6java
所需架包如圖所示 linux
本文采用zookeeper-3.3.6,可自行查找下載。下載後進入conf目錄下,修改zoo_sample.cfg爲zoo.cfg。該文件爲zookeeper的配置文件web
# 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 an acknowledgement syncLimit=5 # the directory where the snapshot is stored. dataDir=/tmp/zookeeper # the port at which the clients will connect clientPort=2181
tickTime:基本事件單元,以毫秒爲單位。它用來控制心跳和超時,默認狀況下最小的會話超時時間爲兩倍的 tickTime。spring
dataDir:存放內存數據的地方tomcat
clientPort:用戶於zookeeper相連的端口bash
initLimit:Leader容許F在 initLimit 時間內完成這個工做,請求和響應時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 10*2000=20 秒服務器
syncLimit:檢測機器的存活狀態,請求和響應時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 5*2000=10 秒app
此處需注意這種文件框架
tickTime=2000 dataDir=/usr/zdatadir dataLogDir=/usr/zlogdir clientPort=2181 initLimit=5 syncLimit=2 server.1=cloud:2888:3888 server.2=cloud02:2888:3888 server.3=cloud03:2888:3888 server.4=cloud04:2888:3888 server.5=cloud05:2888:3888
server.A=B:C:D:其中 A 是一個數字,表示這個是第幾號服務器;B 是這個服務器的 ip 地址;C 表示的是這個服務器與集羣中的 Leader 服務器交換信息的端口;D 表示的是萬一集羣中的 Leader 服務器掛了,須要一個端口來從新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時服務器相互通訊的端口。若是是僞集羣的配置方式,因爲 B 都是同樣,因此不一樣的 Zookeeper 實例通訊端口號不能同樣,因此要給它們分配不一樣的端口號webapp
除了修改 zoo.cfg 配置文件,集羣模式下還要配置一個文件 myid,這個文件在 dataDir 目錄下,這個文件裏面就有一個數據就是 A 的值,Zookeeper 啓動時會讀取這個文件,拿到裏面的數據與 zoo.cfg 裏面的配置信息比較從而判斷究竟是那個 server。
此處我用的爲第一個配置文件,並無配置集羣。直接打開zookeeper-3.3.6\bin\zkServer.cmd,這裏我是window環境,linux環境運行.sh文件
經過將服務統一管理起來,能夠有效地優化內部應用對服務發佈/使用的流程和管理。服務註冊中心能夠經過特定協議來完成服務對外的統一。
dubbo就是一個服務框架,能夠實現調用遠程接口像調用本地接口同樣方便。
這裏註冊中心咱們選擇zookeeper
這裏我安裝的是dubbo-admin-2.5.3.war,部署到tomcat的webapps下,修改webapps\dubbo-admin-2.5.3\WEB-INF\dubbo.properties文件,內容以下
dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.admin.root.password=root dubbo.admin.guest.password=guest
其中root和guest都爲密碼。
啓動tomcat,效果以下(如提示輸出帳號信息,輸入root,root)
provider註冊----生產---->zookeeper<----消費--------consumer
生產者將接口信息註冊到zookeper,消費者經過zookeeper進行消費
Provider.java文件以下
package com.dubbotest.provider; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Provider { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-service.xml"); context.start(); System.out.println("-----------"); System.in.read(); // 爲保證服務一直開着,利用輸入流的阻塞來模擬,任意鍵退出 } }
applicationContext-service.xml以下
<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-3.2.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd "> <bean id="user" class="com.model.User"> <property name="name" value="person" /> </bean> <!-- 具體的實現bean --> <bean id="demoService" class="com.dubbotest.provider.DemoServiceImpl" /> <!-- 提供方應用信息,用於計算依賴關係 --> <dubbo:application name="xixi_provider" /> <!-- 使用multicast廣播註冊中心暴露服務地址 <dubbo:registry address="multicast://224.5.6.7:1234" /> --> <!-- 使用zookeeper註冊中心暴露服務地址 --> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> <!-- 用dubbo協議在20880端口暴露服務 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 聲明須要暴露的服務接口 --> <!-- <dubbo:service interface="com.dubbotest.provider.DemoService" ref="demoService" /> --> <dubbo:service interface="com.dubbotest.provider.DemoService" ref="demoService" /> </beans>
運行了provider中的main函數後能夠在dubbo-admin管理中看見接口信息。
Consumer.java以下
package com.dubbotest.consumer; import java.util.List; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.dubbotest.provider.DemoService; import com.model.User; public class Consumer { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( new String[] { "applicationContext-dubbo.xml" }); context.start(); DemoService demoService = (DemoService) context.getBean("demoService"); String hello = demoService.sayHello("tom"); System.out.println(hello); List<User> list = demoService.getUsers(); if (list != null && list.size() > 0) { for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i).toString()); } } System.in.read(); } }
applicationContext-dubbo.xml以下
<?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="hehe_consumer" /> <!-- 使用zookeeper註冊中心暴露服務地址 --> <!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> --> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> <!-- 生成遠程服務代理,能夠像使用本地bean同樣使用demoService --> <dubbo:reference id="demoService" interface="com.dubbotest.provider.DemoService" /> </beans>
運行後結果如圖 :
DemoService.java
package com.dubbotest.provider; import java.util.List; public interface DemoService { String sayHello(String name); public List getUsers(); }
DemoServiceImpl.java
package com.dubbotest.provider; import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Component; import com.alibaba.dubbo.config.annotation.Service; import com.model.User; @Service(version="1.0")//此處Component是Spring bean註解,Service是dubbo的註解 public class DemoServiceImpl implements DemoService{ @Override public String sayHello(String name) { // TODO Auto-generated method stub return "Hello " + name; } @Override 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; } }
User.java
package com.model; import java.io.Serializable; public class User implements Serializable{ private String name; private String sex; private int age; @Override public String toString() { return "User [name=" + name + ", sex=" + sex + ", age=" + 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 int getAge() { return age; } public void setAge(int age) { this.age = age; } }