Dubbox實踐筆記
簡介
SOA(面向服務體系結構)PRC(遠程過程調用)
面向服務的體系結構,將應用程序的不同功能單元(稱為服務)通過這些服務之間定義良好的接口和契約聯系起來。
服務消費者(service consumer)可以通過發送消息來調用服務,這些消息由一個服務總線(service bus)轉換后發送給適當的服務實現。
Dubbo框架設計一共劃分了10個層,最上面的Service層是留給實際想要使用Dubbo開發分布式服務的開發者實現業務邏輯的接口層,圖中左邊淡藍背景的為服務消費方使用的接口,右邊淡綠色背景為服務提供方使用的接口,位于中軸線上的為雙方都用到的接口
- 服務接口層(Service):該層是與實際業務邏輯相關的,根據服務提供方和服務消費方的業務設計對應的接口和實現。
- 配置層(Config):對外配置接口,以ServiceConfig和ReferenceConfig為中心,可以直接new配置類,也可以通過spring解析配置生成配置類
- 服務代理層(Proxy):服務接口透明代理,生成服務的客戶端Stub和服務器端Skeleton,以ServiceProxy為中心,擴展接口為ProxyFactory
- 服務注冊層(Registry):封裝服務地址的注冊與發現,以服務URL為中心,擴展接口為RegistryFactory,Registry和RegistryService,可能沒有服務注冊中心,此時服務提供方直接暴露服務
- 集群層(Cluster):封裝多個提供者的路由及負載均衡,并橋接注冊中心,以Invoker為中心,擴展接口為Cluster,Directory,Router和LoadBalance。將多個服務提供方組合為一個服務提供方,實現對服務消費方來透明,只需要與一個服務提供方進行交互。
- 監控層(Monitor):RPC調用次數和調用時間監控,以Statistics為中心,擴展接口為MonitorFactory,Monitor和MonitorService。
- 遠程調用層(Protocol):封裝RPC調用,封將RPC調用,以Invocation和Result為中心,擴展接口為Protocol、Invoker和Exporter。Protocol是服務域,它是Invoker暴露和引用的主功能入口,它負責Invoker的生命周期管理。Invoker是實體域,它是Dubbo的核心模型,其它模型都向它靠擾,或轉換成它,它代表一個可執行體,可向它發起invoke調用,它有可能是一個本地的實現,也可能是一個遠程的實現,也可能一個集群實現。
- 信息交換層(Exchange):封裝請求響應模式,同步轉異步,以Request和Response為中心,擴展接口為Exchanger,xchangeChannel,ExchangeClient和ExchangeServer。
- 網絡傳輸層(Transport):抽象mina和netty為統一接口,以Message為中心,擴展接口為 Channel,Transproter,Client,Server和Codec。
- 數據序列化層(Serialize):可復用的一些工具,擴展接口為 Serialization,ObjectInput,ObjectOutput和ThreadPool。
服務調用
上圖中,藍色的表示與業務有交互,綠色的表示只對Dubbo內部交互。上述圖所描述的調用流程如下:
-
服務提供方發布服務到服務注冊中心;
-
服務消費方從服務注冊中心訂閱服務;
-
服務消費方調用已經注冊的可用服務;
注冊/注銷服務
服務的注冊與注銷,是對服務提供方角色而言,那么注冊服務與注銷服務的時序圖,如圖所示:
服務訂閱/取消
為了滿足應用系統的需求,服務消費方的可能需要從服務注冊中心訂閱指定的有服務提供方發布的服務,在得到通知可以使用服務時,就可以直接調用服務。反過來,如果不需要某一個服務了,可以取消該服務。下面看一下對應的時序圖,如圖所示:
Dubbo以包結構來組織各個模塊,各個模塊及其關系,如圖所示:
可以通過Dubbo的代碼(使用Maven管理)組織,與上面的模塊進行比較。簡單說明各個包的情況:
-
dubbo-common 公共邏輯模塊,包括Util類和通用模型。
-
dubbo-remoting 遠程通訊模塊,相當于Dubbo協議的實現,如果RPC用RMI協議則不需要使用此包。
-
dubbo-rpc 遠程調用模塊,抽象各種協議,以及動態代理,只包含一對一的調用,不關心集群的管理。
-
dubbo-cluster 集群模塊,將多個服務提供方偽裝為一個提供方,包括:負載均衡、容錯、路由等,集群的地址列表可以是靜態配置的,也可以是由注冊中心下發。
-
dubbo-registry 注冊中心模塊,基于注冊中心下發地址的集群方式,以及對各種注冊中心的抽象。
-
dubbo-monitor 監控模塊,統計服務調用次數,調用時間的,調用鏈跟蹤的服務。
-
dubbo-config 配置模塊,是Dubbo對外的API,用戶通過Config使用Dubbo,隱藏Dubbo所有細節。
-
dubbo-container 容器模塊,是一個Standalone的容器,以簡單的Main加載Spring啟動,因為服務通常不需要Tomcat/JBoss等Web容器的特性,沒必要用Web容器去加載服務。
dubbox
-
支持REST風格遠程調用(HTTP + JSON/XML):基于非常成熟的JBoss RestEasy框架,在dubbo中實現了REST風格(HTTP + JSON/XML)的遠程調用,以顯著簡化企業內部的跨語言交互,同時顯著簡化企業對外的Open API、無線API甚至AJAX服務端等等的開發。事實上,這個REST調用也使得Dubbo可以對當今特別流行的“微服務”架構提供基礎性支持。 另外,REST調用也達到了比較高的性能,在基準測試下,HTTP + JSON與Dubbo 2.x默認的RPC協議(即TCP + Hessian2二進制序列化)之間只有1.5倍左右的差距,詳見文檔中的基準測試報告。
-
支持基于Kryo和FST的Java高效序列化實現:基于當今比較知名的Kryo和FST高性能序列化庫,為Dubbo默認的RPC協議添加新的序列化實現,并優化調整了其序列化體系,比較顯著的提高了Dubbo RPC的性能,詳見文檔中的基準測試報告。
-
支持基于Jackson的JSON序列化:基于業界應用最廣泛的Jackson序列化庫,為Dubbo默認的RPC協議添加新的JSON序列化實現。
-
支持基于嵌入式Tomcat的HTTP remoting體系:基于嵌入式tomcat實現dubbo的HTTP remoting體系(即dubbo-remoting-http),用以逐步取代Dubbo中舊版本的嵌入式Jetty,可以顯著的提高REST等的遠程調用性能,并將Servlet API的支持從2.5升級到3.1。(注:除了REST,dubbo中的WebServices、Hessian、HTTP Invoker等協議都基于這個HTTP remoting體系)。
-
升級Spring:將dubbo中Spring由2.x升級到目前最常用的3.x版本,減少版本沖突帶來的麻煩。
-
升級ZooKeeper客戶端:將dubbo中的zookeeper客戶端升級到最新的版本,以修正老版本中包含的bug。
-
支持完全基于Java代碼的Dubbo配置:基于Spring的Java Config,實現完全無XML的純Java代碼方式來配置dubbo
-
調整Demo應用:暫時將dubbo的demo應用調整并改寫以主要演示REST功能、Dubbo協議的新序列化方式、基于Java代碼的Spring配置等等。
-
修正了dubbo的bug 包括配置、序列化、管理界面等等的bug。
dubbo
api項目
pom.xml
SerializationOptimizerImpl.java
User.java
UserRestService.java
UserService.java
provider項目
pom.xml
UserRestServiceImpl.java
UserServiceImpl.java
dubbo-demo-provider.xml
consumer項目
pom.xml
DemoConsumer.java
dubbo-hello-consumer.xml
框架整合
Springmvc + Mybatis + Shiro(權限) + REST(服務) + WebService(服務) + JMS(消息) + Lucene(搜搜引擎) + Quartz(定時調度) + Bootstrap Html5(支持PC、IOS、Android)
安裝
-
git clone https://github.com/dangdangdotcom/dubbox
-
在checkout出來的dubbox目錄執行 mvn install -Dmaven.test.skip=true 編譯一下dubbo
-
在dubbox/dubbo/target/下 分別運行 mvn install:install-file -DgroupId=com.alibaba -DartifactId=dubbo-remoting-grizzly -Dversion=2.8.4 -Dpackaging=jar -Dfile=./dubbo-2.8.4.jar mvn install:install-file -DgroupId=com.alibaba -DartifactId=dubbo-remoting-grizzly -Dversion=2.8.4 -Dpackaging=jar -Dfile=./dubbo-2.8.4-sources.jar mvn install:install-file -DgroupId=com.alibaba -DartifactId=dubbo-remoting-grizzly -Dversion=2.8.4 -Dpackaging=jar -Dfile=./original-dubbo-2.8.4.jar
-
在checkout出來的dubbox根目錄執行 mvn idea:idea 或者 mvn eclipse:eclipse 創建IDE工程文件
-
將項目導入IDE
-
下載解壓zookeeper,編輯其conf/zoo.cfg 后啟動zookeeper用作dubbo注冊中心:啟動/停止/重啟命令 bin/zkServer.sh start/stop/restart 啟動客戶端,創建,查詢節點 bin/zkCli.sh -server localhost:2128
-
用IDE運行/dubbo-demo/dubbo-demo-provider/.../test目錄下的DemoProvider啟動dubbo服務端,目前他會分別啟動dubbo協議(包括用kryo和FST序列化)和REST協議的服務
-
用IDE運行/dubbo-demo/dubbo-demo-consumer/.../test目錄下的DemoConsumer來啟動dubbo客戶端調用上面的服務端,直接看console的輸出即可
-
用IDE運行/dubbo-demo/dubbo-demo-consumer/.../test目錄下的RestClient來啟動rest客戶端(模擬非dubbo的rest客戶端)調用上面的服務端,直接看console的輸出即可
dubbo-admin部署
用戶名root 密碼 root
dubbo-monitor-simple部署
打包后,目錄dubbo-simple/dubbo-monitor-simple/target中會生成dubbo-monitor-simple-xxx-assembly.tar.gz 用tar -zxvf *.gz解壓,解壓后有三個子目錄bin, conf , lib ,
配置文件
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://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=8180 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</pre>
啟動: bin/start.sh
項目介紹
- aubbo-demo-api(服務接口傳輸對象)
- dubbo-demo-provider(服務生產者)
- duboo-demo-consumer(服務消費方)
- dubbo-admin(dubbo的后臺管理,其配置文件在webapp\WEB-INF\底下,名為dubbo.properties)
- dubbo-monitor(性能監控)
參考資料
來自:http://www.jianshu.com/p/39dbdacf3747