此系列文章将会描述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
覆盖策略
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dr54RvCY-1648187426452)(http://dubbo.apache.org/docs/zh-cn/user/sources/images/dubbo-properties-override.jpg)]
- 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实现自定义验证器及拦截器
具体配置如下:
## 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
注解)
@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>
参考资料:
)