1. 程式人生 > >dubbo系列五、dubbo核心配置

dubbo系列五、dubbo核心配置

rejected pool 無法 配置連接 http ali XML 負載 無效

一、配置文件

1、生產者配置provider.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://dubbo.apache.org/schema/dubbo
http://dubbo.apache.org/schema/dubbo/dubbo.xsd"
> <!-- 提供方應用信息,用於計算依賴關系 --> <dubbo:application name="hello-world-app" /> <!-- 使用multicast廣播註冊中心暴露服務地址 -->
<dubbo:registry address="multicast://224.5.6.7:1234" /> <!-- 用dubbo協議在20880端口暴露服務 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 聲明需要暴露的服務接口 --> <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" /> <!--
和本地bean一樣實現服務 --> <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" /> </beans>

2、消費者配置consumer.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://dubbo.apache.org/schema/dubbo
http://dubbo.apache.org/schema/dubbo/dubbo.xsd"
> <!-- 消費方應用名,用於計算依賴關系,不是匹配條件,不要與提供方一樣 --> <dubbo:application name="consumer-of-helloworld-app" /> <!-- 使用multicast廣播註冊中心暴露發現服務地址 --> <dubbo:registry address="multicast://224.5.6.7:1234" /> <!-- 生成遠程服務代理,可以和本地bean一樣使用demoService --> <dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" /> </beans>

3、主要配置分類

標簽用途解釋
<dubbo:service/> 服務配置 用於暴露一個服務,定義服務的元信息,一個服務可以用多個協議暴露,一個服務也可以註冊到多個註冊中心
<dubbo:reference/>[2] 引用配置 用於創建一個遠程服務代理,一個引用可以指向多個註冊中心
<dubbo:protocol/> 協議配置 用於配置提供服務的協議信息,協議由提供方指定,消費方被動接受
<dubbo:application/> 應用配置 用於配置當前應用信息,不管該應用是提供者還是消費者
<dubbo:module/> 模塊配置 用於配置當前模塊信息,可選
<dubbo:registry/> 註冊中心配置 用於配置連接註冊中心相關信息
<dubbo:monitor/> 監控中心配置 用於配置連接監控中心相關信息,可選
<dubbo:provider/> 提供方配置 當 ProtocolConfig 和 ServiceConfig 某屬性沒有配置時,采用此缺省值,可選
<dubbo:consumer/> 消費方配置 當 ReferenceConfig 某屬性沒有配置時,采用此缺省值,可選
<dubbo:method/> 方法配置 用於 ServiceConfig 和 ReferenceConfig 指定方法級的配置信息
<dubbo:argument/> 參數配置 用於指定方法參數配置

4、配置覆蓋關系

以 timeout 為例,顯示了配置的查找順序,其它 retries, loadbalance, actives 等類似:

  • 方法級優先,接口級次之,全局配置再次之。
  • 如果級別一樣,則消費方優先,提供方次之。

其中,服務提供方配置,通過 URL 經由註冊中心傳遞給消費方。

建議由服務提供方設置超時,因為一個方法需要執行多長時間,服務提供方更清楚,如果一個消費方同時引用多個服務,就不需要關心每個服務的超時設置。

理論上 ReferenceConfig 的非服務標識配置,在 ConsumerConfig,ServiceConfig, ProviderConfig 均可以缺省配置。

二、屬性配置

如果公共配置很簡單,沒有多註冊中心,多協議等情況,或者想多個 Spring 容器想共享配置,可以使用 dubbo.properties 作為缺省配置。

Dubbo 將自動加載 classpath 根目錄下的 dubbo.properties,可以通過JVM啟動參數 -Ddubbo.properties.file=xxx.properties 改變缺省配置位置。

1、映射規則

將 XML 配置的標簽名,加屬性名,用點分隔,多個屬性拆成多行

  • 比如:dubbo.application.name=foo等價於<dubbo:application name="foo" />
  • 比如:dubbo.registry.address=10.20.153.10:9090等價於<dubbo:registry address="10.20.153.10:9090" />

如果 XML 有多行同名標簽配置,可用 id 號區分,如果沒有 id 號將對所有同名標簽生效

  • 比如:dubbo.protocol.rmi.port=1234等價於<dubbo:protocol id="rmi" name="rmi" port="1099" />
  • 比如:dubbo.registry.china.address=10.20.153.10:9090等價於<dubbo:registry id="china" address="10.20.153.10:9090" />

下面是 dubbo.properties 的一個典型配置:

dubbo.application.name=foo
dubbo.application.owner=bar
dubbo.registry.address=10.20.153.10:9090

2、覆蓋策略

技術分享圖片

JVM 啟動 -D 參數優先,這樣可以使用戶在部署和啟動時進行參數重寫,比如在啟動時需改變協議的端口。

XML 次之,如果在 XML 中有配置,則 dubbo.properties 中的相應配置項無效。

Properties 最後,相當於缺省值,只有 XML 沒有配置時,dubbo.properties 的相應配置項才會生效,通常用於共享公共配置,比如應用名。

三、核心配置示例

1、啟動時檢查

Dubbo 缺省會在啟動時檢查依賴的服務是否可用,不可用時會拋出異常,阻止 Spring 初始化完成,以便上線時,能及早發現問題,默認 check="true"

可以通過 check="false" 關閉檢查,比如,測試時,有些服務不關心,或者出現了循環依賴,必須有一方先啟動。

另外,如果你的 Spring 容器是懶加載的,或者通過 API 編程延遲引用服務,請關閉 check,否則服務臨時不可用時,會拋出異常,拿到 null 引用,如果 check="false",總是會返回引用,當服務恢復時,能自動連上。

關閉某個服務的啟動時檢查 (沒有提供者時報錯):

<dubbo:reference interface="com.foo.BarService" check="false" />

關閉所有服務的啟動時檢查 (沒有提供者時報錯):

<dubbo:consumer check="false" />

關閉註冊中心啟動時檢查 (註冊訂閱失敗時報錯):

<dubbo:registry check="false" />

2、集群容錯

Failover Cluster

失敗自動切換,當出現失敗,重試其它服務器。通常用於讀操作,但重試會帶來更長延遲。可通過 retries="2" 來設置重試次數(不含第一次)。

重試次數配置如下:

<dubbo:service retries="2" />

<dubbo:reference retries="2" />

<dubbo:reference>
    <dubbo:method name="findFoo" retries="2" />
</dubbo:reference>

Failfast Cluster

快速失敗,只發起一次調用,失敗立即報錯。通常用於非冪等性的寫操作,比如新增記錄。

Failsafe Cluster

失敗安全,出現異常時,直接忽略。通常用於寫入審計日誌等操作。

Failback Cluster

失敗自動恢復,後臺記錄失敗請求,定時重發。通常用於消息通知操作。

Forking Cluster

並行調用多個服務器,只要一個成功即返回。通常用於實時性要求較高的讀操作,但需要浪費更多服務資源。可通過 forks="2" 來設置最大並行數。

Broadcast Cluster

廣播調用所有提供者,逐個調用,任意一臺報錯則報錯。通常用於通知所有提供者更新緩存或日誌等本地資源信息。

例子:

<dubbo:service cluster="failsafe" />

3、負載均衡策略

Random LoadBalance

  • 隨機,按權重設置隨機概率。

  • 在一個截面上碰撞的概率高,但調用量越大分布越均勻,而且按概率使用權重後也比較均勻,有利於動態調整提供者權重。

RoundRobin LoadBalance

  • 輪詢,按公約後的權重設置輪詢比率。

  • 存在慢的提供者累積請求的問題,比如:第二臺機器很慢,但沒掛,當請求調到第二臺時就卡在那,久而久之,所有請求都卡在調到第二臺上。

LeastActive LoadBalance

  • 最少活躍調用數,相同活躍數的隨機,活躍數指調用前後計數差。

  • 使慢的提供者收到更少請求,因為越慢的提供者的調用前後計數差會越大。

ConsistentHash LoadBalance

  • 一致性 Hash,相同參數的請求總是發到同一提供者。

  • 當某一臺提供者掛時,原本發往該提供者的請求,基於虛擬節點,平攤到其它提供者,不會引起劇烈變動。

  • 算法參見:http://en.wikipedia.org/wiki/Consistent_hashing

  • 缺省只對第一個參數 Hash,如果要修改,請配置 <dubbo:parameter key="hash.arguments" value="0,1" />

  • 缺省用 160 份虛擬節點,如果要修改,請配置 <dubbo:parameter key="hash.nodes" value="320" />

配置

服務端服務級別
<dubbo:service interface="..." loadbalance="roundrobin" /> 
客戶端服務級別
<dubbo:reference interface="..." loadbalance="roundrobin" /> 
服務端方法級別
<dubbo:service interface="..."> <dubbo:method name="..." loadbalance="roundrobin"/> </dubbo:service> 
客戶端方法級別
<dubbo:reference interface="..."> <dubbo:method name="..." loadbalance="roundrobin"/> </dubbo:reference>

4、線程模型

需要通過不同的派發策略和不同的線程池配置的組合來應對不同的場景:

<dubbo:protocol name="dubbo" dispatcher="all" threadpool="fixed" threads="100" />

Dispatcher

  • all 所有消息都派發到線程池,包括請求,響應,連接事件,斷開事件,心跳等。
  • direct 所有消息都不派發到線程池,全部在 IO 線程上直接執行。
  • message 只有請求響應消息派發到線程池,其它連接斷開事件,心跳等消息,直接在 IO 線程上執行。
  • execution 只請求消息派發到線程池,不含響應,響應和其它連接斷開事件,心跳等消息,直接在 IO 線程上執行。
  • connection 在 IO 線程上,將連接斷開事件放入隊列,有序逐個執行,其它消息派發到線程池。

ThreadPool

  • fixed 固定大小線程池,啟動時建立線程,不關閉,一直持有。(缺省)
  • cached 緩存線程池,空閑一分鐘自動刪除,需要時重建。
  • limited 可伸縮線程池,但池中的線程數只會增長不會收縮。只增長不收縮的目的是為了避免收縮時突然來了大流量引起的性能問題。
  • eager 優先創建Worker線程池。在任務數量大於corePoolSize但是小於maximumPoolSize時,優先創建Worker來處理任務。當任務數量大於maximumPoolSize時,將任務放入阻塞隊列中。阻塞隊列充滿時拋出RejectedExecutionException。(相比於cached:cached在任務數量超過maximumPoolSize時直接拋出異常而不是將任務放入阻塞隊列)

5、多協議

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> 
    <dubbo:application name="world"  />
    <dubbo:registry id="registry" address="10.20.141.150:9090" username="admin" password="hello1234" />
    <!-- 多協議配置 -->
    <dubbo:protocol name="dubbo" port="20880" />
    <dubbo:protocol name="rmi" port="1099" />
    <!-- 使用dubbo協議暴露服務 -->
    <dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" protocol="dubbo" />
    <!-- 使用rmi協議暴露服務 -->
    <dubbo:service interface="com.alibaba.hello.api.DemoService" version="1.0.0" ref="demoService" protocol="rmi" /> 
</beans>

1、dubbo

  • 連接個數:單連接
  • 連接方式:長連接
  • 傳輸協議:TCP
  • 傳輸方式:NIO 異步傳輸
  • 序列化:Hessian 二進制序列化
  • 適用範圍:傳入傳出參數數據包較小(建議小於100K),消費者比提供者個數多,單一消費者無法壓滿提供者,盡量不要用 dubbo 協議傳輸大文件或超大字符串。
  • 適用場景:常規遠程服務方法調用

2、rmi

  • 連接個數:多連接
  • 連接方式:短連接
  • 傳輸協議:TCP
  • 傳輸方式:同步傳輸
  • 序列化:Java 標準二進制序列化
  • 適用範圍:傳入傳出參數數據包大小混合,消費者與提供者個數差不多,可傳文件。
  • 適用場景:常規遠程服務方法調用,與原生RMI服務互操作

3、hessian

  • 連接個數:多連接
  • 連接方式:短連接
  • 傳輸協議:HTTP
  • 傳輸方式:同步傳輸
  • 序列化:Hessian二進制序列化
  • 適用範圍:傳入傳出參數數據包較大,提供者比消費者個數多,提供者壓力較大,可傳文件。
  • 適用場景:頁面傳輸,文件傳輸,或與原生hessian服務互操作

4、redis

在RedisProtocol中同樣提供了export和refer兩個方法

(1)export方法:目前redis協議不支持對外提供服務的操作

(2)refer方法:在refer方法中redisProtocol完成了數據的設置、查詢和刪除操作,這樣是否幾個服務消費者就可以共享數據。

redis協議中沒有服務提供者,簡單來說更像是消費者將增刪數據放到redis中,這樣消費者自己及其他消費者可以通過接口進行獲取數據,並設置數據的超時時間。

dubbo系列五、dubbo核心配置