本篇主要是基于2.7.1对常用的dubbo配置进行整理以及介绍dubbo配置是如何集成spring的。
前言
对于dubbo配置,我这里就讲目前项目里用的多的两种方式,property文件配置以及xml配置,其实配置的项都一样。property文件方式的配置统一前缀dubbo.,xml方式的配置的配置统一前缀dubbo:,下文配置项不写前缀了。
常用配置
application
应用级别的配置,用于配置应用信息
配置项 | 作用 |
---|---|
name | 应用的名称,用于标识哪个dubbo应用 |
version | 应用的版本 |
owner | 应用的维护者 |
logger | 指定日志框架,可选:slf4j, jcl, log4j, log4j2, jdk,默认log4j |
compiler | 指定字节码处理类,可选:jdk, javassist,默认Javassist |
environment | 指定所属环境,可选:develop, test, product |
module
用于配置当前模块信息,可选,用处不大,只是为了配置补充
配置项 | 作用 |
---|---|
name | 模块名称 |
version | 模块的版本 |
owner | 模块的维护者 |
isDefault | 是否默认配置,如果配置多个module则需要指定default |
registry
注册中心配置
配置项 | 作用 |
---|---|
address | 注册中心服务器地址,如果地址没有端口缺省为9090,同一集群内的多个地址用逗号分隔,如:ip:port,ip:port,不同集群的注册中心,请配置多个<<dubbo:registry>>标签 |
username | 登录注册中心用户名 |
password | 登录注册中心密码 |
port | 注册中心缺省端口,当address没有带端口时使用此端口做为缺省值,默认9090 |
protocol | 注册中心地址协议,支持dubbo, multicast, zookeeper, redis, consul(2.7.1), sofa(2.7.2), etcd(2.7.2), nacos(2.7.2)等协议 |
transporter | 网络传输方式,可选mina,netty,默认netty |
check | 注册中心不存在时,是否报错,默认true |
timeout | 注册中心请求超时时间(毫秒),默认5000 |
register | 是否向此注册中心注册服务,如果设为false,将只订阅,不注册,默认true |
subscribe | 是否向此注册中心订阅服务,如果设为false,将只注册,不订阅,默认true |
group | 服务注册分组,跨组的服务不会相互影响,也无法相互调用,适用于环境隔离。 |
protocol
服务提供者协议配置
配置项 | 作用 |
---|---|
name | 协议名称,默认dubbo |
host | 自动查找本机IP,多网卡选择或指定VIP及域名时使用,为空则自动查找本机IP |
port | 服务端口,dubbo协议缺省端口为20880,rmi协议缺省端口为1099,http和hessian协议缺省端口为80;如果没有配置port,则自动采用默认端口,如果配置为-1,则会分配一个没有被占用的端口 |
threadpool | 线程池类型,可选:fixed/cached,默认fixed |
threads | 服务线程池大小(固定大小),默认200 |
iothreads | io线程池大小(固定大小),默认cpu个数+1 |
accepts | 服务提供方最大可接受连接数,默认0 |
payload | 请求及响应数据包大小限制,单位:字节,默认8388608(=8M) |
codec | 协议编码方式,默认dubbo |
serialization | 协议编码方式,协议序列化方式,当协议支持多种序列化方式时使用,比如:dubbo协议的dubbo,hessian2,java,compactedjava,以及http协议的json等,dubbo协议缺省为hessian2,rmi协议缺省为java,http协议缺省为json |
accesslog | 设为true,将向logger中输出访问日志,也可填写访问日志文件路径,直接把访问日志输出到指定文件 |
transporter | 协议的服务端和客户端实现类型,比如:dubbo协议的mina,netty等,可以分拆为server和client配置,dubbo协议缺省为netty |
dispatcher | 协议的消息派发方式,用于指定线程模型,比如:dubbo协议的all, direct, message, execution, connection等,默认all |
monitor
监控中心配置
配置项 | 作用 |
---|---|
protocol | 监控中心协议,如果为protocol=“registry”,表示从注册中心发现监控中心地址,否则直连监控中心。默认dubbo |
address | 直连监控中心服务器地址,address=“10.20.130.230:12080” |
username | 用户名 |
password | 密码 |
provider
服务提供者缺省值配置
配置项 | 作用 |
---|---|
host | 服务主机名,多网卡选择或指定VIP及域名时使用 |
port | 服务提供者端口 |
threadpool | 线程池类型,可选:fixed/cached/limit(2.5.3以上)/eager(2.6.x以上),默认fixed |
threads | 服务线程池大小(固定大小),默认200 |
iothreads | io线程池大小(固定大小),默认cpu个数+1 |
timeout | 远程服务调用超时时间(毫秒),1000 |
retries | 远程服务调用重试次数,不包括第一次调用,不需要重试请设为0,默认2 |
loadbalance | 负载均衡策略,可选值:random,roundrobin,leastactive,分别表示:随机,轮询,最少活跃调用,默认 random |
stub | 设为true,表示使用缺省代理类名,即:接口名 + Local后缀。自定义扩展 |
mock | 设为true,表示使用缺省Mock类名,即:接口名 + Mock后缀。降级用 |
token | 令牌验证,为空表示不开启,如果为true,表示随机生成动态令牌 |
registry | 向指定注册中心注册,在多个注册中心时使用,值为 <<dubbo:registry>> 的id属性,多个注册中心ID用逗号分隔,如果不想将该服务注册到任何registry,可将值设为N/A |
weight | 服务权重 |
executes | 服务提供者每服务每方法最大可并行执行请求数 |
proxy | 生成动态代理方式,可选:jdk/javassist,默认javassist |
cluster | 集群方式,可选:failover/failfast/failsafe/failback/forking,默认failover |
deprecated | 服务是否过时,如果设为true,消费方引用时将打印服务过时警告error日志 |
async | 是否缺省异步执行,不可靠异步,只是忽略返回值,不阻塞执行线程,默认false |
consumer
服务消费者缺省值配置
配置项 | 作用 |
---|---|
timeout | 远程服务调用超时时间(毫秒),默认1000 |
retries | 远程服务调用重试次数,不包括第一次调用,不需要重试请设为0,仅在cluster为failback/failover时有效,默认2 |
loadbalance | 负载均衡策略,可选值:random,roundrobin,leastactive,分别表示:随机,轮询,最少活跃调用 |
async | 是否缺省异步执行,默认false |
generic | 是否缺省泛化接口,默认false |
check | 启动时检查提供者是否存在,true报错,false忽略,默认true |
cluster | 集群方式,可选:failover/failfast/failsafe/failback/forking,默认failover |
filter | 服务消费方远程调用过程拦截器名称,多个名称用逗号分隔 |
registry | 向指定注册中心注册,在多个注册中心时使用,值为<dubbo:registry>的id属性,多个注册中心ID用逗号分隔,如果不想将该服务注册到任何registry,可将值设为N/A |
init | 是否在afterPropertiesSet()时饥饿初始化引用,否则等到有人注入或引用该实例时再初始化,默认false |
cache | 以调用参数为key,缓存返回结果,可选:lru, threadlocal, jcache等 |
validation | 是否启用JSR303标准注解验证,如果启用,将对方法参数上的注解进行校验 |
async | 是否缺省异步执行,默认false |
corethreads | 线程池的核心线程数 |
threads | 线程池的最大线程数 |
injvm | 是否只暴露在本地jvm |
lazy | 是否在发起远程调用的时候初始化连接 |
mock | 设为true,表示使用缺省Mock类名,即:接口名 + Mock后缀。降级用 |
stub | 设为true,表示使用缺省代理类名,即:接口名 + Local后缀。自定义扩展 |
config-center
配置中心配置,平时基本没用
配置项 | 作用 |
---|---|
protocol | 使用哪个配置中心:apollo、zookeeper、nacos等。默认zookeeper |
address | 配置中心地址,以zookeeper为例 1. 指定 protocol,则 address 可以简化为127.0.0.1:2181;2. 不指定 protocol,则 address 取值为 zookeeper://127.0.0.1:2181 |
username | 配置中心用户名 |
password | 配置中心密码 |
timeout | 获取配置的超时时间,默认3000 |
check | 当配置中心连接失败时,是否终止应用启动,默认true |
metadata-report
元数据中心配置,平时基本没用
配置项 | 作用 |
---|---|
address | 元数据中心地址 |
username | 元数据中心用户名 |
password | 元数据中心密码 |
timeout | 超时时间 |
dubbo是如何集成到spring的
集成到spring的模块是dubbo-config-spring。
注解方式
我们在使用注解方式使用dubbo的时候通常会用到注解@EnableDubboConfig
可以看到上面有个@Import(DubboConfigConfigurationRegistrar.class)
,进去看下
实现了接口ImportBeanDefinitionRegistrar(这是spring自定义bean的一种方式),从上图圈出来的地方可以看到对DubboConfigConfiguration.Multiple
或者DubboConfigConfiguration.Single
进行了注册(Multiple方式我也没用过),我们拿 Single 来举例,其实实现方式是一样的。
可以看到诸如dubbo.application
等我们在配置文件里配置的前缀及其对应的类。进来EnableDubboConfigBinding
,可以看到又是一个import。
直接看registerDubboConfigBindingBeanPostProcessor
方法,我们发现这里又去注册一个DubboConfigBindingBeanPostProcessor
类型的bean,再跟进去看
这里可以看到进行了数据绑定。绑定的类实际上是DefaultDubboConfigBinder
可以看到最终是用的spring的DataBinder进行了属性文件内容和对象字段的绑定。
xml文件方式
spring对于xml的解析其实是提供了扩展的,我们可以通过扩展来自定义自己的xml标签(如何自定义xml标签),dubbo就是这么做的。
从resources文件夹下我们可以看到这些文件,其中dubbo.xsd
就是所有自定义标签的定义。举个例子:application定义
<xsd:element name="application" type="applicationType">
<xsd:annotation>
<xsd:documentation><![CDATA[ The application config ]]></xsd:documentation>
<xsd:appinfo>
<tool:annotation>
<tool:exports type="org.apache.dubbo.config.ApplicationConfig"/>
</tool:annotation>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
可以看到对于的类型是applicationType
,再看applicationType
定义
这样就很清楚了,applicationType
定义了所有属性字段。spring.schemas
文件定义了指定的标签文件路径spring.handlers
文件定义了集成spring的自定义处理类,dubbo的是DubboNamespaceHandler
。
看下图的逻辑基本就很清晰了,标签和类对应起来
最后数据绑定是在org.apache.dubbo.config.spring.schema.DubboBeanDefinitionParser#parse(org.w3c.dom.Element, org.springframework.beans.factory.xml.ParserContext, java.lang.Class<?>, boolean)
总结
这篇实用性比较强,平时在配置的时候可以参考下。了解原理之后自己也可以实现一个集成spring的工具包。
配置也可以参考官网:https://dubbo.apache.org/zh/d...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。