微服務框架(三)Dubbo效能調優配置
此係列文章將會描述Java框架Spring Boot、服務治理框架Dubbo、應用容器引擎Docker,及使用Spring Boot整合Dubbo、Mybatis等開源框架,其中穿插著Spring Boot中日誌切面等技術的實現,然後通過gitlab-CI以持續整合為Docker映象。
本文為服務治理框架Dubbo效能調優配置
本系列文章中所使用的框架版本為Spring Boot 2.0.3-RELEASE,Spring 5.0.7-RELEASE,Dubbo 2.6.2。
Dubbo效能調優配置
本系列文章使用Spring boot
整合Dubbo
,故只需設定spring.profiles.active
對映規則
若使用properties檔案,只需將 XML 配置的標籤名,加屬性名,用點分隔,多個屬性拆成多行(yml檔案注意縮排即可)
如果 XML 有多行同名標籤配置,可用 id 號區分,如果沒有 id 號將對所有同名標籤生效
XML | Properties |
---|---|
<dubbo:application name="foo" /> |
dubbo.application.name=foo |
<dubbo:protocol id="rmi" name="rmi" port="1099"/> |
dubbo.protocol.rmi.port=1234 |
properties配置
application.properties:
dubbo.application.name=foo
dubbo.application.owner=bar
dubbo.registry.address=10.20.153.10:9090
XML配置
application.xml:
<dubbo:application name="foo" owner="bar" />
<dubbo:registry address="10.20.153.10:9090" />
YAML配置
application.yml:
dubbo:
application:
name: foo
owner: bar
rigistry:
address: 10.20.153.10:9090
覆蓋策略
- JVM 啟動 -D 引數優先,這樣可以使使用者在部署和啟動時進行引數重寫,比如在啟動時需改變協議的埠。
- XML 次之,如果在 XML 中有配置,則 dubbo.properties 中的相應配置項無效
- Properties 最後,相當於預設值,只有 XML 沒有配置時,dubbo.properties 的相應配置項才會生效,通常用於共享公共配置,比如應用名。
效能調優配置說明及使用
在Provider端多配置Consumer端屬性(官方推薦)
- 作為服務的提供者,比服務使用方更清楚服務效能引數,如呼叫的超時時間,合理的重試次數,等等
- 在 Provider 配置後,Consumer 不配置則會使用 Provider 的配置值,即 Provider 配置可以作為 Consumer 的預設值。否則,Consumer 會使用 Consumer 端的全域性設定,這對於 Provider 不可控的,並且往往是不合理的
以下配置使用properties檔案配置為例,展示推薦效能調優配置的說明及使用
provider
屬性 | 預設值 | 作用 | 描述 |
---|---|---|---|
timeout | 1000 | 效能調優 | 遠端服務呼叫超時時間(毫秒) |
retries | 2 | 效能調優 | 遠端服務呼叫重試次數,不包括第一次呼叫,不需要重試請設為0 |
connections | 100 | 效能調優 | 對每個提供者的最大連線數,rmi、http、hessian等短連線協議表示限制連線數,dubbo等長連線協表示建立的長連線個數 |
loadbalance | random | 效能調優 | 負載均衡策略,可選值:random,roundrobin,leastactive,分別表示:隨機,輪循,最少活躍呼叫 |
cluster | failover | 效能調優 | 叢集方式,可選:failover/failfast/failsafe/failback/forking |
validation | jvalidation | 效能調優 | |
filter | 內建filter | 效能調優 | 呼叫攔截器 |
Provider端推薦配置超時、重連及負載均衡等效能調優引數,即timeout
/retries
/loadbalance
,如需使用引數驗證只需配置validation = "true"
,要使用自定義驗證器及攔截器見微服務框架(七)Dubbo實現自定義驗證器及攔截器
具體配置如下:
## Provider
dubbo.provider.validation = true
dubbo.provider.timeout = 1500
dubbo.provider.retries = 1
dubbo.provider.loadbalance = random
dubbo.provider.threadpool = fixed
dubbo.provider.threads = 1000
consumer
consumer端的配置引數與provider端基本一致,推薦在provider端配置大部分引數。如有必要,亦可在consumer端配置對應引數,此配置會覆蓋provider端配置。
service
屬性 | 預設值 | 作用 | 描述 |
---|---|---|---|
interface | 服務發現 | 服務介面名 | |
ref | 服務發現 | 服務物件實現引用 | |
version | 0.0.0 | 服務發現 | 服務版本,建議使用兩位數字版本,如:1.0,通常在介面不相容時版本號才需要升級 |
group | 服務發現 | 服務分組,當一個介面有多個實現,可以用分組區分 | |
timeout | 1000 | 效能調優 | 遠端服務呼叫超時時間(毫秒) |
retries | 2 | 效能調優 | 遠端服務呼叫重試次數,不包括第一次呼叫,不需要重試請設為0 |
connections | 100 | 效能調優 | 對每個提供者的最大連線數,rmi、http、hessian等短連線協議表示限制連線數,dubbo等長連線協表示建立的長連線個數 |
loadbalance | random | 效能調優 | 負載均衡策略,可選值:random,roundrobin,leastactive,分別表示:隨機,輪循,最少活躍呼叫 |
cluster | failover | 效能調優 | 叢集方式,可選:failover/failfast/failsafe/failback/forking |
validation | jvalidation | 效能調優 | |
filter | 內建filter | 效能調優 | 呼叫攔截器 |
Provider端推薦配置應用於專案下所有@Service
,使服務配置統一,若無配置provider引數則具體配置如下:(Dubbo @Service
註解)
@Service(version = "1.0.0",
timeout = 2000,
validation = "true",
retries = 2,
loadbalance = "random")
若已配置provider引數,則
@Service(version = "1.0.0")
注:在配置檔案中需掃描Dubbo容器(如
@Service
/@Reference
)
dubbo.scan.basePackages = org.spring.boot.dubbo.provider
protocol
屬性 | 預設值 | 作用 | 描述 |
---|---|---|---|
name | dubbo | 效能調優 | 協議名稱,可選值為rmi/thrift/memcached/rest等,詳見 com.alibaba.dubbo.rpc.Protocol 檔案 |
port | dubbo預設為20880,rmi預設為1099,http和hessian預設為80;如果配置為-1 或者 沒有配置port,則會分配一個沒有被佔用的埠。 | 服務發現 | 服務埠(推薦配置) |
threadpool | fixed | 效能調優 | 執行緒池型別,可選:fixed(固定執行緒)/cached(快取執行緒) |
threads | 100 | 效能調優 | 服務執行緒池大小(固定大小) |
serialization | dubbo協議預設為hessian2,rmi協議預設為java,http協議預設為json | 效能調優 | 協議序列化方式,當協議支援多種序列化方式時使用 |
transporter | dubbo協議預設為netty | 效能調優 | 協議的服務端和客戶端實現型別,比如:dubbo協議的mina,netty等,可以分拆為server和client配置 |
推薦使用dubbo協議,同時自定義埠,協議的服務端和客戶端實現型別使用netty4,最後根據線上服務的使用情況定義適合的threadpool和threads。具體配置如下:
dubbo.protocol.id = dubbo
dubbo.protocol.name = dubbo
dubbo.protocol.port = 9900
dubbo.protocol.threadpool = fixed
dubbo.protocol.threads = 1000
dubbo.protocol.transporter = netty4
使用netty4通訊模組需引入netty4依賴,如
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.28.Final</version>
</dependency>
參考資料: