dubbo教程-07-如何正確的配置dubbo?

寫在前面

hello大家好
歡迎大家來到御風大世界
本次課時我們dubbo系列教程的第7課
在這次課 我將爲大家
演示 dubbo的一些配置
如何配置
以及dubbo官方文檔的解釋

配置方式

通常一個框架 如何給你開放了很多的配置項
那麼這個框架肯定是一個優秀的開放的框架
可以配置的東西
就沒有必要自己去代碼寫了
這一點 我覺得dubbo做的很好
我們來到他的官網
http://dubbo.apache.org/zh-cn/docs/user/configuration/xml.html
看到這樣一個界面
我們點擊配置

imagepng

可以配置的方式 總共有 四個 方式
- XML 配置
- 屬性配置
- API配置
- 註解配置

XML配置

在這裏 我們首先看 xml 的配置方式
這個最普遍

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"  />  
    <dubbo:registry address="multicast://224.5.6.7:1234" />  
    <dubbo:protocol name="dubbo" port="20880" />  
    <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoServiceLocal" />  
    <dubbo:reference id="demoServiceRemote" interface="com.alibaba.dubbo.demo.DemoService" />  
</beans>

所有標籤都支持自定義參數,用於不同擴展點實現的特殊配置,如:

<dubbo:protocol name="jms">
    <dubbo:parameter key="queue" value="your_queue" />
</dubbo:protocol>

或: 1(http://dubbo.apache.org/zh-cn/docs/user/configuration/xml.html#fn1)

<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"
    xmlns:p="http://www.springframework.org/schema/p"
    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:protocol name="jms" p:queue="your_queue" />  
</beans>

配置之間的關係

imagepng

配置覆蓋關係

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

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

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

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

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

雖然我們可以使用 多種方式了來 配置dubbo
但是我們這裏有一個配置覆蓋的概念

覆蓋策略

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

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

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

配置項解答

要講這個點的話
我強烈建議大家參看 dubbo的官方文檔
說實話 我沒有見過這麼好的文檔
而且是 中英文可以 切換的
我們點擊 示例

imagepng

看到了 dubbo 官方 給我們列舉的 配置示例
很方便
我建議 大家先把這個 文檔好好看幾遍
然後 在項目中 運用dubbo的時候
如果遇到了一些場景的話
你就可以通過配置來解決了
有時候 你覺得是 BUG 其實用配置項 就可以輕鬆解決的

推薦配置

在 Provider 上儘量多配置 Consumer 端屬性

原因如下:

  • 作服務的提供者,比服務使用方更清楚服務性能參數,如調用的超時時間、合理的重試次數等
  • 在 Provider 配置後,Consumer 不配置則會使用 Provider 的配置值,即 Provider 配置可以作爲 Consumer 的缺省值 1(http://dubbo.apache.org/zh-cn/docs/user/recommend.html#fn1)。否則,Consumer 會使用 Consumer 端的全局設置,這對於 Provider 是不可控的,並且往往是不合理的

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

示例:

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

<dubbo:service interface="com.alibaba.hello.api.WorldService" version="1.0.0" ref="helloService"
    timeout="300" retry="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 2(http://dubbo.apache.org/zh-cn/docs/user/recommend.html#fn2)
  3. loadbalance 負載均衡算法 3(http://dubbo.apache.org/zh-cn/docs/user/recommend.html#fn3),缺省是隨機 random。還可以有輪詢 roundrobin、最不活躍優先 4(http://dubbo.apache.org/zh-cn/docs/user/recommend.html#fn4)leastactive 等
  4. actives 消費者端,最大併發調用限制,即當 Consumer 對一個服務的併發調用到上限後,新調用會阻塞直到超時,在方法上配置 dubbo:method 則併發限制針對方法,在接口上配置 dubbo:service,則併發限制針對服務

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

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,則併發限制針對服務

配置管理信息

目前有負責人信息和組織信息用於區分站點。有問題時便於的找到服務的負責人,至少寫兩個人以便備份。負責人和組織的信息可以在註冊中心的上看到。

應用配置負責人、組織:

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

service 配置負責人:

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

reference 配置負責人:

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

若沒有配置 service 和 reference 的負責人,則默認使用 dubbo:application 設置的負責人。

配置 Dubbo 緩存文件

提供者列表緩存文件:

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

注意:

  1. 應用可以根據需要調整緩存文件的路徑,保證這個文件不會在發佈過程中被清除;
  2. 如果有多個應用進程,注意不要使用同一個文件,避免內容被覆蓋;

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

監控配置

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

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

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

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

  3. 服務提供方,使用 Dubbo Qos 的 telnet 或 shell 監控項

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

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

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

不要使用 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(http://dubbo.apache.org/zh-cn/docs/user/recommend.html#fn5),其它的參數(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" />
    
    

dubbo官方文檔

我們一起點擊這個鏈接 http://dubbo.apache.org/zh-cn/docs/user/quick-start.html
一起來學習下

總結

dubbo在很多的地方給我開放和預留了 個性化配置
這個是一個非常方便開發者適配各種場景的 設計
我個人非常贊同
看到他這麼多的配置項 而且文檔中的各個配置 示例 都寫的很詳細
讓人一看就懂 一看就想自己動手試試
確實很不錯
我也希望大家 能夠多多的去看他的官方文檔
並且對照自己的實際開發
進行驗證和體會
如果在這個過程中
大家有什麼不明白的地方
也可以到B站 或者 我的博客 公衆號 留言告訴我
再一次感謝您的收看 謝謝

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