Dubbo常用配置詳解
1、啟動時檢查
Dubbo 預設會在啟動時檢查依賴的服務是否可用,不可用時會丟擲異常,阻止 Spring 初始化完成,以便上線時,能及早發現問題,預設 check="true"
。
可以通過 check="false"
關閉檢查,比如,測試時,有些服務不關心,或者出現了迴圈依賴,必須有一方先啟動。
另外,如果你的 Spring 容器是懶載入的,或者通過 API 程式設計延遲引用服務,請關閉 check,否則服務臨時不可用時,會丟擲異常,拿到 null
引用,如果 check="false"
,總是會返回引用,當服務恢復時,能自動連上。
示例:
通過 spring 配置檔案
關閉某個服務的啟動時檢查 (沒有提供者時報錯):
<dubbo:reference interface="com.foo.BarService" check="false" />
關閉所有服務的啟動時檢查 (沒有提供者時報錯):
<dubbo:consumer check="false" />
關閉註冊中心啟動時檢查 (註冊訂閱失敗時報錯):
<dubbo:registry check="false" />
通過 dubbo.properties
dubbo.reference.com.foo.BarService.check=false dubbo.reference.check=false dubbo.consumer.check=false dubbo.registry.check=false
2、負載均衡
在叢集負載均衡時,Dubbo 提供了多種均衡策略,預設為 random
隨機呼叫。
負載均衡策略:
(1)Random LoadBalance
隨機,按權重設定隨機概率。
(2)RoundRobin LoadBalance
輪詢,按公約後的權重設定輪詢比率。
存在慢的提供者累積請求的問題,比如:第二臺機器很慢,但沒掛,當請求調到第二臺時就卡在那,久而久之,所有請求都卡在調到第二臺上。
(3)LeastActive LoadBalance
最少活躍呼叫數,相同活躍數的隨機,活躍數指呼叫前後計數差。
使慢的提供者收到更少請求,因為越慢的提供者的呼叫前後計數差會越大。
(4)ConsistentHash LoadBalance
一致性 Hash,相同引數的請求總是發到同一提供者。
配置示例:
服務端服務級別
<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>
3、執行緒(併發)模型
如果事件處理的邏輯能迅速完成,並且不會發起新的 IO 請求,比如只是在記憶體中記個標識,則直接在 IO 執行緒上處理更快,因為減少了執行緒池排程。
但如果事件處理邏輯較慢,或者需要發起新的 IO 請求,比如需要查詢資料庫,則必須派發到執行緒池,否則 IO 執行緒阻塞,將導致不能接收其它請求。
如果用 IO 執行緒處理事件,又在事件處理過程中發起新的 IO 請求,比如在連線事件中發起登入請求,會報“可能引發死鎖”異常,但不會真死鎖。
因此,需要通過不同的派發策略和不同的執行緒池配置的組合來應對不同的場景:
<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
時直接丟擲異常而不是將任務放入阻塞佇列)
4、只訂閱
為方便開發測試,經常會線上下共用一個所有服務可用的註冊中心,這時,如果一個正在開發中的服務提供者註冊,可能會影響消費者不能正常執行。
可以讓服務提供者開發方,只訂閱服務(開發的服務可能依賴其它服務),而不註冊正在開發的服務,通過直連測試正在開發的服務。
禁用註冊配置
<dubbo:registry address=“10.20.153.10:9090” register=“false” />
或者
<dubbo:registry address=“10.20.153.10:9090?register=false” />
5、只註冊
如果有兩個映象環境,兩個註冊中心,有一個服務只在其中一個註冊中心有部署,另一個註冊中心還沒來得及部署,而兩個註冊中心的其它應用都需要依賴此服務。這個時候,可以讓服務提供者方只註冊服務到另一註冊中心,而不從另一註冊中心訂閱服務。
禁用訂閱配置
<dubbo:registry id="hzRegistry" address="10.20.153.10:9090" />
<dubbo:registry id="qdRegistry" address="10.20.141.150:9090" subscribe="false" />
或者
<dubbo:registry id="hzRegistry" address="10.20.153.10:9090" />
<dubbo:registry id="qdRegistry" address="10.20.141.150:9090?subscribe=false" />
6、多協議
Dubbo 允許配置多協議,在不同服務上支援不同協議或者同一服務上同時支援多種協議。
不同服務在效能上適用不同協議進行傳輸,比如大資料用短連線協議,小資料大併發用長連線協議。
示例:
<?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>
多協議暴露服務
需要與 http 客戶端互操作
示例:
<?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="hessian" port="8080" />
<!-- 使用多個協議暴露服務 -->
<dubbo:service id="helloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" protocol="dubbo,hessian" />
</beans>