讀Apache Dubbo官網有感:使用建議事項

乘風破浪的小憨學長發表於2020-11-14

1、在 Provider 端儘量多配置 Consumer 端屬性

原因如下:

  • 作服務的提供方,比服務消費方更清楚服務的效能引數,如呼叫的超時時間、合理的重試次數等
  • Provider 端配置後,Consumer端不配置則會使用Provider 端的配置,即 Provider端的配置可以作為Consumer的預設值 1。否則,Consumer 會使用Consumer 端的全域性設定,這對於Provider是不可控的,並且往往是不合理的

Provider 端儘量多配置Consumer端的屬性,讓 Provider的實現者一開始就思考Provider端的服務特點和服務質量等問題。

示例:

<dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService"
    timeout="300" retries="2" loadbalance="random" actives="0" />

<dubbo:service interface="com.alibaba.hello.api.WorldService" version="1.0.0" ref="helloService"
    timeout="300" retries="2" loadbalance="random" actives="0" >
    <dubbo:method name="findAllPerson" timeout="10000" retries="9" loadbalance="leastactive" actives="5" />
<dubbo:service/>

建議在 Provider 端配置的 Consumer端屬性有:

  1. timeout:方法呼叫的超時時間
  2. retries:失敗重試次數,預設是 2
  3. loadbalance:負載均衡演算法 3,預設是隨機 random。還可以配置輪詢 roundrobin、最不活躍優先 4 leastactive 和一致性雜湊 consistenthash
  4. actives:消費者端的最大併發呼叫限制,即當 Consumer 對一個服務的併發呼叫到上限後,新呼叫會阻塞直到超時,在方法上配置 dubbo:method 則針對該方法進行併發限制,在介面上配置 dubbo:service,則針對該服務進行併發限制

詳細配置說明請參考:Dubbo配置參考手冊

2、在 Provider 端配置合理的Provider 端屬性

<dubbo:protocol threads="200" /> 
<dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService"
    executes="200" >
    <dubbo:method name="findAllPerson" executes="50" />
</dubbo:service>

建議在 Provider 端配置的Provider 端屬性有:

  1. threads:服務執行緒池大小
  2. executes:一個服務提供者並行執行請求上限,即當Provider 對一個服務的併發呼叫達到上限後,新呼叫會阻塞,此時 Consumer 可能會超時。在方法上配置 dubbo:method 則針對該方法進行併發限制,在介面上配置 dubbo:service,則針對該服務進行併發限制

3、配置管理資訊

目前有負責人資訊和組織資訊用於區分站點。以便於在發現問題時找到服務對應負責人,建議至少配置兩個人以便備份。負責人和組織資訊可以在運維平臺 (Dubbo Ops) 上看到。

在應用層面配置負責人、組織資訊:

<dubbo:application owner=”ding.lid,william.liangf” organization=”intl” />

在服務層面(服務端)配置負責人:

<dubbo:service owner=”ding.lid,william.liangf” />

在服務層面(消費端)配置負責人:

<dubbo:reference owner=”ding.lid,william.liangf” />

若沒有配置服務層面的負責人,則預設使用 dubbo:application 設定的負責人。

4、配置 Dubbo 快取檔案

提供者列表快取檔案:

<dubbo:registry file=”${user.home}/output/dubbo.cache” />

注意:

  1. 可以根據需要調整快取檔案的路徑,保證這個檔案不會在釋出過程中被清除;
  2. 如果有多個應用程式,請注意不要使用同一個檔案,避免內容被覆蓋;

該檔案會快取註冊中心列表和服務提供者列表。配置快取檔案後,應用重啟過程中,若註冊中心不可用,應用會從該快取檔案讀取服務提供者列表,進一步保證應用可靠性。

5、監控配置

  1. 使用固定埠暴露服務,而不要使用隨機埠

    這樣在註冊中心推送有延遲的情況下,消費者通過快取列表也能呼叫到原地址,保證呼叫成功。

  2. 使用 Dubbo Admin監控註冊中心上的服務提供方

    使用 Dubbo Admin 監控服務在註冊中心上的狀態,確保註冊中心上有該服務的存在。

  3. 服務提供方可使用 Dubbo Qostelnetshell監控項

    監控服務提供者埠狀態:echo status | nc -i 1 20880 | grep OK | wc -l,其中的 20880 為服務埠

  4. 服務消費方可通過將服務強制轉型為EchoService,並呼叫 $echo() 測試該服務的提供者是可用

    assertEqauls(“OK”, ((EchoService)memberService).$echo(“OK”));

6、不要使用 dubbo.properties 檔案配置,推薦使用對應 XML 配置

Dubbo中所有的配置項都可以配置在Spring 配置檔案中,並且可以針對單個服務配置。

如完全不配置則使用 Dubbo 預設值,詳情請參考 Dubbo配置參考手冊 中的說明。

dubbo.properties中屬性名與 XML 的對應關係:

  1. 應用名 dubbo.application.name

    <dubbo:application name="myalibaba" >
    
  2. 註冊中心地址 dubbo.registry.address

    <dubbo:registry address="11.22.33.44:9090" >
    
  3. 呼叫超時 dubbo.service.*.timeout

    可以在多個配置項設定超時 timeout,由上至下覆蓋(即上面的優先)5,其它的引數(retriesloadbalanceactives等)的覆蓋策略與 timeout 相同。示例如下:

    提供者端特定方法的配置

    <dubbo:service interface="com.alibaba.xxx.XxxService" >
        <dubbo:method name="findPerson" timeout="1000" />
    </dubbo:service>
    

    提供者端特定介面的配置

    <dubbo:service interface="com.alibaba.xxx.XxxService" timeout="200" />
    
  4. 服務提供者協議 dubbo.service.protocol、服務的監聽埠 dubbo.service.server.port

    <dubbo:protocol name="dubbo" port="20880" />
    
  5. 服務執行緒池大小 dubbo.service.max.thread.threads.size

    <dubbo:protocol threads="100" />
    
  6. 消費者啟動時,沒有提供者是否拋異常 alibaba.intl.commons.dubbo.service.allow.no.provider

    <dubbo:reference interface="com.alibaba.xxx.XxxService" check="false" />
    

①配置的覆蓋規則:1) 方法級別配置優於介面級別,即小 Scope 優先 2) Consumer 端配置優於 Provider端配置,優於全域性配置,最後是 Dubbo 硬編碼的配置值(Dubbo 配置參考手冊)

②表示加上第一次呼叫,會呼叫 3↩

③有多個 Provider 時,如何挑選 Provider呼叫

④指從Consumer 端併發呼叫最好的Provider,可以減少對響應慢的 Provider 的呼叫,因為響應慢更容易累積併發呼叫

timeout 可以在多處設定,配置項及覆蓋規則請參考: Dubbo 配置參考手冊

相關文章