一.背景
1.需要解決的問題
大規(guī)模服務(wù)化之前,應(yīng)用可能只是通過RMI或Hessian等工具,簡單的暴露和引用遠(yuǎn)程服務(wù),通過配置服務(wù)的URL地址進(jìn)行調(diào)用,通過F5等硬件進(jìn)行負(fù)載均衡。
(1) 當(dāng)服務(wù)越來越多時,服務(wù)URL配置管理變得非常困難,F(xiàn)5硬件負(fù)載均衡器的單點壓力也越來越大。
- 此時需要一個服務(wù)注冊中心,動態(tài)的注冊和發(fā)現(xiàn)服務(wù),使服務(wù)的位置透明。
- 并通過在消費方獲取服務(wù)提供方地址列表,實現(xiàn)軟負(fù)載均衡和Failover,降低對F5硬件負(fù)載均衡器的依賴,也能減少部分成本。
(2) 當(dāng)進(jìn)一步發(fā)展,服務(wù)間依賴關(guān)系變得錯蹤復(fù)雜,甚至分不清哪個應(yīng)用要在哪個應(yīng)用之前啟動,架構(gòu)師都不能完整的描述應(yīng)用的架構(gòu)關(guān)系。
- 這時,需要自動畫出應(yīng)用間的依賴關(guān)系圖,以幫助架構(gòu)師理清理關(guān)系。
(3) 接著,服務(wù)的調(diào)用量越來越大,服務(wù)的容量問題就暴露出來,這個服務(wù)需要多少機器支撐?什么時候該加機器?
- 為了解決這些問題,第一步,要將服務(wù)現(xiàn)在每天的調(diào)用量,響應(yīng)時間,都統(tǒng)計出來,作為容量規(guī)劃的參考指標(biāo)。
- 其次,要可以動態(tài)調(diào)整權(quán)重,在線上,將某臺機器的權(quán)重一直加大,并在加大的過程中記錄響應(yīng)時間的變化,直到響應(yīng)時間到達(dá)閥值,記錄此時的訪問量,再以此訪問量乘以機器數(shù)反推總?cè)萘俊?/li>
2.Dubbo維護(hù)調(diào)用關(guān)系
具體關(guān)系如下圖所示:

3.軟負(fù)載均衡
具體示意圖如下所示:

4.架構(gòu)演變過程
演變圖:

(1)單一應(yīng)用框架(ORM:Object Relationship Mapping 對象關(guān)系映射)
優(yōu)點:當(dāng)網(wǎng)站流量很小時,只需一個應(yīng)用,將所有功能如下單支付等都部署在一起,以減少部署節(jié)點和成本。
缺點:單一的系統(tǒng)架構(gòu),使得在開發(fā)過程中,占用的資源越來越多,而且隨著流量的增加越來越難以維護(hù)
架構(gòu)圖:

(2)垂直應(yīng)用框架(MVC: Model View Controller 即MVC框架)
優(yōu)點:垂直應(yīng)用架構(gòu)解決了單一應(yīng)用架構(gòu)所面臨的擴(kuò)容問題,流量能夠分散到各個子系統(tǒng)當(dāng)中,且系統(tǒng)的體積可控,一定程度上降低了開發(fā)人員之間協(xié)同以及維護(hù)的成本,提升了開發(fā)效率。
缺點:但是在垂直架構(gòu)中相同邏輯代碼需要不斷的復(fù)制,不能復(fù)用。
架構(gòu)圖:

(3)分布式應(yīng)用架構(gòu)(RPC:Remote Procedure Call 遠(yuǎn)程過程調(diào)用)
當(dāng)垂直應(yīng)用越來越多,應(yīng)用之間交互不可避免,將核心業(yè)務(wù)抽取出來,作為獨立的服務(wù),逐漸形成穩(wěn)定的服務(wù)中心
架構(gòu)圖:

(4)流動計算架構(gòu)(SOA:Service-Oriented Architecture 面向服務(wù)的架構(gòu))
隨著服務(wù)化的進(jìn)一步發(fā)展,服務(wù)越來越多,服務(wù)之間的調(diào)用和依賴關(guān)系也越來越復(fù)雜,誕生了面向服務(wù)的架構(gòu)體系(SOA),也因此衍生出了一系列相應(yīng)的技術(shù),如對服務(wù)提供、服務(wù)調(diào)用、連接處理、通信協(xié)議、序列化方式、服務(wù)發(fā)現(xiàn)、服務(wù)路由、日志輸出等行為進(jìn)行封裝的服務(wù)框架
(5)總結(jié):
1)單一應(yīng)用架構(gòu)
- 當(dāng)網(wǎng)站流量很小時,只需一個應(yīng)用,將所有功能都部署在一起,以減少部署節(jié)點和成本。
- 此時,用于簡化增刪改查工作量的 數(shù)據(jù)訪問框架(ORM) 是關(guān)鍵。
2)垂直應(yīng)用架構(gòu)
- 當(dāng)訪問量逐漸增大,單一應(yīng)用增加機器帶來的加速度越來越小,將應(yīng)用拆成互不相干的幾個應(yīng)用,以提升效率。
- 此時,用于加速前端頁面開發(fā)的 Web框架(MVC) 是關(guān)鍵。
3)分布式服務(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)鍵。
4)流動計算架構(gòu)
- 當(dāng)服務(wù)越來越多,容量的評估,小服務(wù)資源的浪費等問題逐漸顯現(xiàn),此時需增加一個調(diào)度中心基于訪問壓力實時管理集群容量,提高集群利用率。
- 此時,用于提高機器利用率的 資源調(diào)度和治理中心(SOA) 是關(guān)鍵。
二.Dubbo
1.簡介
- Dubbo是一個分布式服務(wù)框架,解決了上面的所面對的問題
- 高性能和透明化的RPC遠(yuǎn)程服務(wù)調(diào)用方案
2.SOA服務(wù)治理方案
每天為2千多個服務(wù)提供大于30億次訪問量支持,并被廣泛應(yīng)用于阿里巴巴集團(tuán)的各成員站點以及別的公司的業(yè)務(wù)中。
3.Dubbo的架構(gòu)圖

(1)節(jié)點角色說明:
- Provider: 暴露服務(wù)的服務(wù)提供方。
- Consumer: 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費方。
- Registry: 服務(wù)注冊與發(fā)現(xiàn)的注冊中心。
- Monitor: 統(tǒng)計服務(wù)的調(diào)用次調(diào)和調(diào)用時間的監(jiān)控中心。
- Container: 服務(wù)運行容器。
(2)調(diào)用關(guān)系說明
- 0 . 服務(wù)容器負(fù)責(zé)啟動,加載,運行服務(wù)提供者。
- 1 . 服務(wù)提供者在啟動時,向注冊中心注冊自己提供的服務(wù)。
- 2 . 服務(wù)消費者在啟動時,向注冊中心訂閱自己所需的服務(wù)。
- 3 . 注冊中心返回服務(wù)提供者地址列表給消費者,如果有變更,注冊中心將基于長連接推送變更數(shù)據(jù)給消費者。
- 4 . 服務(wù)消費者,從提供者地址列表中,基于軟負(fù)載均衡算法,選一臺提供者進(jìn)行調(diào)用,如果調(diào)用失敗,再選另一臺調(diào)用。
- 5 . 服務(wù)消費者和提供者,在內(nèi)存中累計調(diào)用次數(shù)和調(diào)用時間,定時每分鐘發(fā)送一次統(tǒng)計數(shù)據(jù)到監(jiān)控中心。
4.Dubbo提供的注冊中心
- Multicast注冊中心
- Zookeeper注冊中心(重點)
- Redis注冊中心
- Simple注冊中心
5.Dubbo優(yōu)缺點
(1)優(yōu)點
1. 透明化的遠(yuǎn)程方法調(diào)用
像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程方法;只需簡單配置,沒有任何API侵入。
2. 軟負(fù)載均衡及容錯機制
可在內(nèi)網(wǎng)替代nginx lvs等硬件負(fù)載均衡器。
3. 服務(wù)注冊中心自動注冊 & 配置管理
不需要寫死服務(wù)提供者地址,注冊中心基于接口名自動查詢提供者ip。使用類似zookeeper等分布式協(xié)調(diào)服務(wù)作為服務(wù)注冊中心,可以將絕大部分項目配置移入zookeeper集群。
4. 服務(wù)接口監(jiān)控與治理
Dubbo-admin與Dubbo-monitor提供了完善的服務(wù)接口管理與監(jiān)控功能,針對不同應(yīng)用的不同接口,可以進(jìn)行 多版本,多協(xié)議,多注冊中心管理。
(2)缺點
只支持JAVA語言