面向服務的架構SOA

1、什麼是SOA

SOA(Service-Oriented Architecture),即面向服務的架構。
SOA是一種粗粒度、鬆耦合服務架構,服務之間經過簡單、精肯定義接口進行通信,不涉及底層編程接口和通信模型。java

SOA能夠看做是B/S模型、XML(標準通用標記語言的子集)/Web Service技術以後的天然延伸。redis

阿里巴巴的Dubbo是SOA的典型實現。算法

(1)基本特徵

SOA的實施具備幾個鮮明的基本特徵:
粗粒度的服務接口分級
鬆散耦合
可重用的服務
服務接口設計管理
標準化的服務接口
支持各類消息模式
精肯定義的服務契約spring

SOA服務具備平臺獨立的自我描述XML文檔。Web服務描述語言(WSDL, Web S
ervices Description Language)是用於描述服務的標準語言。
SOA 服務用消息進行通訊,該消息一般使用XML Schema來定義(也叫作XSD, XML Schema Definition)。消費者和提供者或消費者和服務之間的通訊多見於不知道提供者的環境中。服務間的通信也能夠看做企業內部處理的關鍵商業文檔。
在一個企業內部,SOA服務經過一個扮演目錄列表(directory listing)角色的登記處(Registry)來進行維護。應用程序在登記處(Registry)尋找並調用某項服務。統一描述,定義和集成(UDDI, Universal Description, Definition, and Integration)是服務登記的標準。數據庫

(2)鬆耦合系統

具備中立的接口定義(沒有強制綁定到特定的實現上)的特徵稱爲服務之間的鬆耦合。鬆耦合系統的好處有兩點,一點是它的靈活性,另外一點是,當組成整個應用程序的每一個服務的內部結構和實現逐漸地發生改變時,它可以繼續存在。與之相反,緊耦合意味着應用程序的不一樣組件之間的接口與其功能和結構是緊密相連的,於是當須要對部分或整個應用程序進行某種形式的更改時,它們就顯得很是脆弱。編程

 

2、Dubbo是什麼

Dubbo 是阿里巴巴公司開源的一個高性能優秀的服務框架,使得應用可經過高性能的 RPC 實現服務的輸出和輸入功能,以及SOA服務治理方案。緩存

(1)主要核心部件:
Remoting: 網絡通訊框架,實現了 sync-over-async 和 request-response 消息機制.
RPC: 一個遠程過程調用的抽象,支持負載均衡、容災和集羣功能
Registry: 服務目錄框架用於服務的註冊和服務事件發佈和訂閱服務器

(2)幾點個人理解網絡

Dubbo使用Hessian協議實現,這裏的高性能的 RPC指的就是Hessian協;架構

Dubbo是一個遠程服務調用在分佈式系統中的一個實現框架,再也不使用之前的Web service方式,而是經過服務提供者和消費者的方式調用;

而且經過在註冊中心註冊,消費者無需知道提供方的地址,能夠經過註冊中心讀取,註冊中心做爲中間層,在中間層又能夠實現負載均衡等,

這樣就不須要負載均衡硬件,真正的實現大規模分佈式系統的遠程服務調用;

同時在註冊中心宕機的狀況下,支持服務提供者和消費者直接經過地址調用,在容錯上表現較好;

而且改變服務提供者不須要通知服務消費者,實現了平滑刪除和添加;

 

3、Dubbo解決了哪些問題

  • 透明化的遠程方法調用,就像調用本地方法同樣調用遠程方法,只需簡單配置,沒有任何API侵入。
  • 軟負載均衡及容錯機制,可在內網替代F5等硬件負載均衡器,下降成本,減小單點。
  • 服務自動註冊與發現,再也不須要寫死服務提供方地址,註冊中心基於接口名查詢服務提供者的IP地址,而且可以平滑添加或刪除服務提供者。

4、Dubbo的設計結構和工做原理

(1)設計結構

Provider:
暴露服務方稱之爲「服務提供者」。
Consumer:
調用遠程服務方稱之爲「服務消費者」。
Registry:
服務註冊與發現的中心目錄服務稱之爲「服務註冊中心」。
Monitor:

統計服務的調用次調和調用時間的日誌服務稱之爲「服務監控中心」。

Container:
服務運行容器。

(2)調用過程

  1. 服務容器負責啓動,加載,運行服務提供者。
  2. 服務提供者在啓動時,向註冊中心註冊本身提供的服務。
  3. 服務消費者在啓動時,向註冊中心訂閱本身所需的服務。
  4. 註冊中心返回服務提供者地址列表給消費者,若是有變動,註冊中心將基於長鏈接推送變動數據給消費者。
  5. 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,若是調用失敗,再選另外一臺調用。
  6.  服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。

(3)Dubbo的特性

連通性:

  • 註冊中心負責服務地址的註冊與查找,至關於目錄服務,服務提供者和消費者只在啓動時與註冊中心交互,註冊中心不轉發請求,壓力較小
  • 監控中心負責統計各服務調用次數,調用時間等,統計先在內存彙總後每分鐘一次發送到監控中心服務器,並以報表展現
  • 服務提供者向註冊中心註冊其提供的服務,並彙報調用時間到監控中心,此時間不包含網絡開銷
  • 服務消費者向註冊中心獲取服務提供者地址列表,並根據負載算法直接調用提供者,同時彙報調用時間到監控中心,此時間包含網絡開銷
  • 註冊中心,服務提供者,服務消費者三者之間均爲長鏈接,監控中心除外
  • 註冊中心經過長鏈接感知服務提供者的存在,服務提供者宕機,註冊中心將當即推送事件通知消費者
  • 註冊中心和監控中心所有宕機,不影響已運行的提供者和消費者,消費者在本地緩存了提供者列表
  • 註冊中心和監控中心都是可選的,服務消費者能夠直連服務提供者

健狀性:

  • 監控中心宕掉不影響使用,只是丟失部分採樣數據
  • 數據庫宕掉後,註冊中心仍能經過緩存提供服務列表查詢,但不能註冊新服務
  • 註冊中心對等集羣,任意一臺宕掉後,將自動切換到另外一臺
  • 註冊中心所有宕掉後,服務提供者和服務消費者仍能經過本地緩存通信
  • 服務提供者無狀態,任意一臺宕掉後,不影響使用
  • 服務提供者所有宕掉後,服務消費者應用將沒法使用,並沒有限次重連等待服務提供者恢復

伸縮性:

  • 註冊中心爲對等集羣,可動態增長機器部署實例,全部客戶端將自動發現新的註冊中心
  • 服務提供者無狀態,可動態增長機器部署實例,註冊中心將推送新的服務提供者信息給消費者

5、Dubbo的集羣容錯機制

當服務調用失敗時(好比響應超時),根據咱們的業務不一樣,可使用不一樣的策略來應對這種失敗。

好比咱們調用的服務是一個查詢服務,不會修改數據庫,那麼能夠給該服務設置容錯方式爲failover , 當調用失敗時,自動切換到其餘服務提供者去調用,當失敗次數超過指定重試次數,那麼就拋出錯誤;
若是服務是更新數據的服務,那就不能使用失敗重試的方式了, 由於這樣可能產生數據重複修改的問題,好比調用提供者A的插入用戶方法,可是該方法業務邏輯複雜,執行過程很慢,致使響應超時, 那麼此時若是再去調用另一個服務提供者的插入用戶方法,將會又重複插入同一個用戶。 對於這種類型的服務,可使用容錯方式爲failfast,若是第一次調用失敗,當即報錯,不須要重試;

另外還有下面幾種容錯類型:
failsafe 出現錯誤,直接忽略,不重試也不報錯
failback 失敗後不報錯,會將該失敗請求,定時重發,適合消息通知類型的服務
forking 並行調用多個服務器,只要在某一臺提供者上面成功,那麼方法返回, 適合實時性要求較高的查詢服務, 可是要犧牲性能。由於每臺服務器會作同一個操做
broadcast 廣播調用全部服務提供者,逐個調用,任意一臺報錯則報錯。 適合與更新每臺提供者上面的緩存這種類型的服務。

6、Dubbo使用的多協議

dubbo提供了多種協議給用戶選擇, 如dubbo、hessian、rmi 。 並可爲每一個服務指定不一樣的傳輸協議,粒度能夠細化到方法, 不一樣服務在性能上適用不一樣協議進行傳輸,好比大數據用短鏈接協議,小數據大併發用長鏈接協議。

7、能夠替代Dubbo的組件

Hessian、spring httpinvoke等。

8、Dubbo的特性

相比其餘同類組件,Dubbo有本身的一些優點:

(1)服務註冊中心
相比Hessian類RPC框架,Dubbo有本身的服務中心, 寫好的服務能夠註冊到服務中心, 客戶端從服務中心尋找服務,而後再到相應的服務提供者機器獲取服務
經過服務中心能夠實現集羣、負載均衡、高可用(容錯) 等重要功能。

服務中心通常使用zookeeper實現, 也有redis和其餘一些方式 。 以使用zookeeper做爲服務中心爲例, 服務提供者啓動後會在zookeeper的 /dubbo節點下建立提供的服務節點,包含服務提供者ip、port等信息。 服務提供者關閉時會從zookeeper中移除對應的服務。

服務使用者會從註冊中心zookeeper中尋找服務,同一個服務可能會有多個提供者, Dubbo會幫咱們找到合適的服務提供者,也就是針對服務提供者的負載均衡。

(2)負載均衡
當同一個服務有多個提供者在提供服務時, 客戶端如何正確的選擇提供者實現負載均衡dubbo也給咱們提供了幾種方案:
random 隨機選提供者,並能夠給提供者設置權重
roundrobin 輪詢選擇提供者
leastactive 最少活躍調用數,相同活躍數的隨機,活躍數指調用先後計數差。使慢的提供者收到更少請求,由於越慢的提供者的調用先後計數差會越大。
consistenthash 一致性hash,相同參數的請求發到同一臺機器上

(3)簡化測試,容許直連提供者
在開發階段爲了方便測試,一般系統客戶端能指定調用某個服務提供者,那麼能夠在引用服務時加一個url參數去指定服務提供者

1
2
<dubbo:reference
id= "xxxService" interface = "com.alibaba.xxx.XxxService" url= "dubbo://localhost:20890" />

(4)服務版本,服務分組在Dubbo配置文件中能夠經過制定版本實現鏈接制定提供者,也就是經過服務版本能夠控制服務的不兼容升級;當同一個服務有多種實現時,可使用服務分組進行區分。

相關文章
相關標籤/搜索