深入浅出学习 Dubbo(二)Dubbo 配置

1、Dubbo 配置

Dubbo 配置官方文档:https://dubbo.apache.org/zh/docs/v3.0/references/configuration/

1.1 服务提供者配置

  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>

生产者 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 框架设计

在这里插入图片描述

  1. 左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口。
  2. 从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖关系,每一层都可以剥离上层被复用,其中,Service 和 Config 层为 API,其它各层均为 SPI。
  3. 绿色小块的为扩展接口,蓝色小块为实现类,图中只显示用于关联各层的实现类。
  4. 蓝色虚线为初始化过程,即启动时组装链,红色实线为方法调用过程,即运行时调时链,紫色三角箭头为继承,可以把子类看作父类的同一个节点,线上的文字为调用的方法。
  • 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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一起来搬砖呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值