https://www.cnblogs.com/juncaoit/category/1083950.html
1.背景
隨著互聯(lián)網(wǎng)的發(fā)展,網(wǎng)站應(yīng)用的規(guī)模不斷擴(kuò)大,常規(guī)的垂直應(yīng)用架構(gòu)已無法應(yīng)對,分布式服務(wù)架構(gòu)以及流動計算架構(gòu)勢在必行,亟需一個治理系統(tǒng)確保架構(gòu)有條不紊的演進(jìn)。
2.架構(gòu)
單一應(yīng)用架構(gòu)
當(dāng)網(wǎng)站流量很小時,只需一個應(yīng)用,將所有功能都部署在一起,以減少部署節(jié)點和成本。
此時,用于簡化增刪改查工作量的 數(shù)據(jù)訪問框架(ORM) 是關(guān)鍵。
垂直應(yīng)用架構(gòu)
當(dāng)訪問量逐漸增大,單一應(yīng)用增加機(jī)器帶來的加速度越來越小,將應(yīng)用拆成互不相干的幾個應(yīng)用,以提升效率。
此時,用于加速前端頁面開發(fā)的 Web框架(MVC) 是關(guān)鍵。
分布式服務(wù)架構(gòu)
當(dāng)垂直應(yīng)用越來越多,應(yīng)用之間交互不可避免,將核心業(yè)務(wù)抽取出來,作為獨立的服務(wù),逐漸形成穩(wěn)定的服務(wù)中心,使前端應(yīng)用能更快速的響應(yīng)多變的市場需求。
此時,用于提高業(yè)務(wù)復(fù)用及整合的 分布式服務(wù)框架(RPC) 是關(guān)鍵。
流動計算架構(gòu)
當(dāng)服務(wù)越來越多,容量的評估,小服務(wù)資源的浪費(fèi)等問題逐漸顯現(xiàn),此時需增加一個調(diào)度中心基于訪問壓力實時管理集群容量,提高集群利用率。
此時,用于提高機(jī)器利用率的 資源調(diào)度和治理中心(SOA) 是關(guān)鍵。
3.dubbox
dubbox是dubbo的擴(kuò)展,主要在dubbo的基礎(chǔ)上進(jìn)行了一下的改進(jìn)
1、支持REST風(fēng)格遠(yuǎn)程調(diào)用(HTTP + JSON/XML):基于非常成熟的JBoss RestEasy框架,在dubbo中實現(xiàn)了REST風(fēng)格(HTTP + JSON/XML)的遠(yuǎn)程調(diào)用,以顯著簡化企業(yè)內(nèi)部的跨語言交互,同時顯著簡化企業(yè)對外的Open API、無線API甚至AJAX服務(wù)端等等的開發(fā)。事實上,這個REST調(diào)用也使得Dubbo可以對當(dāng)今特別流行的“微服務(wù)”架構(gòu)提供基礎(chǔ)性支持。 另外,REST調(diào)用也達(dá)到了比較高的性能,在基準(zhǔn)測試下,HTTP + JSON與Dubbo 2.x默認(rèn)的RPC協(xié)議(即TCP + Hessian2二進(jìn)制序列化)之間只有1.5倍左右的差距,詳見文檔中的基準(zhǔn)測試報告。
2、支持基于Kryo和FST的Java高效序列化實現(xiàn):基于當(dāng)今比較知名的Kryo和FST高性能序列化庫,為Dubbo默認(rèn)的RPC協(xié)議添加新的序列化實現(xiàn),并優(yōu)化調(diào)整了其序列化體系,比較顯著的提高了Dubbo RPC的性能,詳見文檔中的基準(zhǔn)測試報告。
3、支持基于Jackson的JSON序列化:基于業(yè)界應(yīng)用最廣泛的Jackson序列化庫,為Dubbo默認(rèn)的RPC協(xié)議添加新的JSON序列化實現(xiàn)。
4、支持基于嵌入式Tomcat的HTTP remoting體系:基于嵌入式tomcat實現(xiàn)dubbo的HTTP remoting體系(即dubbo-remoting-http),用以逐步取代Dubbo中舊版本的嵌入式Jetty,可以顯著的提高REST等的遠(yuǎn)程調(diào)用性能,并將Servlet API的支持從2.5升級到3.1。(注:除了REST,dubbo中的WebServices、Hessian、HTTP Invoker等協(xié)議都基于這個HTTP remoting體系)。
5、升級Spring:將dubbo中Spring由2.x升級到目前最常用的3.x版本,減少版本沖突帶來的麻煩。
6、升級ZooKeeper客戶端:將dubbo中的zookeeper客戶端升級到最新的版本,以修正老版本中包含的bug。
7、支持完全基于Java代碼的Dubbo配置:基于Spring的Java Config,實現(xiàn)完全無XML的純Java代碼方式來配置dubbo
8、調(diào)整Demo應(yīng)用:暫時將dubbo的demo應(yīng)用調(diào)整并改寫以主要演示REST功能、Dubbo協(xié)議的新序列化方式、基于Java代碼的Spring配置等等。
9、修正了dubbo的bug 包括配置、序列化、管理界面等等的bug。
4.Dubbo框架

1、Provider:暴露服務(wù)的服務(wù)提供方。 Consumer: 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方。
2、Registry:服務(wù)注冊與發(fā)現(xiàn)的注冊中心。 Monitor: 統(tǒng)計服務(wù)的調(diào)用次調(diào)和調(diào)用時間的監(jiān)控中心。
3、Container: 服務(wù)運(yùn)行容器
5.Dubbo的調(diào)用關(guān)系
1、服務(wù)容器負(fù)責(zé)啟動,加載,運(yùn)行服務(wù)提供者。
2、服務(wù)提供者在啟動時,向注冊中心注冊自己提供的服務(wù)。
3、服務(wù)消費(fèi)者在啟動時,向注冊中心訂閱自己所需的服務(wù)。
4、注冊中心返回服務(wù)提供者地址列表給消費(fèi)者,如果有變更,注冊中心將基于長連接推送變更數(shù)據(jù)給消費(fèi)者。
5、服務(wù)消費(fèi)者,從提供者地址列表中,基于軟負(fù)載均衡算法,選一臺提供者進(jìn)行調(diào)用,如果調(diào)用失敗,再選另一臺調(diào)用。
6、服務(wù)消費(fèi)者和提供者,在內(nèi)存中累計調(diào)用次數(shù)和調(diào)用時間,定時每分鐘發(fā)送一次統(tǒng)計數(shù)據(jù)到監(jiān)控中心。
6.Dubbo特點
http://www.cnblogs.com/juncaoit/p/7567657.html
7.Dubbo調(diào)用方式
- 異步調(diào)用
基于NIO的非阻塞實現(xiàn)并行調(diào)用,客戶端不需要啟動多線程即可完成并行調(diào)用多個遠(yuǎn)程服務(wù),相對多線程開銷較小

- 本地調(diào)用
本地調(diào)用,使用了Injvm協(xié)議,是一個偽協(xié)議,它不開啟端口,不發(fā)起遠(yuǎn)程調(diào)用,只在JVM內(nèi)直接關(guān)聯(lián),但執(zhí)行Dubbo的Filter鏈。
Define injvm protocol:
<dubbo:protocol name="injvm" />
Set default protocol:
<dubbo:provider protocol="injvm" />
Set service protocol:
<dubbo:service protocol="injvm" />
Use injvm first:(服務(wù)暴露與服務(wù)引用都需要聲明injvm=“true”)
<dubbo:consumer injvm="true" .../>
<dubbo:provider injvm="true" .../>
或
<dubbo:reference injvm="true" .../>
<dubbo:service injvm="true" .../>
8.Dubbo支持的注冊中心
- Multicast注冊中心
- Zookeeper注冊中心
- Redis注冊中心
- Simple注冊中心
Multicast:不需要啟動任何中心節(jié)點,只要廣播地址一樣,就可以互相發(fā)現(xiàn)組播受網(wǎng)絡(luò)結(jié)構(gòu)限制,只適合小規(guī)模應(yīng)用或開發(fā)階段使用。
組播地址段: 224.0.0.0 - 239.255.255.255
Zookeeper:是Apacahe Hadoop的子項目,是一個樹型的目錄服務(wù),支持變更推送,適合作為Dubbo服務(wù)的注冊中心,工業(yè)強(qiáng)度較高只需搭一個原生的Zookeeper服務(wù)器,
并將Provider和Consumer里的dubbo.properties中的dubbo.registry.addrss的值改為zookeeper://127.0.0.1:2181即可使用阿里內(nèi)部并沒有采用Zookeeper做為注冊中心,而是使用自己實現(xiàn)的基于數(shù)據(jù)庫的注冊中心,即:Zookeeper注冊中心并沒有在阿里內(nèi)部長時間運(yùn)行的可靠性保障,其可靠性依賴于Zookeeper本身的可靠性。
ZooKeeper集群由一組Server節(jié)點組成,這一組Server節(jié)點中存在一個角色為Leader的節(jié)點,其他節(jié)點都為Follower。當(dāng)客戶端Client連接到ZooKeeper集群,并且執(zhí)行寫請求時,這些請求會被發(fā)送到Leader節(jié)點上,然后Leader節(jié)點上數(shù)據(jù)變更會同步到集群中其他的Follower節(jié)點。

流程說明:
- 服務(wù)提供者啟動時
- 向/dubbo/com.foo.BarService/providers目錄下寫入自己的URL地址。
- 服務(wù)消費(fèi)者啟動時
- 訂閱/dubbo/com.foo.BarService/providers目錄下的提供者URL地址。
- 并向/dubbo/com.foo.BarService/consumers目錄下寫入自己的URL地址。
- 監(jiān)控中心啟動時
- 訂閱/dubbo/com.foo.BarService目錄下的所有提供者和消費(fèi)者URL地址。
- 服務(wù)提供者啟動時
支持以下功能:
- 當(dāng)提供者出現(xiàn)斷電等異常停機(jī)時,注冊中心能自動刪除提供者信息。
- 當(dāng)注冊中心重啟時,能自動恢復(fù)注冊數(shù)據(jù),以及訂閱請求。
- 當(dāng)會話過期時,能自動恢復(fù)注冊數(shù)據(jù),以及訂閱請求。
- 當(dāng)設(shè)置<dubbo:registry check="false" />時,記錄失敗注冊和訂閱請求,后臺定時重試。
- 可通過<dubbo:registry username="admin" password="1234" />設(shè)置zookeeper登錄信息。
- 可通過<dubbo:registry group="dubbo" />設(shè)置zookeeper的根節(jié)點,不設(shè)置將使用無根樹。
- 支持號通配符<dubbo:reference group="" version="*" />,可訂閱服務(wù)的所有分組和所有版本的提供者
在provider和consumer中增加zookeeper客戶端jar包依賴
支持zkclient和curator兩種Zookeeper客戶端實現(xiàn)
Simple注冊中心:
注冊中心本身就是一個普通的Dubbo服務(wù),可以減少第三方依賴,使整體通訊方式一致。
9.Dubbo支持的遠(yuǎn)程通信協(xié)議
- Mina
- Netty
- Grizzly
10.Dubbo支持的遠(yuǎn)程調(diào)用協(xié)議
- Dubbo協(xié)議
- Hessian協(xié)議
- HTTP協(xié)議
- RMI協(xié)議
- WebService協(xié)議
- Thrift協(xié)議
- Memcached協(xié)議
- Redis協(xié)議
在通信過程中,不同的服務(wù)等級一般對應(yīng)著不同的服務(wù)質(zhì)量,那么選擇合適的協(xié)議便是一件非常重要的事情。
11.Dubbo的容錯
在集群調(diào)用失敗時,Dubbo提供了多種容錯方案,缺省為failover重試。
Failover Cluster
失敗自動切換,當(dāng)出現(xiàn)失敗,重試其它服務(wù)器。(缺省)
通常用于讀操作,但重試會帶來更長延遲。
可通過retries=“2”來設(shè)置重試次數(shù)(不含第一次)。Failfast Cluster
快速失敗,只發(fā)起一次調(diào)用,失敗立即報錯。
通常用于非冪等性的寫操作,比如新增記錄。Failsafe Cluster
失敗安全,出現(xiàn)異常時,直接忽略。
通常用于寫入審計日志等操作。Failback Cluster
失敗自動恢復(fù),后臺記錄失敗請求,定時重發(fā)。
通常用于消息通知操作。Forking Cluster
并行調(diào)用多個服務(wù)器,只要一個成功即返回。
通常用于實時性要求較高的讀操作,但需要浪費(fèi)更多服務(wù)資源。
可通過forks=“2”來設(shè)置最大并行數(shù)。Broadcast Cluster
廣播調(diào)用所有提供者,逐個調(diào)用,任意一臺報錯則報錯。(2.1.0開始支持)
通常用于通知所有提供者更新緩存或日志等本地資源信息。
12.負(fù)載均衡
13.源碼結(jié)構(gòu)

各個模塊之間的關(guān)系:

dubbo-common 公共邏輯模塊,包括Util類和通用模型。
dubbo-remoting 遠(yuǎn)程通訊模塊,相當(dāng)于Dubbo協(xié)議的實現(xiàn),如果RPC用RMI協(xié)議則不需要使用此包。
dubbo-rpc 遠(yuǎn)程調(diào)用模塊,抽象各種協(xié)議,以及動態(tài)代理,只包含一對一的調(diào)用,不關(guān)心集群的管理。
dubbo-cluster 集群模塊,將多個服務(wù)提供方偽裝為一個提供方,包括:負(fù)載均衡、容錯、路由等,集群的地址列表可以是靜態(tài)配置的,也可以是由注冊中心下發(fā)。
dubbo-registry 注冊中心模塊,基于注冊中心下發(fā)地址的集群方式,以及對各種注冊中心的抽象。
dubbo-monitor 監(jiān)控模塊,統(tǒng)計服務(wù)調(diào)用次數(shù),調(diào)用時間的,調(diào)用鏈跟蹤的服務(wù)。
dubbo-config 配置模塊,是Dubbo對外的API,用戶通過Config使用Dubbo,隱藏Dubbo所有細(xì)節(jié)。
dubbo-container 容器模塊,是一個Standalone的容器,以簡單的Main加載Spring啟動,因為服務(wù)通常不需要Tomcat/JBoss等Web容器的特性,沒必要用Web容器去加載服務(wù)。