此系列文章将会描述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
覆盖策略
- 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 | 性能调优 | 服务参数验证器(默认为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
/@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。具体配置如下:
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>
参考资料: