Dubbo性能调优配置

微服务框架(三)

Posted by Tillend on July 29, 2018

  此系列文章将会描述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:

1
2
3
dubbo.application.name=foo
dubbo.application.owner=bar
dubbo.registry.address=10.20.153.10:9090

XML配置

application.xml:

1
2
<dubbo:application name="foo" owner="bar" />
<dubbo:registry address="10.20.153.10:9090" />

YAML配置

application.yml:

1
2
3
4
5
6
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 性能调优 服务参数验证器(默认为JValidation )
filter 内置filter 性能调优 调用拦截器

Provider端推荐配置超时、重连及负载均衡等性能调优参数,即timeout/retries/loadbalance,如需使用参数验证只需配置validation = "true",要使用自定义验证器及拦截器见微服务框架(七)Dubbo实现自定义验证器及拦截器

具体配置如下:

1
2
3
4
5
6
7
## 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 性能调优 服务参数验证器(默认为JValidation )
filter 内置filter 性能调优 调用拦截器

Provider端推荐配置应用于项目下所有@Service,使服务配置统一,若无配置provider参数则具体配置如下:(Dubbo @Service注解)

1
2
3
4
5
@Service(version = "1.0.0", 
        timeout = 2000, 
        validation = "true",
        retries = 2,
        loadbalance = "random")

若已配置provider参数,则

1
@Service(version = "1.0.0")

注:在配置文件中需扫描Dubbo容器(如@Service/@Referencedubbo.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。具体配置如下:

1
2
3
4
5
6
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依赖,如

1
2
3
4
5
<dependency>
	<groupId>io.netty</groupId>
	<artifactId>netty-all</artifactId>
	<version>4.1.28.Final</version>
</dependency>

参考资料:

  1. Dubbo官方文档