原文參見dubbo 簡介與 dubbo demo 執行
dubbo是阿里巴巴推出的分散式服務治理框架,是國內實現微服務較為常見的框架。關於微服務的介紹可以參見原文,infoq 文章,dubbo 架構設計詳解。
dubbo 的架構圖如下:
如上圖所示,簡單來說 dubbo 架構包括如下幾部分:服務註冊和服務發現中心,對外暴露服務的服務提供方和執行該服務的容器,呼叫遠端服務的服務消費方,統計服務呼叫時間和次數的監控中心(非必需)。其呼叫關係為:
0。 服務方的容器啟動服務
1。 服務提供方向註冊中心註冊自己的地址
2。 訪問消費方向註冊中心訂閱所需的服務
3。 註冊中心通知服務消費方所訂閱服務的變更
4。 根據獲取到的提供方地址列表,服務消費方直接呼叫服務提供方
5。 監控中心會監控消費方和提供方的呼叫時間和次數等資訊
安裝與準備
dubbo 採用全 spring 配置方式,透明化接入應用,對應用沒有侵入。
如上框圖所示,你需要準備註冊中心,dubbo 服務的提供者和消費者,以及監控中心。執行一個 demo 程式需要準備這些:
註冊中心 zookeeper
噹噹的 dubbox
tomcat
示例 dubbo demo 的 provider,consumer
dubbo admin 管理程式
dubbo simple monitor 監控程式
其中 dubbo 的部分都在 dubbox 專案中。這些軟體的下載只需要下載原始碼,不會安裝到本地。
在 zookeeper 官網選擇國內映象下載 zookeeper,解壓到本地。我下載的是 3。4。9 版本。
在 tomcat 官網下載國內映象 tomcat,解壓到本地。我下載的是 8。5。11 版本。
clone 下噹噹的 dubbox 專案,執行:
mvn install -Dmaven。test。skip=true #dubbox 的測試 url 無法訪問
安裝。
檢視 dubbox 的檔案結構,我們在後面還需要用到 dubbo-admin,dubbo-demo 和 dubbo-simple/dubbo-monitor-simple。
執行
zookeeper 註冊中心
進入解壓後的 zookeeper 目錄,建立 conf/zoo。cfg(可參考同目錄下的 sample 檔案),其內容如下:
tickTime
=
2000
initLimit
=
10
syncLimit
=
5
dataDir
=
/tmp/zookeeper/tmp/data
# 自己定義
dataLogDir
=
/tmp/zookeeper/tmp/log
# 自己定義
clientPort
=
2181
server。1
=
localhost:2287:3387
執行bin/zkServer。sh start啟動 zookeeper,執行bin/zkCli。sh -server 127。0。0。1:2181檢視是否啟動成功。
dubbo 提供者和消費者服務
Demo 在 dubbo-demo 資料夾下,因為前面在 dubbox 下執行過 mvn install,都已經打包好了,這裡可以直接執行來啟動 demo provider, consumer,如下圖所示。
當 provider 執行後看到
[01/03/17 06:16:26:026 CST] main INFO container。Main: [DUBBO] Dubbo SpringContainer started!, dubbo version: 2。0。0, current host: 127。0。0。1
[2017-03-01 18:16:26] Dubbo service server started!
consumer 執行後看到
Client response filter invoked
Reader interceptor invoked
Dynamic reader interceptor invoked
[01/03/17 06:18:11:011 CST] main INFO support。LoggingFilter: [DUBBO] The contents of request body is:
{“id”:1,“username”:“username1”}
, dubbo version: 2。0。0, current host: 192。168。1。33
SUCCESS: got user User (id=1, name=‘username1’)
[01/03/17 06:18:11:011 CST] main INFO container。Main: [DUBBO] Dubbo SpringContainer started!, dubbo version: 2。0。0, current host: 192。168。1。33
[2017-03-01 18:18:11] Dubbo service server started!
說明啟動成功了。
tomcat 執行 dubbo admin
在 dubbo-admin 的 target 目錄下找到 war 包(沒有的話就 mvn package 一下),放到 tomcat 目錄下的webapps 下。
~/tmp/zookeeper/apache-tomcat-8。5。11
> ls webapps
ROOT docs dubbo-admin-2。8。4 dubbo-admin-2。8。4。war examples host-manager manager
執行bin/startup。sh啟動 tomcat,開啟 localhost:8080,一開始會有點慢,tomcat 要解壓 war 檔案,解壓完畢後 webapps 下出現對應的資料夾(如上面 ls 所示),進入該資料夾,
~/tmp/zookeeper/apache-tomcat-8。5。11
> vim webapps/dubbo-admin-2。8。4/WEB-INF/dubbo。properties
編輯 dubbo-admin 的 zookeeper 配置。
dubbo。registry。address=zookeeper://127。0。0。1:2181
# 帳號對應的密碼,初次訪問的時候需要用到
dubbo。admin。root。password=root
dubbo。admin。guest。password=guest
重啟 tomcat,開啟
http://
localhost:8080/dubbo-ad
min-2。8。4
,輸入帳號密碼即可看到 dubbo-admin 的管理頁面。上面執行的 provider 和 consumer demo 在服務治理下。
注意:有些連結可能 404,因為 dubbo-admin 預設使用了/路徑,而掛在 tomcat 下的時候路徑中包含了/dubbo-admin-2。8。4。
啟動 dubbo monitor
除了這三者之外,dubbo 還提供了監控面板。在 dubbo-simple/dubbo-monitor-simple 的 target 目錄下,解壓 。tar。gz 檔案,得到 dubbo-monitor-simple-2。8。4 資料夾,編輯其中的 conf/dubbo。properties 檔案。
dubbo。container=log4j,spring,registry,jetty
dubbo。application。name=simple-monitor
dubbo。application。owner=
# 選擇 zookeeper 作為註冊中心
# dubbo。registry。address=multicast://224。5。6。7:1234
dubbo。registry。address=zookeeper://127。0。0。1: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=8083
dubbo。jetty。directory=${user。home}/monitor
dubbo。charts。directory=${dubbo。jetty。directory}/charts
dubbo。statistics。directory=${user。home}/monitor/statistics
dubbo。log4j。file=logs/dubbo-monitor-simple。log
dubbo。log4j。level=WARN
需要修改的是 registry,埠號和各種檔案的儲存位置。
執行bin/start。sh,當看到
Starting the simple-monitor ……………………。OK!
PID: 21032
STDOUT: logs/stdout。log
即執行成功,開啟
http://
localhost:8083/
即可看到監控面板。
如果看不到 charts 和 statitics,檢查下配置中的dubbo。charts。directory和dubbo。statistics。directory是否提前建立成功,dubbo-monitor 可能不會自動建立該目錄的。
自帶 monitor 比較簡單,可以參見 monitor 的其他實現:韓都衣舍/dubbo-monitor,dubboclub/dubbokeeper。
PS: 從零開始搭一個 dubbo 的 demo 示例可以參見下一篇文章。