dubbo工程結構分析

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/oMaverick1/article/details/53331380

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 JAVAOPTS JAVA_MEM_OPTS JAVADEBUGOPTS JAVA_JMX_OPTS -classpath CONFDIR: LIB_JARS com.alibaba.dubbo.container.Main > $STDOUT_FILE 2>&1 &
這裏啓動的就是 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 其他

爲了防止程序還沒有完全啓動結束即有客戶端請求過來的問題,服務可配置延遲暴露。
這裏寫圖片描述

FAQ常見問題

訪問地址:http://dubbo.io/FAQ-zh.htm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章