之前作項目時,分佈式環境都是其它同事在搭建,本身也沒參與分佈式環境搭建,只負責開發,因爲近段時間工做重心轉到android,java後臺有一段時間沒有接觸了,恰好這幾天有空,決定本身動手親自搭建一次spring+dubbo+zookeeper的運行環境,方便之後在工做中使用,若有描述錯誤的地方,請指正,謝謝。html
Dubbo是一個分佈式服務框架,若是是一個小的erp系統,一臺服務器足夠支撐項目運行,項目就不會用Dubbo,若是是一個大的商城項目,用戶訪問量比較大,一臺沒法器根本沒法支撐運行時,咱們能夠把訂單模塊,支付模塊,靜態頁面等獨立出來,放置在同一個局域網,不一樣服務器運行,這時咱們就須要使用Dubbo, Dubbo原理圖以下:java
節點角色說明:android
Provider: 暴露服務的服務提供方,好比支付系統實現支付接口,供訂單系統調用git
Consumer: 調用遠程服務的服務消費方,好比訂單系統調用支付系統提供的服務進行付款操做。github
Registry: 服務註冊與發現的註冊中心。算法
Monitor: 統計服務的調用次調和調用時間的監控中心。spring
Container: 服務運行容器。apache
各個角色之間的調用關係:api
1 服務容器負責啓動,加載,運行服務提供者。2 服務提供者在啓動時,向註冊中心註冊本身提供的服務。3 服務消費者在啓動時,向註冊中心訂閱本身所需的服務。4註冊中心返回服務提供者地址列表給消費者,若是有變動,註冊中心將基於長鏈接推送變動數據給消費者。5 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,若是調用失敗,再選另外一臺調用。6 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心(此段描述來自網絡)。瀏覽器
2 zookeeper下載地址,http://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.3.6/ 下載後直接解壓便可
我本地測試環境是 Window 7 64,Eclipse 4.4,jdk1.8,tomcat 8,zookeeper-3.3.6,apache-maven-3.5.0
如今咱們模擬一個商城環境,將支付模塊和訂單模塊獨立出來,在不一樣服務器上運行,而後相互以前調用,因爲兩個系統須要相互調用,即支付模塊是服務提供者,又是消費者,訂單模塊也是服務提供者,又是消費者.
建立父工程shopping,建立完成後,設置父工程的Packaging爲pom
建立子工程,shopping-api(用於定義公共接口,公共實體類等),shopping-order(訂單模塊,須要依賴shopping-api,實現訂單的service接口),shopping-pay(訂單模塊,須要依賴shopping-api,實現支付的service接口).
全部接口定義在shopping-api中,訂單接口定義以下:
//定義訂單讀接口 package com.service.order; import java.util.List; import com.bean.OrderBean; /** * 訂單查詢 * */ public interface OrderReadService { List<OrderBean> listQuery(); OrderBean getOrder(long oId); }
支付接口定義以下:
package com.service.pay; /** * 訂單支付 * */ public interface PayService { String pay(long orderId); }
訂單接口須要在shopping-order項目中實現,代碼以下:
package com.order.impl; import java.util.List; import java.util.Random; import java.util.Vector; import com.bean.OrderBean; import com.service.order.OrderReadService; /** * 訂單查詢實現類 * */ public class OrderReadServiceImpl implements OrderReadService { @Override public List<OrderBean> listQuery() { // TODO Auto-generated method stub List<OrderBean> list = new Vector<OrderBean>(); for(int i=0;i<5;i++){ OrderBean bean = new OrderBean(); bean.setoId(i+10); bean.setoMoney(100+new Random().nextInt(50)); bean.setoUserId(500+new Random().nextInt(50)); list.add(bean); } return list; } @Override public OrderBean getOrder(long oId) { // TODO Auto-generated method stub OrderBean bean = new OrderBean(); bean.setoId(oId); bean.setoMoney(100+new Random().nextInt(50)); bean.setoUserId(500+new Random().nextInt(50)); return bean; } }
支付接口須要在shopping-pay項目中實現,代碼以下:
package com.pay.impl; import com.service.pay.PayService; public class PayServiceImpl implements PayService { @Override public String pay(long orderId) { // TODO Auto-generated method stub return orderId + "支付成功."; } }
因爲shopping-api定義了完整的接口,shopping-order,shopping-pay實現了shopping-api項目下的接口,因此須要在shopping-order,shopping-pay項目中配置依賴關係,代碼以下:
<dependency> <groupId>shopping-api</groupId> <artifactId>shopping-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
因爲兩個項目以前須要相互調用,因此兩個項目都須要配置服務提供者,和消費者,代碼以下:
shopping-order訂單項目的xml配置以下:
<!--定義了提供方應用信息,用於計算依賴關係;在 dubbo-admin 或 dubbo-monitor 會顯示這個名字,方便辨識 --> <dubbo:application name="shopping-order" owner="programmer" organization="dubbox" /> <!--向 zookeeper 訂閱 provider 的地址,由 zookeeper 定時推送 --> <dubbo:registry address="zookeeper://localhost:2181" check="false"/> <!-- 用dubbo協議在20880端口暴露服務 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- (配置訂單服務提供者 )提供支付方的接口 --> <dubbo:service ref="orderReadService" protocol="dubbo" interface="com.service.order.OrderReadService"></dubbo:service> <bean id="orderReadService" class="com.order.impl.OrderReadServiceImpl"></bean> <dubbo:service ref="orderWriterService" protocol="dubbo" interface="com.service.order.OrderWriterService"></dubbo:service> <bean id="orderWriterService" class="com.order.impl.OrderWriterServiceImpl"></bean> <!-- 配置消費者 --> <!--使用 dubbo 協議調用定義好的 api.PermissionService 接口 --> <dubbo:reference id="payService" interface="com.service.pay.PayService" check="false"></dubbo:reference>
shopping-pay支付項目的xml配置以下:
<!--定義了提供方應用信息,用於計算依賴關係;在 dubbo-admin 或 dubbo-monitor 會顯示這個名字,方便辨識 --> <dubbo:application name="shopping-pay" owner="programmer" organization="dubbox" /> <!--向 zookeeper 訂閱 provider 的地址,由 zookeeper 定時推送 --> <dubbo:registry address="zookeeper://localhost:2181" check="false" /> <!-- 用dubbo協議在20880端口暴露服務,因爲訂單設置的端口是20880,此處設置20881,否則tomcat啓動後,會衝突報錯 --> <dubbo:protocol name="dubbo" port="20881" /> <!-- (配置支付服務提供者)提供給訂單項目調用 --> <dubbo:service interface="com.service.pay.PayService" ref="payService" protocol="dubbo"></dubbo:service> <bean id="payService" class="com.pay.impl.PayServiceImpl"></bean> <!-- (配置消費者) --> <dubbo:reference interface="com.service.order.OrderReadService" id="orderReadService"></dubbo:reference> <dubbo:reference interface="com.service.order.OrderWriterService" id="orderWriterService"></dubbo:reference>
我將不一樣的項目,放置在不一樣的tomcat下,建立過程:File-new-Other,彈出以下窗體
添加完成,將項目導入tomcat,效果圖以下
shopping-pay將端口號設置爲:8081,
shopping-order將端口號設置爲:8082
啓動tomcat前,須要先啓動zookeeper,先進入以前解壓的zookeeper/bin目錄,運行zkServer.cmd,而後再啓動tomcat,兩個項目不分前後啓動,但測試前,須要保證兩個項目正常啓動.
直接在瀏覽器中輸入以下地址測試,控制層的代碼,沒有貼出來,完整代碼在文章最後有下載地址:
http://127.0.0.1:8081/shopping-pay/pay/orderList.do?id=10
http://127.0.0.1:8082/shopping-order/order/pay.do?id=123
由於兩個項目,須要相互調用,因此配置服務端口暴露服務時,記得將兩個端口設置爲不同,否則會出錯,此處配置我也不是很熟悉,如配置不對,請指正,謝謝,配置以下:
<!-- 用dubbo協議在20880端口暴露服務 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 用dubbo協議在20880端口暴露服務,因爲訂單設置的端口是20880,此處設置20881,否則tomcat啓動後,會衝突報錯 --> <dubbo:protocol name="dubbo" port="20881" />
另外還須要注意:向 zookeeper 訂閱 provider 的地址,以及配置dubbo:service,須要把check設置爲false,否則項目沒法啓動,
<dubbo:registry address="zookeeper://localhost:2181" check="false" /> <dubbo:service interface="com.service.pay.PayService" ref="payService" protocol="dubbo"></dubbo:service>
因爲兩個項目依賴於,shopping-api,雖然在pom.xml中引入了對shopping-api的依賴,我本地tomcat啓動時,仍然報錯,找不到shopping-api下的公共類,因此我將shopping-api打包成jar包,放置在shopping-order和shopping-pay項目中。
參考文獻:
分佈式系統架構實戰demo:SSM+Dubbo
https://my.oschina.net/liughDevelop/blog/1480061#0-sqq-1-469-9737f6f9e09dfaf5d3fd14d775bfee85
dubbo 既是提供方又是消費方的問題
https://blog.csdn.net/q596333033/article/details/78573741
Dubbo架構
http://dubbo.apache.org/books/dubbo-dev-book/design.html
dubbo 知識總結 dubbo配置參考
https://blog.csdn.net/abcde474524573/article/details/53026110
這是本人第一次搭建dubbo環境,本文可能有錯誤的地方,但願你們指正,謝謝,完整代碼下載地址:https://github.com/jlq023/dubbo-shopping