一、前言
dubbo 作為分布式服務框架支持豐富的配置和擴展方式,其中包括:通訊協議、並發控制、多版本服務、結果緩存、泛化引用\實現、回聲測試、上下文信息、事件通知、路由規則(可用於實現讀寫分離)等多方面內容,官方User Guide(http://alibaba.github.io/dubbo-doc-static/Home-zh.htm)中已經包含了非常詳細的解釋和使用說明,不再重復描述。參照之前的博文《基於開源Dubbo分布式RPC服務框架的部署整合》(http://www.cnblogs.com/lengfo/p/4245215.html),已經實現了由Zookeeper作為dubbo注冊中心的RPC簡單調用,基於此,本文主要介紹了 dubbo 在負載均衡、服務管理、服務監控等方面的內容,部署結構如下圖:
二、集成環境
1、測試環境(OS:Linux CentOS 6.5,CPU:2 Core,Memory:4G)
2、部署配置
Role | Name | IP_PORT | Remark |
注冊中心 | zookeeper | 10.129.221.64:2181 | 3.4.6,可擴展 |
服務提供者 | provider_01 | 10.129.221.64:30001 | |
服務提供者 | provider_02 | 10.129.221.64:30002 | |
服務提供者 | provider_03 | 10.129.221.64:30003 | |
服務管理 | dubbo_admin | 10.129.221.64:8080 | 2.5.3,基於 tomcat |
服務監控 | dubbo_monitor | 10.129.221.64:8081 | 2.5.3,基於 jetty |
三、服務負載均衡(Load Balance)
1、dubbo provider 通過統一 registry 注冊中心可以很方便實現Cluster部署,平滑增加或者減少機器實現負載均衡,consumer 和 provider 之間通過注冊中心實現調用地址的隔離。本文通過不同端口配置多個Provider注冊發布服務,配置參照上述表格。
2、在服務消費方 Consumer 相關代碼中循環執行遠程 IGoodsManager.LoadGoods()方法調用,由於默認使用輪詢方式進行負載,從下圖可以看出遠程服務對象會在三個Provider之間進行自動切換,
3、dubbo 支持輪詢、隨機(推薦)、最少並發等軟負載均衡方式,同時支持設置每台Provider機器的負載權重,例如性能較低的機器可以使用較低的權重提供服務。負載方式和權重配置可以在開發時的Spring配置文件中指定,也可以在服務部署后運行時通過 admin 工具(后續介紹)進行動態配置,如果調用遠程發布服務失敗可以指定次數retry,除非所有的Provider都同時宕機,registry都能找到並分配可用的服務給消費方,從而實現服務的高可用。
- 隨機,按權重設置隨機概率。
- 輪循,按公約后的權重設置輪循比率。
- 最少活躍調用數,相同活躍數的隨機,活躍數指調用前后計數差。
- 一致性Hash,相同參數的請求總是發到同一提供者,另外提供了 sticky粘滯連接相關配置。
四、服務管理(Admin)
1、dubbo-admin 通過可視化的配置實現 負載均衡、權重調整、路由規則、服務降級、訪問控制等SOA治理功能,很遺憾,阿里並沒有完全開源 dubbo-admin,開源部分屬內部裁剪版本。部署方式如下。
2、從源碼編譯 dubbo-admin/target 目錄找到 dubbo-admin-2.5.3.war,部署到 tomcat 服務器(8080端口)並修改 dubbo-admin-2.5.3/WEB-INF/dubbo.properties 文件,指定dubbo registry Zookeeper 地址和登錄root、guest密碼,修改后的文件配置如下:
dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.admin.root.password=root dubbo.admin.guest.password=guest
3、配置成功后可以通過 http://10.129.221.64:8080/dubbo-admin-2.5.3/ 地址訪問,並使用賬號root/root登陸到 dubbo后台管理頁面,關於服務治理以下截取了一張服務提供者頁面,更多截圖參照官方地址:http://alibaba.github.io/dubbo-doc-static/Administrator+Guide-zh.htm#AdministratorGuide-zh-%E7%AE%A1%E7%90%86%E6%8E%A7%E5%88%B6%E5%8F%B0%E5%AE%89%E8%A3%85
4、通過以上工具可以很直觀的進行服務的SOA治理。
五、服務監控(Monitor)
1、dubbo monitor 主要用於監控 dubbo服務、注冊中心、服務提供者、服務消費方等工作狀態、依賴關系等,支持JFreeChart圖形統計報表的形式展示服務負載情況,dubbo monitor不支持負載,但單點故障不會影響RPC的運行,通過 dubbo monitor 可以清晰的看到服務的訪問記錄、成功次數、失敗次數等。
2、從源碼編譯 dubbo-simple\dubbo-monitor-simple\target 目錄找到 dubbo-monitor-simple-2.5.3-assembly.tar 並部署解壓到測試Linux服務器。
3、修改 dubbo monitor 配置文件,修改注冊中心地址指向之前的zookeeper服務器地址,默認為8080作為 jetty http訪問端口,本文修改為 jetty.port = 8081 防止和tomcat沖突。mkdir 創建對應目錄用於存放monitor 監控過程中的日志、統計信息、圖表相關內容,注意charts目錄必須放在jetty.directory下,否則頁面上訪問不了,同時修改配置文件將directory指向到對應目錄,修改后的配置如下:
dubbo.container=log4j,spring,registry,jetty dubbo.application.name=simple-monitor dubbo.application.owner= #dubbo.registry.address=multicast://224.5.6.7:1234 dubbo.registry.address=zookeeper://localhost:2181 #dubbo.registry.address=redis://127.0.0.1:6379 #dubbo.registry.address=dubbo://127.0.0.1:9090 dubbo.protocol.port=7070 dubbo.jetty.port=8081 dubbo.jetty.directory=monitor dubbo.charts.directory=${dubbo.jetty.directory}/charts dubbo.statistics.directory=monitor/statistics dubbo.log4j.file=logs/dubbo-monitor-simple.log dubbo.log4j.level=WARN
4、啟動 monitor 服務,如果啟動失敗可以通過查看log目錄下的日志信息來排查錯誤,正常啟動的截圖如下:
5、通過 http://10.129.221.64:8081/ 地址可以訪問到 dubbo monitor 頁面,如下圖:
6、注意:如果要啟用 dubbo monitor 的監控功能需要在provider開發的spring配置xml文件里面增加以下標簽,標識啟用monitor,否則provider 並不會向 registry 服務器匯報服務統計信息,在dubbo monitor中也只能監視到服務,並不能顯示相關統計信息。
<dubbo:monitor protocol="registry" />
六、至此,關於dubbo的整合配置部署完畢。
dubbo 框架覆蓋了RPC調用相關的方方面面,屬於一套完整的SOA解決方案,基於以上整合環境,參照 User Guide 可以快速實現分布式服務和流動計算架構。
當當網開源了基於dubbo 框架擴展的 dubbox,主要支持了REST風格遠程調用(HTTP + JSON/XML)和序列化方面等內容,開源地址:https://github.com/dangdangdotcom/dubbox
京東開源的基於dubbo的調用跟蹤系統 JD-Hydra,開源地址:https://github.com/odenny/hydra
七、性能測試
關於dubbo各協議、序列化方式等PRC調用相關的性能測試,請期待后續博文。
八、向開源工作者和組織致敬,感謝對開源事業作出的任何貢獻