SOA(Service-Oriented Architecture),即面向服務的架構。
SOA是一種粗粒度、鬆耦合服務架構,服務之間經過簡單、精肯定義接口進行通信,不涉及底層編程接口和通信模型。java
SOA能夠看做是B/S模型、XML(標準通用標記語言的子集)/Web Service技術以後的天然延伸。redis
阿里巴巴的Dubbo是SOA的典型實現。算法
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)是服務登記的標準。數據庫
具備中立的接口定義(沒有強制綁定到特定的實現上)的特徵稱爲服務之間的鬆耦合。鬆耦合系統的好處有兩點,一點是它的靈活性,另外一點是,當組成整個應用程序的每一個服務的內部結構和實現逐漸地發生改變時,它可以繼續存在。與之相反,緊耦合意味着應用程序的不一樣組件之間的接口與其功能和結構是緊密相連的,於是當須要對部分或整個應用程序進行某種形式的更改時,它們就顯得很是脆弱。編程
Dubbo 是阿里巴巴公司開源的一個高性能優秀的服務框架,使得應用可經過高性能的 RPC 實現服務的輸出和輸入功能,以及SOA服務治理方案。緩存
(1)主要核心部件:
Remoting: 網絡通訊框架,實現了 sync-over-async 和 request-response 消息機制.
RPC: 一個遠程過程調用的抽象,支持負載均衡、容災和集羣功能
Registry: 服務目錄框架用於服務的註冊和服務事件發佈和訂閱服務器
(2)幾點個人理解網絡
Dubbo使用Hessian協議實現,這裏的高性能的 RPC指的就是Hessian協;架構
Dubbo是一個遠程服務調用在分佈式系統中的一個實現框架,再也不使用之前的Web service方式,而是經過服務提供者和消費者的方式調用;
而且經過在註冊中心註冊,消費者無需知道提供方的地址,能夠經過註冊中心讀取,註冊中心做爲中間層,在中間層又能夠實現負載均衡等,
這樣就不須要負載均衡硬件,真正的實現大規模分佈式系統的遠程服務調用;
同時在註冊中心宕機的狀況下,支持服務提供者和消費者直接經過地址調用,在容錯上表現較好;
而且改變服務提供者不須要通知服務消費者,實現了平滑刪除和添加;
(1)設計結構
Provider:
暴露服務方稱之爲「服務提供者」。
Consumer:
調用遠程服務方稱之爲「服務消費者」。
Registry:
服務註冊與發現的中心目錄服務稱之爲「服務註冊中心」。
Monitor:
統計服務的調用次調和調用時間的日誌服務稱之爲「服務監控中心」。
Container:
服務運行容器。
(2)調用過程
(3)Dubbo的特性
連通性:
健狀性:
伸縮性:
當服務調用失敗時(好比響應超時),根據咱們的業務不一樣,可使用不一樣的策略來應對這種失敗。
好比咱們調用的服務是一個查詢服務,不會修改數據庫,那麼能夠給該服務設置容錯方式爲failover , 當調用失敗時,自動切換到其餘服務提供者去調用,當失敗次數超過指定重試次數,那麼就拋出錯誤;
若是服務是更新數據的服務,那就不能使用失敗重試的方式了, 由於這樣可能產生數據重複修改的問題,好比調用提供者A的插入用戶方法,可是該方法業務邏輯複雜,執行過程很慢,致使響應超時, 那麼此時若是再去調用另一個服務提供者的插入用戶方法,將會又重複插入同一個用戶。 對於這種類型的服務,可使用容錯方式爲failfast,若是第一次調用失敗,當即報錯,不須要重試;
另外還有下面幾種容錯類型:
failsafe 出現錯誤,直接忽略,不重試也不報錯
failback 失敗後不報錯,會將該失敗請求,定時重發,適合消息通知類型的服務
forking 並行調用多個服務器,只要在某一臺提供者上面成功,那麼方法返回, 適合實時性要求較高的查詢服務, 可是要犧牲性能。由於每臺服務器會作同一個操做
broadcast 廣播調用全部服務提供者,逐個調用,任意一臺報錯則報錯。 適合與更新每臺提供者上面的緩存這種類型的服務。
dubbo提供了多種協議給用戶選擇, 如dubbo、hessian、rmi 。 並可爲每一個服務指定不一樣的傳輸協議,粒度能夠細化到方法, 不一樣服務在性能上適用不一樣協議進行傳輸,好比大數據用短鏈接協議,小數據大併發用長鏈接協議。
Hessian、spring httpinvoke等。
相比其餘同類組件,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配置文件中能夠經過制定版本實現鏈接制定提供者,也就是經過服務版本能夠控制服務的不兼容升級;當同一個服務有多種實現時,可使用服務分組進行區分。