1. 引子
本文將結合運維便捷性要求容器部署(Tomcat)和DUBBO官方推薦Maven控制檯工程做出分析對比以便更好地實施dubbo微服務架構。
2. DUBBO架構
使用dubbo來作爲服務化中間件,dubbo作爲一個RPC框架,大致的原理如下圖:
- Registry:
註冊中心;和服務的消費者,和服務提供者都建立長連接。服務提供者註冊服務到註冊中心;服務消費者從註冊中心獲取服務提供者列表; - Consumer: 服務消費端;服務消費者從註冊中心獲取到服務提供者列表後,根據負載均衡算法,選擇一個服務提供者,和服務提供者直接建立連接,開始調用服務;
- Provider:服務提供者;服務提供者提供RPC服務;
- Monitor: 監控服務的調用情況統計;
- 註冊中心爲N+1對等集羣,一臺掛掉後,會自動切換到另外一臺註冊中心
- 註冊中心全部掛掉後,消息消費者本地會緩存服務提供者列表,所以不影響當時的服務調用。
- 服務提供者爲集羣,一臺掛掉後,通過心跳過程,註冊中心會立即刷到服務消費者告知;
從以上架構可知,運維dubbo服務主要包含 DUBBO應用(APP) 監控中心(Monitor) 服務中心(Admin)管理三個方面,因此一下從三個方面分析對比選型。
3. DUBBO應用工程
總體來說,服務化工程類型分爲兩種standalong工程和web工程。
3.1 Standalong工程
- 工程結構
淺藍色是目錄,淺綠色是文件。assembly.xml(Maven打包配置,生成格式,包含文件等)不能修改,dubbo.properties和dubbo-provider.xml都可以修改,dubbo.properties描述服務公共配置,如註冊中心,超時等;dubbo-provider.xml通過spring描述具體服務信息。
例子:
dubbo.properties
assembly.xml
- 部署結構
standalong型的應用啓動停止都必須有對應的腳本,這些腳本文件不需要每個standalong型應用自己寫,只需要工程結構遵循規範,執行mvn package/install後,會在target自動輸出最後的部署包,部署包結構如下圖:
淺藍色是目錄,淺綠色是文件。
lib目錄:存放依賴的jar包,工程裏java代碼都會輸出爲jar包到lib裏
start.sh:啓動服務
restart.sh:重啓服務
stop.sh:停止服務
server.sh:命令入口,如server.sh start
dump.sh:dump應用的線程棧,內存,GC;供排查問題用
3.2 web工程
web應用暴露服務,需要依賴web容器,這是不太標準的服務提供形式。
- 工程結構和部署結構
web應用的服務只需要配置在spring配置文件裏,服務的啓動停止依賴web容器的啓動停止。
所以web工程的服務化不需要調整原有工程結構,只是要增加:api和impl。
因此web工程方式適合舊的非服務化程序的改造,影響較小。簡單目錄如下圖:
4. DUBBO應用運行
4.1 Servlet容器運行
使用Servlet容器運行(Tomcat、Jetty等)—-不可取
不可取原因
1) 增加複雜性(端口、管理)
2) tomcat/jetty等佔用端口,dubbo服務也需要端口
3) 浪費資源(內存):單獨啓動tomcat,jetty佔用內存大
4.2 自建Main方法運行
自建Main方法類來運行(spring容器) —-不建議(本地調試可用)
不建議原因
1) Dubbo本身提供的高級特性沒用上
2) 自己編寫啓動類,可能會有缺陷
4.3 框架的Main方法運行
使用Dubbo框架提供的Main方法類來運行(Spring容器)—-建議使用
建議原因
1) 框架本身提供(com.alibaba.dubbo.container.Main)
2) 可實現優雅關機(ShutdownHook)
注意點spring-context.xml
官方:服務容器的加載內容可以擴展,內置了spring, jetty, log4j等加載,可通過Container擴展點進行擴展。
4.4 優雅停機
摘抄官方說明如下(文檔地址:http://dubbo.io/User+Guide-zh.htm
):
實現優雅停機的前提是,在啓動時,需要指定參數-Ddubbo.shutdown.hook=true:
源碼:
紅框中顯示,優雅關機的是循環關閉dubbo的container,因此實現dubbo優雅關機需要使用dubbo的container啓動。
4.5 DUBBO容器
- 容器說明
再次摘抄官方文檔:定義如下
Dubbo的容器模塊,是一個獨立的容器,因爲服務通常不需要Tomcat/JBoss等Web容器的特性,沒必要用Web容器去加載服務。
服務容器只是一個簡單的Main方法,並加載一個簡單的Spring容器,用於暴露服務。
我們看啓動生產者、消費者、簡單監控者的 官方示例start.sh 命令中,可以看到啓動命令如下:
nohup java
這裏啓動的就是 com.alibaba.dubbo.container.Main 類的 public static void (String[] args) { … } 方法。
- 容器啓動
1) 如:(缺省只加載spring)
java com.alibaba.dubbo.container.Main
2) 或:(通過main函數參數傳入要加載的容器)
java com.alibaba.dubbo.container.Main spring jetty log4j
3) 或:(通過JVM啓動參數傳入要加載的容器)
java com.alibaba.dubbo.container.Main -Ddubbo.container=spring,jetty,log4j
4) 或:(通過classpath下的dubbo.properties配置傳入要加載的容器)
dubbo.properties
dubbo.container=spring,jetty,log4j
不論生產者、消費者、簡單監控 他們的啓動 start.sh 命令都是完全一樣的。 整個 bin 目錄下的文件是完全一樣的。
4.6 啓動流程分析
以 dubbo-demo-provider-2.5.4-SNAPSHOT 爲例,完整的啓動加載過程如下圖:
代碼路徑:
com.alibaba.dubbo.container.Main
com.alibaba.dubbo.container.spring. SpringContainer
5. Dubbo服務治理
目前僅有的選擇爲dubbo-admin,也符合服務開發人員使用習慣,缺點存在不少bug。
6. Dubbo服務監控
下表整理了目前業界提供的監控系統對比,詳細如下表:
綜上所述,本次採用dubbokeeper作爲監控組件之一。部分頁面如下:
7. 實踐推薦
7.1 Standalong與Web並存
純粹是後臺服務工程採用Standalong方式,比如tradeCenter、paymentTool等。
Web服務提供Dubbo服務的使用Web方式,包括Boss-XXX。
7.2 Dubbo-Admin服務治理
7.3 Dubbo-Kepper服務監控
開源版本的dubbo-keeper作爲服務監控工具,開源版本存在少量bug,需要修復。爲了適應使用環境需要做適量改造。
7.4 其他
爲了防止程序還沒有完全啓動結束即有客戶端請求過來的問題,服務可配置延遲暴露。