深入浅出学习 DubboDubbo 配置
Posted 思想累积
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入浅出学习 DubboDubbo 配置相关的知识,希望对你有一定的参考价值。
1、Dubbo 配置
Dubbo 配置官方文档:https://dubbo.apache.org/zh/docs/v3.0/references/configuration/
1.1 服务提供者配置
- 将服务提供者注册到注册中心(暴露服务)
- 让服务消费者去注册中心订阅服务提供者的服务地址
引入 maven 依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
<!-- Dubbo 依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.10.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<!-- 操作 zookeeper 客户端 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.1.0</version>
</dependency>
生产者 provider.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"
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">
<!-- 指定当前服务、应用的名字, -->
<dubbo:application name="demo-provider"/>
<!-- 指定注册中心的位置 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!-- 指定通信规则(通信协议?通信端口) -->
<dubbo:protocol name="dubbo" port="20890"/>
<!-- 暴露服务 ref 指向服务真正的实现对象 -->
<dubbo:service interface="UserService" ref="demoService"/>
<!-- 服务实现 -->
<bean id="demoService" class="UserServiceImpl"/>
<!-- 监控中心 -->
<dubbo:monitor protocol="registry"/>
</beans>
1.2 消费者配置
引入 maven 依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
<!-- Dubbo 依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.10.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<!-- 操作 zookeeper 客户端 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.1.0</version>
</dependency>
消费者 consumer.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"
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">
<!-- 指定当前服务、应用的名字, -->
<dubbo:application name="demo-consumer"/>
<!-- 指定注册中心的位置 -->
<dubbo:registry address="zookeeper://ip:2181"/>
<!-- 需要调用的远程服务的接口,生成远程服务代理 -->
<dubbo:reference interface="UserService" id="userService"/>
<!-- 监控中心 -->
<dubbo:monitor protocol="registry"/>
</beans>
1.3 Dubbo 配置标签及用途
标签 | 用途 | 解释 |
---|---|---|
service | 服务配置 | 暴露一个服务,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心 |
reference | 引用配置 | 创建一个远程服务代理,一个引用可以指向多个注册中心 |
protocol | 协议配置 | 配置提供服务的协议信息,协议由提供方指定,消费方被动接收 |
application | 应用配置 | 配置当前应用信息,不管应用是消费者还是提供者 |
module | 模块配置 | 配置当前模块信息 |
registry | 注册中心配置 | 配置连接注册中心相关信息 |
monitor | 监控中心配置 | 配置连接监控中心的相关信息 |
provider | 提供方配置 | ProtocolConfig 和 ServiceConfig 某属性没有配置时,使用这个缺省值 |
consumer | 消费者配置 | ReferenceConfig 某属性没有配置时,使用此缺省值 |
method | 方法配置 | 用于 ServiceConfig 和 ReferenceConfig 指定方法级的配置信息 |
argument | 参数配置 | 用于指定方法参数配置 |
1.4 Dubbo 配置属性加载顺序
- JVM -D 参数:当你部署或者启动应用时,它可以轻易地重写配置,比如,改变 dubbo 协议端口;
- XML:XML 中的当前配置会重写 dubbo.properties 中的;
- Properties:默认配置,仅仅作用于以上两者没有配置时。
1.5 Dubbo 配置启动时检查
默认启动时检查依赖的服务是否可用,不可用抛出异常,阻止 Spring 初始化完成
spring xml 配置文件配置:
<!-- 关闭某个服务的启动时检查 (没有提供者时报错) -->
<dubbo:reference interface="com.foo.BarService" check="false" />
<!-- 关闭所有服务的启动时检查 (没有提供者时报错) -->
<dubbo:consumer check="false" />
<!-- 关闭注册中心启动时检查 (注册订阅失败时报错): -->
<dubbo:registry check="false" />
properties 配置文件:
dubbo.reference.com.foo.BarService.check=false
dubbo.reference.check=false
dubbo.consumer.check=false
dubbo.registry.check=false
1.6 配置覆盖关系
- 精确优先,方法级优先,接口级次之,全局配置再次之
- 如果级别一样的话,消费者优先,提供者次之
1.7 重试次数
Dubbo 服务在尝试调用一次后,出现非业务异常,默认会进行额外的两次重试
重试次数不包含第一次调用,0 代表不重试
需要注意幂等性,非幂等不能设置重试次数
xml 配置
<dubbo:consumer retries="2"></dubbo:consumer>
1.8 多版本
一个借口实现出现不兼容升级时,可以使用版本号过度,版本号不同的服务相互之间不引用
xml 配置
<!-- 老版本提供者 -->
<dubbo:service interface="" version="1.0.0" />
<!-- 新版本提供者 -->
<dubbo:service interface="" version="2.0.0" />
<!-- 老版本消费者 -->
<dubbo:reference id="" interface="" version="1.0.0" />
<!-- 新版本消费者 -->
<dubbo:reference id="" interface="" version="2.0.0" />
<!-- 不进行版本区分 -->
<dubbo:reference id="" interface="" version="*" />
2、Dubbo 高可用
2.1 zookeeper 宕机与 dubbo 直连
zookeeper 注册中心宕机,还可以消费 dubbo 暴露的服务
- 监控中心宕机不影响使用,只是丢失部分采样数据
- 数据库宕机,注册中心可以通过缓存提供服务列表查询,但不能注册新服务
- 注册中心对等集群,任意一台宕机,自动切换到另一台
- 注册中心全部宕机后,服务提供者和服务消费者仍能够通过本地缓存通讯
- 服务提供者无状态,任意一台宕机后,不影响使用
- 服务提供者全部宕机,服务消费者将无法使用,并无限次重连等待服务提供者恢复
2.2 集群模式下 Dubbo 负载均衡
-
Random LoadBalance(默认):基于权重的负载均衡轮询机制
- 可以在控制台快速调节权重
-
LeastActive LoadBalance:最小活跃数
- 基于加权最小活跃数算法实现。
- 活跃调用数越小,该服务提供者效率越高,单位时间内可以处理更多的请求,应该优先将请求分配给该服务提供者。
- 每个服务提供者对应一个活跃数 active
-
ConsistentHash LoadBalance:一致性 hash 负载均衡
- 根据 IP 或者其他信息为缓存节点生成一个 hash,并将 hash 投射到 [0, 2^32 - 1] 的圆环上,有查询或者请求写入时,为缓存项的 key 生成一个 hash 值。
- 查找第一个大于或者等于该 hash 值的缓存节点,到这个节点中查询或者写入缓存项。
- 当前节点挂了,在下一次查询或者写入缓存时,为缓存项查找另一个大于其 hash 值的缓存节点即可。
2.3 服务降级
服务器压力很大的时候,根据实际业务情况及流量,对一些服务和页面有策略的不处理换种简单的方式处理,从而释放服务器资源保证核心交易正常运作或者高效运作
向注册中心写入动态配置覆盖规则
RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("override://0.0.0.0/com.foo.BarService?category=configurators&dynamic=false&application=foo&mock=force:return+null"));
其中:
mock=force:return+null
表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。- 还可以改为
mock=fail:return+null
表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。
屏蔽远程调用:屏蔽后将不发起远程调用,直接在客户端返回空对象
容错:容错后,远程调用失败时,返回空对象
2.4 集群容错
集群调用失败时,dubbo 提供了多种容错方案,默认为 failover
Failfast Cluster
快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。
Failsafe Cluster
失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。
Failback Cluster
失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
Forking Cluster
并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2"
来设置最大并行数。
Broadcast Cluster
广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。
2.5 整合 Hystrix
导入 maven 依赖
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.8.RELEASE</version>
</dependency>
在消费者和提供者配置对应的容错
在 Application 类上增加 @EnableHystrix
启用 Hystrix starter
在提供的方法上加 @HystrixCommand
,服务被 Hystrix 代理
在消费者也加入 @EnableHystrix
注解,在调用的方法上使用 @HystrixCommand(fallbackMethod="方法名")
3、Dubbo 原理
3.1 框架设计
- 左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口。
- 从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖关系,每一层都可以剥离上层被复用,其中,Service 和 Config 层为 API,其它各层均为 SPI。
- 绿色小块的为扩展接口,蓝色小块为实现类,图中只显示用于关联各层的实现类。
- 蓝色虚线为初始化过程,即启动时组装链,红色实线为方法调用过程,即运行时调时链,紫色三角箭头为继承,可以把子类看作父类的同一个节点,线上的文字为调用的方法。
- config 配置层:对外配置接口,以
ServiceConfig
,ReferenceConfig
为中心,可以直接初始化配置类,也可以通过 spring 解析配置生成配置类 - proxy 服务代理层:服务接口透明代理,生成服务的客户端 Stub 和服务器端 Skeleton, 以
ServiceProxy
为中心,扩展接口为ProxyFactory
- registry 注册中心层:封装服务地址的注册与发现,以服务 URL 为中心,扩展接口为
RegistryFactory
,Registry
,RegistryService
- cluster 路由层:封装多个提供者的路由及负载均衡,并桥接注册中心,以
Invoker
为中心,扩展接口为Cluster
,Directory
,Router
,LoadBalance
- monitor 监控层:RPC 调用次数和调用时间监控,以
Statistics
为中心,扩展接口为MonitorFactory
,Monitor
,MonitorService
- protocol 远程调用层:封装 RPC 调用,以
Invocation
,Result
为中心,扩展接口为Protocol
,Invoker
,Exporter
- exchange 信息交换层:封装请求响应模式,同步转异步,以
Request
,Response
为中心,扩展接口为Exchanger
,ExchangeChannel
,ExchangeClient
,ExchangeServer
- transport 网络传输层:抽象 mina 和 netty 为统一接口,以
Message
为中心,扩展接口为Channel
,Transporter
,Client
,Server
,Codec
- serialize 数据序列化层:可复用的一些工具,扩展接口为
Serialization
,ObjectInput
,ObjectOutput
,ThreadPool
以上是关于深入浅出学习 DubboDubbo 配置的主要内容,如果未能解决你的问题,请参考以下文章