1. 程式人生 > >微服務框架(三)Dubbo效能調優配置

微服務框架(三)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

屬性即可選擇對應字首的配置檔案,詳見Profile執行環境配置

對映規則

若使用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

覆蓋策略

配置覆蓋策略

  1. JVM 啟動 -D 引數優先,這樣可以使使用者在部署和啟動時進行引數重寫,比如在啟動時需改變協議的埠。
  2. XML 次之,如果在 XML 中有配置,則 dubbo.properties 中的相應配置項無效
  3. 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>

參考資料: