dubbo基礎(五)——dubbo接口的特性設置

dubbo的一些配置

之前的文章中寫了dubbo的初步使用和dubbo和springboot的使用整合,這裏來總結下dubbo框架暴露接口常用的配置項。

啓動時檢查

dubbo提供了在服務啓動時的一些檢查機制,這個機制包括consumer端對服務提供者的檢查、dubbo對註冊中心的檢查。可以看下官方文檔中dubbo:reference標籤中關於check屬性的配置。

可以看到是默認在啓動時檢查服務提供者是否存在,不可用時會拋出異常,組織spring初始化。

我們這裏可以將之前demo中的userService服務的消費者上配置check=true(默認就是true),來看看在不啓動服務提供者時的消費者控制檯的報錯:

是經典的No Provider錯誤。這裏官方文檔也對這個配置做了說明:

如果在配置文件中設置了dubbo.reference.check=false,則是強制改變所有reference的check值,就算配置中部分接口有聲明,也會被覆蓋。

同時,也可以在配置文件中設置dubbo.consumer.check=false,這個是設置所有的reference的check屬性默認值,當配置文件中有對單個reference的check的顯式設置,會被覆蓋掉

這裏也可以去看下對註冊中心不存在時的錯誤:

如果我們在reference標籤和register標籤中顯示配置check=“false”,這些錯誤只有在調用時纔會報錯。

超時

在dubbo的service和reference標籤中都有timeout設置,service標籤中timeout是1000ms,代表遠程服務調用時間;而reference標籤中的timeout設置默認值是繼承自dubbo:consumer標籤中的默認值,也是1000ms。在前幾篇dubbo配置中有提到,timeout的配置遵守一個規則:

  • 更精準的優先。方法級別配置會覆蓋接口級別的配置,接口級別的配置會覆蓋全局的provider、consumer配置。
  • 如果精準級別相同,消費方優先。當配置的顆粒度是相同的,如果消費方設置了超時屬性,會覆蓋服務提供方超時屬性的配置。

比如這裏設置服務提供者的超時是5000ms:

<dubbo:service interface="service.user.UserService" ref="userService" timeout="5000" 
               version="0.0.1" stub="service.user.UserServiceStub">
</dubbo:service>

而在消費者配置超時是2000ms:

<dubbo:reference id="userService" interface="service.user.UserService" version="0.0.1" timeout="2000"/>

在服務提供者加入一個3000ms的sleep,這裏按照配置的優先級會是消費者的2000ms生效。這裏會報dubbo接口調用超時的錯誤:(錯誤信息中接口調用花費了2004ms,超時生效的是2000ms配置,報錯是waiting server-side response timeout)

重試次數

在dubbo:service和dubbo:reference標籤中可以設置retries屬性來設置接口調用失敗時的重試次數,這裏重試此時指的是第一次調用之後的重試次數,並且這裏的重試會遵守負載均衡的策略。

service標籤中的重試次數默認是2,而reference標籤的默認重試次數繼承consumer標籤的默認次數也是2。這裏去簡單模擬下有三個服務提給者,調用失敗的場景是依靠上邊的超時設置,重試次數也尊屬消費者優先的規則。

在不同的端口暴露userService服務,每個服務會打印第幾個服務,並且有對應的睡眠時間模擬調用:

  1. 端口是20880,睡眠時間是5000ms
<dubbo:protocol name="dubbo" port="20880" />

<dubbo:service interface="service.user.UserService" ref="userService"
               version="0.0.1" stub="service.user.UserServiceStub">
</dubbo:service>
  1. 端口是20881,睡眠時間是5000ms
<dubbo:protocol name="dubbo" port="20881" />

<dubbo:service interface="service.user.UserService" ref="userService"
               version="0.0.1" stub="service.user.UserServiceStub">
</dubbo:service>
  1. 端口是20882,睡眠時間是2000ms
<dubbo:protocol name="dubbo" port="20882" />

<dubbo:service interface="service.user.UserService" ref="userService"
               version="0.0.1" stub="service.user.UserServiceStub">
</dubbo:service>

而在消費者端配置超時時間是3000ms,所以只有端口是20882提供的服務可以不會因爲超時調用失敗。

消費端的配置:

<dubbo:reference id="userService" interface="service.user.UserService" version="0.0.1" timeout="3000"/>

服務啓動之後,發起調用可以看到consumer端的日誌:

對20880端口暴露的服務調用超時之後,因爲默認的負載均衡策略是加權隨機調用,這裏重試調用了第三個服務接口調用成功。

這裏要知道重試應該配置在冪等的接口上,比如查詢、更新等,因爲會進行重試進行請求。

多版本功能

同一個服務要升級時可能出現服務不穩定的情況,可以使用版本號進行過度,不同的版本號之間是隔離的。

在service標籤上配置的version屬性就是服務提供者的版本;而reference標籤上的version則代表引用服務的版本。

我們也在上邊使用了0.0.1版本,而和spring boot整合的dubbo接口版本是boot-1.0.0。

如果配置version="*" 如下,則表示的是隨機引用版本。

<dubbo:reference id="barService" interface="com.foo.BarService" version="*" />

負載均衡

dubbo框架對集羣環境下提供了多種負載均衡機制:

  1. 基於權重的隨機負載均衡 Random LoadBalance (dubbo的默認的負載均衡策略)。

  2. 基於權重的輪詢負載均衡機制

  3. 最小活躍數負載均衡機制。

  4. 一致性hash負載均衡(注意這裏是一致性hash,因爲集羣中的服務節點可以增加、減少)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章