天天看點

Dubbo

apache dubbo (incubating) |ˈdʌbəʊ| 是一款高性能、輕量級的開源 java rpc 架構,它提供了三大核心能力:面向接口的遠端方法調用,智能容錯和負載均衡,以及服務自動注冊和發現。

dubbo 是一個分布式服務架構,緻力于提供高性能和透明化的 rpc 遠端服務調用方案、服務治理方案。

面向接口代理:調用接口的方法,在 a 伺服器調用 b 伺服器的方法,由 dubbo 實作對 b 的調用,無需關心實作的細節,就像 mybatis 通路 dao 的接口,可以操作資料庫一樣。不用關心 dao 接口方法的實作。這樣開發是友善,舒服的。

Dubbo

服務提供者(provider):暴露服務的服務提供方,服務提供者在啟動時,向注冊中心注冊自己提供的服務。

服務消費者(consumer): 調用遠端服務的服務消費方,服務消費者在啟動時,向注冊中心訂閱自己所需的服務,服務消費者,從提供者位址清單中,基于軟負載均衡算法,選一台提供者進行調用,如果調用失敗,再選另一台調用。

注冊中心(registry):注冊中心傳回服務提供者位址清單給消費者,如果有變更,注冊

中心将基于長連接配接推送變更資料給消費者。

監控中心(monitor):服務消費者和提供者,在記憶體中累計調用次數和調用時間,定時

每分鐘發送一次統計資料到監控中心。

⚫ 服務容器負責啟動,加載,運作服務提供者。

⚫ 服務提供者在啟動時,向注冊中心注冊自己提供的服務。

⚫ 服務消費者在啟動時,向注冊中心訂閱自己所需的服務。

⚫ 注冊中心傳回服務提供者位址清單給消費者,如果有變更,注冊中心将基于長連接配接推送變更資料給消費者。

⚫ 服務消費者,從提供者位址清單中,基于軟負載均衡算法,選一台提供者進行調用,如果調用失敗,再選另一台調用。

⚫ 服務消費者和提供者,在記憶體中累計調用次數和調用時間,定時每分鐘發送一次統計資料到監控中心。

支援多種協定:dubbo , hessian , rmi , http, webservice , thrift , memcached , redis。dubbo 官方推薦使用 dubbo 協定。dubbo 協定預設端口 20880

使用 dubbo 協定,spring 配置檔案加入:

<code>&lt;dubbo:protocol name="dubbo" port="20880" /&gt;</code>

點對點的直連項目:消費者直接通路服務提供者,沒有注冊中心。消費者必須指定服務提供者的通路位址(url)。

消費者直接通過 url 位址通路固定的服務提供者。這個 url 位址是不變的。

<code>&lt;dubbo:service interface="com.hzc.service.userservice" ref="userservice" registry="n/a"/&gt;</code>使用直連方式registry的屬性值為<code>n/a</code>.

建議将服務接口、服務模型、服務異常等均放在公共包中。

服務接口盡可能大粒度,每個服務方法應代表一個功能,而不是某功能的一個步驟,否則将面臨分布式事務問題,dubbo 暫未提供分布式事務支援。

服務接口建議以業務場景為機關劃分,并對相近業務做抽象,防止接口數量爆炸。

不建議使用過于抽象的通用接口,如:map query(map),這樣的接口沒有明确語義,會給後期維護帶來不便。

每個接口都應定義版本号,為後續不相容更新提供可能,如:<code>&lt;dubbo:service interface="com.xxx.xxxservice" version="1.0" /&gt;。</code>建議使用兩位版本号,要變更服務版本。先更新一半提供者為新版本,再将消費者全

部升為新版本,然後将剩下的一半提供者升為新版本。

<code>&lt;dubbo:application name="服務的名稱"/&gt;</code>聲明dubbo服務提供者:保證唯一性.

<code>&lt;dubbo:registry address="ip:port" protocol="協定"/&gt;</code>

例如:

<code>&lt;dubbo:registry address="zookeeper://localhost:2181" /&gt;</code>

<code>&lt;dubbo:service interface="服務接口全限定名" ref="服務實作對象 bean"&gt;</code>

<code>&lt;dubbo:service interface="com.hzc.service.userservice" ref="userservice" /&gt;</code>

<code>&lt;dubbo:reference id="服務引用 bean 的 id" interface="服務接口名"/&gt;</code>

<code>&lt;dubbo:reference id="userservice" interface="com.hzc.service.userservice" /&gt;</code>

對于服務提供方,它需要釋出服務,而且由于應用系統的複雜性,服務的數量、類型也不斷膨脹;對于服務消費方,它最關心如何擷取到它所需要的服務,而面對複雜的應用系統,需要管理大量的服務調用。而且,對于服務提供方和服務消費方來說,他們還有可能兼具這兩種角色,即需要提供服務,有需要消費服務。 通過将服務統一管理起來,可以有效地優化内部應用對服務釋出/使用的流程和管理。服務注冊中心可以通過特定協定來完成服務對外的統一。dubbo 提供的注冊中心有如下幾種類型可供選:

multicast 注冊中心:多點傳播方式

redis 注冊中心:使用 redis 作為注冊中心

simple 注冊中心:就是一個 dubbo 服務。作為注冊中心。提供查找服務的功能。

zookeeper 注冊中心:使用 zookeeper 作為注冊中心

推薦使用 zookeeper 注冊中心。

Dubbo

概念:

高可用性(high availability):通常來描述一個系統經過專門的設計,進而減少不能提供服務的時間,而保持其服務的高度可用性。zookeeper 是高可用的,健壯的。zookeeper 當機,正在運作中的 dubbo 服務仍然可以正常通路。

健壯性:

⚫ 監控中心宕掉不影響使用,隻是丢失部分采樣資料

⚫ 注冊中心仍能通過緩存提供服務清單查詢,但不能注冊新服務

⚫ 服務提供者無狀态,任意一台宕掉後,不影響使用

⚫ 服務提供者全部宕掉後,服務消費者應用将無法使用,并無限次重連等待服務提供者恢複

示範操作:

1. 先啟動 zookeeper, dubbo 服務提供者,dubbo 服務消費者。

2. 測試正常通路

3. 停止 zookeeper

4. 測試消費者仍然可以通路提供者

每個接口都應定義版本号,為後續不相容更新提供可能。當一個接口有不同的實作,項目早期使用的一個實作類, 之後建立接口的新的實作類。區分不同的接口實作使用 version。特别是項目需要把早期接口的實作全部換位新的實作類,也需要使用 version.可以用版本号從早期的接口實作過渡到新的接口實作,版本号不同的服務互相間不引用。可以按照以下的步驟進行版本遷移:

在低壓力時間段,先更新一半提供者為新版本

再将所有消費者更新為新版本

然後将剩下的一半提供者更新為新版本

舉例:

提供者:

<code>&lt;dubbo:service interface="com.hzc.service.userservice" ref="userservice" version = "1.0"/&gt;</code>

<code>&lt;dubbo:service interface="com.hzc.service.orderservice" ref="orderservice" version = "2.0"/&gt;</code>

消費者:

<code>&lt;dubbo:reference id="userservice" interface="com.hzc.service.userservice" version = "1.0"/&gt;</code>

<code>&lt;dubbo:reference id="orderservice" interface="com.hzc.service.orderservice" version = "1.0"/&gt;</code>

dubbo 預設會在啟動時檢查依賴的服務是否可用,不可用時會抛出異常,阻止 spring 初始化完成,以便上線時,能及早發現問題,預設 check=true。通過 check="false"關閉檢查,比如,測試時,有些服務不關心,或者出現了循環依賴,必須有一方先啟動。

例 1:關閉某個服務的啟動時檢查

<code>&lt;dubbo:reference interface="com.foo.barservice" check="false" /&gt;</code>

例 2:關閉注冊中心啟動時檢查

<code>&lt;dubbo:registry check="false" /&gt;</code>

預設啟動服務時檢查注冊中心存在并已運作。注冊中心不啟動會報錯。

消費者通路提供者,如果通路失敗,則切換重試通路其它伺服器,但重試會帶來更長延遲。通路時間變長,使用者的體驗較差。多次重新通路伺服器有可能通路成功。可通過 retries="2" 來設定重試次數(不含第一次)。

<code>&lt;dubbo:service retries="2" /&gt;</code>

<code>&lt;dubbo:reference retries="2" /&gt;</code>

由于網絡或服務端不可靠,會導緻調用出現一種不确定的中間狀态(逾時)。為了避免逾時導緻用戶端資源(線程)挂起耗盡,必須設定逾時時間。timeout:調用遠端服務逾時時間(毫秒)

<code>&lt;dubbo:server interface="com.foo.barservice" timeout="2000" /&gt;</code>

<code>&lt;dubbo:reference interface="com.foo.barservice" timeout="2000" /&gt;</code>

繼續閱讀