系列文章目录
【收藏向】从用法到源码,一篇文章让你精通Dubbo的SPI机制
面试Dubbo ,却问我和Springcloud有什么区别?
超简单,手把手教你搭建Dubbo工程(内附源码)
Dubbo最核心功能——服务暴露的配置、使用及原理
并不简单的代理,Dubbo是如何做服务引用的
不满足于RPC,详解Dubbo的服务调用链路
从理论到实战,必须了解的Dubbo的配置
前面我们学习了很多理论知识,但一切理论都是为了实践。Dubbo作为一个框架当然有很多配置点,其中有些配置不起眼,但却很重要。笔者曾经分享过一起内存溢出的问题,其中就有接口超时时间配置得太长的原因,因为数据量比较大,三方接口迟迟无法返回结果。而超时时间又很长,最终大量线程阻塞在调用上,资源无法释放,造成内存溢出。由此可见,合理的参数配置是多么的重要
📕作者简介:战斧,多年开发及管理经验,爱好广泛,致力于创作更多高质量内容
📗本文收录于 Dubbo专栏,有需要者,可直接订阅专栏实时获取更新
📘高质量专栏 RabbitMQ、Spring全家桶 等仍在更新,欢迎指导
📙Zookeeper Redis kafka docker netty等诸多框架,以及架构与分布式专题即将上线,敬请期待
一、配置的实现方式
Dubbo 本身提供了多种配置方式,如API配置、配置文件、注解配置。大部分都具有同样的作用,使用哪种取决于你的喜好与场景,我们做一些示例:
- API配置
// 配置中心
ConfigCenterConfig configCenter = new ConfigCenterConfig();
configCenter.setAddress("zookeeper://192.168.10.2:2181");
- XML配置
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder/>
<dubbo:application name="demo-consumer"/>
<dubbo:registry address="zookeeper://${zookeeper.address:127.0.0.1}:2181"/>
<dubbo:reference id="demoService" check="true" interface="org.apache.dubbo.samples.basic.api.DemoService"/>
</beans>
- YML配置
dubbo:
registry:
id: zk-registry
address: zookeeper://127.0.0.1:2181
- properties配置
dubbo.registry.address=zookeeper://127.0.0.1:2181
- 注解配置
@DubboReference(retries = 5)
一般来说,耦合在代码里的配置都是固定的,而一些全局的或可变的建议都以配置文件的形式存储,方便配置中心管理
二、工程配置
1. 基础设置application
Dubbo中存在一些应用基础配置,如应用名什么的,组织结构之类的,相对重要的有以下几种
属性 | 对应URL参数 | 类型 | 缺省值 | 作用 | 描述 |
---|---|---|---|---|---|
version | application.version | string | – | 服务治理 | 当前应用的版本 |
environment | environment | string | – | 服务治理 | 应用环境,如:develop/test/product,不同环境使用不同的缺省值,以及作为只用于开发测试功能的限制条件 |
protocol | – | string | dubbo | 服务治理 | 首选协议,适用于无法确定首选协议的时候 |
logger | logger | string | slf4j | 性能优化 | 日志输出方式,可选:slf4j,jcl,log4j,log4j2,jdk |
2. 注册中心设置registry
下面列举一些相对重要的关于注册中心的配置
属性 | 对应URL参数 | 类型 | 缺省值 | 作用 | 描述 |
---|---|---|---|---|---|
id | – | string | – | 配置关联 | 注册中心引用BeanId,可以在<dubbo:service registry="">或<dubbo:reference registry="">中引用此ID |
address | host:port | string | – | 服务发现 | 注册中心服务器地址,如果地址没有端口缺省为9090,同一集群内的多个地址用逗号分隔,如:ip:port,ip:port,不同集群的注册中心,请配置多个< dubbo:registry>标签 |
port | int | 9090 | 服务发现 | 注册中心缺省端口,当address没有带端口时使用此端口做为缺省值 | |
file | registry.file | string | – | 服务治理 | 使用文件缓存注册中心地址列表及服务提供者列表,应用重启时将基于此文件恢复,注意:两个注册中心不能使用同一文件存储 |
check | check | boolean | – | 服务治理 | 注册中心不存在时,是否报错 |
group | group | string | dubbo | 服务治理 | 服务注册分组,跨组的服务不会相互影响,也无法相互调用,适用于环境隔离。 |
preferred | preferred | boolean | – | 服务治理 | 是否作为首选注册中心。当订阅多注册中心时,如果设为true,该注册中心作为首选 |
3. 配置中心设置config-center
属性 | 对应URL参数 | 类型 | 缺省值 | 描述 |
---|---|---|---|---|
protocol | protocol | string | zookeeper | 使用哪个配置中心:apollo、zookeeper、nacos等。以zookeeper为例:1. 指定protocol,则address可以简化为127.0.0.1:2181;2. 不指定protocol,则address取值为zookeeper://127.0.0.1:2181 |
highestPriority | highest-priority | true | – | 来自配置中心的配置项具有最高优先级,即会覆盖本地配置项。 |
check | check | boolean | true | 当配置中心连接失败时,是否终止应用启动。 |
namespace | namespace | string | dubbo | 通常用于多租户隔离,实际含义视具体配置中心而不同。如zookeeper - 环境隔离,默认值dubbo;apollo - 区分不同领域的配置集合,默认使用dubbo和application |
4. 监控中心配置monitor
属性 | 对应URL参数 | 类型 | 缺省值 | 作用 | 描述 |
---|---|---|---|---|---|
address | < url> | string | – | 服务治理 | 直连监控中心服务器地址,address=“10.20.130.230:12080” |
username | username | string | – | 服务治理 | 监控中心用户名 |
password | password | string | – | 服务治理 | 监控中心密码 |
group | group | string | – | 服务治理 | 分组 |
三、服务设置
1. 服务提供者provider
可以使用xml进行配置,如<dubbo:service>
,亦可以使用注解,进行配置@DubboService
,对应配置类为
org.apache.dubbo.config.ProviderConfig
属性 | 对应URL参数 | 类型 | 缺省值 | 作用 | 描述 |
---|---|---|---|---|---|
id | – | string | dubbo | 配置关联 | 协议BeanId,可以在<dubbo:service proivder="">中引用此ID |
protocol | < protocol > | string | dubbo | 性能调优 | 协议名称 |
threads | threads | int | 200 | 性能调优 | 服务线程池大小(固定大小) |
filter | service.filter | string | – | 性能调优 | 服务提供方远程调用过程拦截器名称,多个名称用逗号分隔 |
listener | exporter.listener | string | – | 性能调优 | 服务提供方导出服务监听器名称,多个名称用逗号分隔 |
group | group | string | – | 服务发现 | 服务分组,当一个接口有多个实现,可以用分组区分 |
timeout | default.timeout | int | 1000 | 性能调优 | 远程服务调用超时时间(毫秒) |
retries | default.retries | int | 2 | 性能调优 | 远程服务调用重试次数,不包括第一次调用,不需要重试请设为0 |
loadbalance | default.loadbalance | string | random | 性能调优 | 负载均衡策略,可选值:random - 随机; roundrobin - 轮询; leastactive - 最少活跃调用; consistenthash - 哈希一致 (2.1.0以上版本); shortestresponse - 最短响应 (2.7.7以上版本); |
cluster | default.cluster | string | failover | 性能调优 | 集群方式,可选:failover/failfast/failsafe/failback/forking/available/mergeable(2.1.0以上版本)/broadcast(2.1.0以上版本)/zone-aware(2.7.5以上版本) |
2. 服务消费者consumer
可以使用xml进行配置,如<dubbo:reference>
,亦可以使用注解,进行配置@DubboReference
,对应配置类为
org.apache.dubbo.config.ConsumerConfig
属性 | 对应URL参数 | 类型 | 缺省值 | 作用 | 描述 |
---|---|---|---|---|---|
timeout | default.timeout | int | 1000 | 性能调优 | 远程服务调用超时时间(毫秒) |
retries | default.retries | int | 2 | 性能调优 | 远程服务调用重试次数,不包括第一次调用,不需要重试请设为0,仅在cluster为failback/failover时有效 |
loadbalance | default.loadbalance | string | random | 性能调优 | 负载均衡策略,可选值:random - 随机; roundrobin - 轮询; leastactive - 最少活跃调用; consistenthash - 哈希一致 (2.1.0以上版本); shortestresponse - 最短响应 (2.7.7以上版本); |
async | default.async | boolean | false | 性能调优 | 是否缺省异步执行,不可靠异步,只是忽略返回值,不阻塞执行线程 |
check | check | boolean | true | 服务治理 | 启动时检查提供者是否存在,true报错,false忽略 |
listener | invoker.listener | string | – | 性能调优 | 服务消费方引用服务监听器名称,多个名称用逗号分隔 |
filter | reference.filter | string | – | 性能调优 | 服务消费方远程调用过程拦截器名称,多个名称用逗号分隔 |
cluster | default.cluster | string | failover | 性能调优 | 集群方式,可选:failover/failfast/failsafe/failback/forking/available/mergeable(2.1.0以上版本)/broadcast(2.1.0以上版本)/zone-aware(2.7.5以上版本) |
不难发现,有一些配置如超时时间、重试次数、集群、负载均衡在服务消费者和提供者两边都能配置。比如两边都配置了负载均衡策略时,发生了冲突以谁的为准呢,这里实际是以服务消费方的为准,因此,我们建议关于消费调用的内容应该由服务调用方自己来进行配置。
四、总结
上述我们分类对Dubbo一些常见的配置进行了展示,要熟练使用Dubbo,了解这些配置是必需的,但上述并不是全部,如果想了解更多的功能,可以访问官方的配置文档
查询配置及API的使用