一:簡介
以前做項目時,分布式環境都是其它同事在搭建,自己也沒參與分布式環境搭建,只負責開發,由於近段時間工作重心轉到android,java后台有一段時間沒有接觸了,剛好這幾天有空,決定自己動手親自搭建一次spring+dubbo+zookeeper的運行環境,方便以后在工作中使用,如有描述錯誤的地方,請指正,謝謝。
1 dubbo描述
Dubbo是一個分布式服務框架,如果是一個小的erp系統,一台服務器足夠支撐項目運行,項目就不會用Dubbo,如果是一個大的商城項目,用戶訪問量比較大,一台無法器根本無法支撐運行時,我們可以把訂單模塊,支付模塊,靜態頁面等獨立出來,放置在同一個局域網,不同服務器運行,這時我們就需要使用Dubbo, Dubbo原理圖如下:
節點角色說明:
Provider: 暴露服務的服務提供方,比如支付系統實現支付接口,供訂單系統調用
Consumer: 調用遠程服務的服務消費方,比如訂單系統調用支付系統提供的服務進行付款操作。
Registry: 服務注冊與發現的注冊中心。
Monitor: 統計服務的調用次調和調用時間的監控中心。
Container: 服務運行容器。
各個角色之間的調用關系:
1 服務容器負責啟動,加載,運行服務提供者。2 服務提供者在啟動時,向注冊中心注冊自己提供的服務。3 服務消費者在啟動時,向注冊中心訂閱自己所需的服務。4注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基於長連接推送變更數據給消費者。5 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一台提供者進行調用,如果調用失敗,再選另一台調用。6 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鍾發送一次統計數據到監控中心(此段描述來自網絡)。
2 zookeeper下載地址,http://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.3.6/ 下載后直接解壓即可
二:環境搭建
1 測試環境
我本地測試環境是 Window 7 64,Eclipse 4.4,jdk1.8,tomcat 8,zookeeper-3.3.6,apache-maven-3.5.0
2 創建項目
現在我們模擬一個商城環境,將支付模塊和訂單模塊獨立出來,在不同服務器上運行,然后相互之前調用,由於兩個系統需要相互調用,即支付模塊是服務提供者,又是消費者,訂單模塊也是服務提供者,又是消費者.
創建父工程shopping,創建完成后,設置父工程的Packaging為pom
創建子工程,shopping-api(用於定義公共接口,公共實體類等),shopping-order(訂單模塊,需要依賴shopping-api,實現訂單的service接口),shopping-pay(訂單模塊,需要依賴shopping-api,實現支付的service接口).
3: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 + "支付成功."; } }
4:項目之間的依賴關系
由於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>
5:配置Dubbo提供者和消費者的xml
由於兩個項目之前需要相互調用,所以兩個項目都需要配置服務提供者,和消費者,代碼如下:
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運行環境
我將不同的項目,放置在不同的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