面向服務的架構SOA
一、什麽是SOA
SOA(Service-Oriented Architecture),即面向服務的架構。
SOA是一種粗粒度、松耦合服務架構,服務之間通過簡單、精確定義接口進行通訊,不涉及底層編程接口和通訊模型。
SOA可以看作是B/S模型、XML(標準通用標記語言的子集)/Web Service技術之後的自然延伸。
阿裏巴巴的Dubbo是SOA的典型實現。
(1)基本特征
SOA的實施具有幾個鮮明的基本特征:
粗粒度的服務接口分級
松散耦合
可重用的服務
服務接口設計管理
標準化的服務接口
支持各種消息模式
精確定義的服務契約
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)松耦合系統
具有中立的接口定義(沒有強制綁定到特定的實現上)的特征稱為服務之間的松耦合。松耦合系統的好處有兩點,一點是它的靈活性,另一點是,當組成整個應用程序的每個服務的內部結構和實現逐漸地發生改變時,它能夠繼續存在。與之相反,緊耦合意味著應用程序的不同組件之間的接口與其功能和結構是緊密相連的,因而當需要對部分或整個應用程序進行某種形式的更改時,它們就顯得非常脆弱。
二、Dubbo是什麽
Dubbo 是阿裏巴巴公司開源的一個高性能優秀的服務框架,使得應用可通過高性能的 RPC 實現服務的輸出和輸入功能,以及SOA服務治理方案。
(1)主要核心部件:
Remoting: 網絡通信框架,實現了 sync-over-async 和 request-response 消息機制.
RPC: 一個遠程過程調用的抽象,支持負載均衡、容災和集群功能
Registry: 服務目錄框架用於服務的註冊和服務事件發布和訂閱
(2)幾點我的理解
Dubbo使用Hessian協議實現,這裏的高性能的 RPC指的就是Hessian協;
Dubbo是一個遠程服務調用在分布式系統中的一個實現框架,不再使用以前的Web service方式,而是通過服務提供者和消費者的方式調用;
並且通過在註冊中心註冊,消費者無需知道提供方的地址,可以通過註冊中心讀取,註冊中心作為中間層,在中間層又可以實現負載均衡等,
這樣就不需要負載均衡硬件,真正的實現大規模分布式系統的遠程服務調用;
同時在註冊中心宕機的情況下,支持服務提供者和消費者直接通過地址調用,在容錯上表現較好;
並且改變服務提供者不需要通知服務消費者,實現了平滑刪除和添加;
三、Dubbo解決了哪些問題
- 透明化的遠程方法調用,就像調用本地方法一樣調用遠程方法,只需簡單配置,沒有任何API侵入。
- 軟負載均衡及容錯機制,可在內網替代F5等硬件負載均衡器,降低成本,減少單點。
- 服務自動註冊與發現,不再需要寫死服務提供方地址,註冊中心基於接口名查詢服務提供者的IP地址,並且能夠平滑添加或刪除服務提供者。
四、Dubbo的設計結構和工作原理
(1)設計結構
Provider:
暴露服務方稱之為“服務提供者”。
Consumer:
調用遠程服務方稱之為“服務消費者”。
Registry:
服務註冊與發現的中心目錄服務稱之為“服務註冊中心”。
Monitor:
統計服務的調用次調和調用時間的日誌服務稱之為“服務監控中心”。
Container:
服務運行容器。
(2)調用過程
- 服務容器負責啟動,加載,運行服務提供者。
- 服務提供者在啟動時,向註冊中心註冊自己提供的服務。
- 服務消費者在啟動時,向註冊中心訂閱自己所需的服務。
- 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據給消費者。
- 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。
- 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。
(3)Dubbo的特性
連通性:
- 註冊中心負責服務地址的註冊與查找,相當於目錄服務,服務提供者和消費者只在啟動時與註冊中心交互,註冊中心不轉發請求,壓力較小
- 監控中心負責統計各服務調用次數,調用時間等,統計先在內存匯總後每分鐘一次發送到監控中心服務器,並以報表展示
- 服務提供者向註冊中心註冊其提供的服務,並匯報調用時間到監控中心,此時間不包含網絡開銷
- 服務消費者向註冊中心獲取服務提供者地址列表,並根據負載算法直接調用提供者,同時匯報調用時間到監控中心,此時間包含網絡開銷
- 註冊中心,服務提供者,服務消費者三者之間均為長連接,監控中心除外
- 註冊中心通過長連接感知服務提供者的存在,服務提供者宕機,註冊中心將立即推送事件通知消費者
- 註冊中心和監控中心全部宕機,不影響已運行的提供者和消費者,消費者在本地緩存了提供者列表
- 註冊中心和監控中心都是可選的,服務消費者可以直連服務提供者
健狀性:
- 監控中心宕掉不影響使用,只是丟失部分采樣數據
- 數據庫宕掉後,註冊中心仍能通過緩存提供服務列表查詢,但不能註冊新服務
- 註冊中心對等集群,任意一臺宕掉後,將自動切換到另一臺
- 註冊中心全部宕掉後,服務提供者和服務消費者仍能通過本地緩存通訊
- 服務提供者無狀態,任意一臺宕掉後,不影響使用
- 服務提供者全部宕掉後,服務消費者應用將無法使用,並無限次重連等待服務提供者恢復
伸縮性:
- 註冊中心為對等集群,可動態增加機器部署實例,所有客戶端將自動發現新的註冊中心
- 服務提供者無狀態,可動態增加機器部署實例,註冊中心將推送新的服務提供者信息給消費者
五、Dubbo的集群容錯機制
當服務調用失敗時(比如響應超時),根據我們的業務不同,可以使用不同的策略來應對這種失敗。
比如我們調用的服務是一個查詢服務,不會修改數據庫,那麽可以給該服務設置容錯方式為failover , 當調用失敗時,自動切換到其他服務提供者去調用,當失敗次數超過指定重試次數,那麽就拋出錯誤;
如果服務是更新數據的服務,那就不能使用失敗重試的方式了, 因為這樣可能產生數據重復修改的問題,比如調用提供者A的插入用戶方法,但是該方法業務邏輯復雜,執行過程很慢,導致響應超時, 那麽此時如果再去調用另外一個服務提供者的插入用戶方法,將會又重復插入同一個用戶。 對於這種類型的服務,可以使用容錯方式為failfast,如果第一次調用失敗,立即報錯,不需要重試;
另外還有下面幾種容錯類型:
failsafe 出現錯誤,直接忽略,不重試也不報錯
failback 失敗後不報錯,會將該失敗請求,定時重發,適合消息通知類型的服務
forking 並行調用多個服務器,只要在某一臺提供者上面成功,那麽方法返回, 適合實時性要求較高的查詢服務, 但是要犧牲性能。因為每臺服務器會做同一個操作
broadcast 廣播調用所有服務提供者,逐個調用,任意一臺報錯則報錯。 適合與更新每臺提供者上面的緩存這種類型的服務。
六、Dubbo使用的多協議
dubbo提供了多種協議給用戶選擇, 如dubbo、hessian、rmi 。 並可為每個服務指定不同的傳輸協議,粒度可以細化到方法, 不同服務在性能上適用不同協議進行傳輸,比如大數據用短連接協議,小數據大並發用長連接協議。
七、可以替代Dubbo的組件
Hessian、spring httpinvoke等。
八、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配置文件中可以通過制定版本實現連接制定提供者,
也就是通過服務版本可以控制服務的不兼容升級;
當同一個服務有多種實現時,可以使用服務分組進行區分。
面向服務的架構SOA