一、Dubbo
Apache Dubbo 是一款高性能的Java RPC框架。其前身是阿里巴巴公司开源的一个高性能、轻量级开源Java RPC框架,可以和Spring框架无缝集成
Doubbo提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现
RPC
RPC全称Remote Procedure Call,即远程调用。
远程调用:比如两台服务器A和B,A服务器上部署一个应用,B服务器上部署一个应用,A服务上的应用想调用B服务上的应用提供的方法,由于两个应用不在一个内存空间,不能直接调用,所有,需要通过网络来表达调用的语义和传达调用的数据
RPC是一个泛化的概念,一个来说一切远程调用手动都属于RPC范畴。个体值开发语义都有直接的RPC框架。java中的RPC框架比较多,广泛使用的有RMI、Hessian、Dubbo等
==需要注意的是RPC并不是一个具体的技术,不是协议,而是指整个网络远程调用过程 ==
1、 节点角色说明:
节点 | 角色名称 |
---|---|
Provider | 暴露服务的服务提供方 |
Consumer | 调用远程服务的服务消费方 |
Registry | 服务注册与发现的注册中心 |
Monitor | 统计服务的调用次数和调用时间的监控中心 |
Container | 服务运行容器 |
虚线都是异步访问,实线都是同步访问
2、调用关系说明
- 服务容器启动,加载,运行服务提供者
- 服务提供者在启动时,向注册中心注册自己提供服务。
- 服务消费者在启动时,向注册中心订阅自己所需要的服务。
- 注册中心返回服务提供者地址列表个消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另外一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
二、Dubbo负载均衡,容错
1、负载均衡
1.1概述:
LoadBalance 中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载“均摊”到不同的机器上。避 免集群中部分服务器压力过大,而另一些服务器比较空闲的情况。通过负载均衡,可以让每台服务器获取到适合自 己处理能力的负载。在为高负载服务器分流的同时,还可以避免资源浪费,一举两得。
负载均衡可分为软件负载均衡和硬件负载均衡。在我们日常开发中,一般很难接触到硬件负载均衡。但软件负 载均衡还是可以接触到的,比如 Nginx。在 Dubbo 中,也有负载均衡的概念和相应的实现。Dubbo 需要对服务消 费者的调用请求进行分配,避免少数服务提供者负载过大。服务提供者负载过大,会导致部分请求超时。因此将负 载均衡到每个服务提供者上,是非常必要的.
1.2 Dubbo中负载均衡策略
-
Random LoadBalance(默认)
随机,按权重设置随机概率
在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后比较均匀,有利于动态调整提供者权重。
-
RoundRobin LoadBalance
轮询,按公约后的权重设置轮询比率。
存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台就卡在那,久而久之,所有请求都卡在调到第二台上。
-
LeastActive LoadBalance
最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
-
ConsistentHash LoadBalance
一致性 Hash,相同参数的请求总是发到同一提供者。
当某一台提供者挂时,原本发往该提供者的请求,基于虚拟点,平摊到其它提供者,不会引起剧烈变动。
缺省只对第一个参数 Hash,如果要修改,请配置
缺省用 160 份虚拟节点,如果要修改,请配置
1.3配置
xml配置方式
- 服务端服务级别
<dubbo:service interface="..." loadbalance="roundrobin" />
- 服务端方法级别
<dubbo:service interface="...">
<dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:service>
- 客户端服务级别
<dubbo:reference interface="..."loadbalance="roundrobin" />
- 客户端方法级别
<dubbo:reference interface="...">
<dubbo:method name="..." loadbalance="roundrobin"/> </dubbo:reference>
注解方式
- 提供者配置
@Service(loadbalance = "")
public class UserServiceImpl implements UserService {}
- 消费者配置,通过loadbalance属性
@Reference(loadbalance = "roundrobin ")
private UserService userService{};
2.集群容错
2.1容错概述
在集群调用失利时,Dubbo提供了多种容错方案,缺省为failover重试
各节点关系:
-
这里的
Invoker
是Provider
的一个可调用Service
的抽象,Invoker
封装了Provider
地址 及Service
接口信息 -
Directory
代表多个Invoker
,可以把它看成List
,但与List
不同的是,它的值可能是动态变化的, 比如注册中心推送变更 -
Cluster
将Directory
中的多个Invoker
伪装成一个Invoker
,对上层透明,伪装过程包含了容错逻 辑,调用失败后,重试另一个 -
Router
负责从多个Invoker
中按路由规则选出子集,比如读写分离,应用隔离等 -
LoadBalance
负责从多个Invoker
中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失 败后,需要重选"
2.2 Dubbo中容错策略
-
Failover Cluster
失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长的延迟。可通过
retries='2'
来设置重试次数(不含第一次)。可以在提供方配置也可以在消费方配置。
//提供方配置 <dubbo:service retries="2" />
//消费方配置 <dubbo:reference retries="2" />
-
Failfast Cluster
快速失败,只发起一次调用,失败立即报错。通常用于幂等性的写操作,比如更新
-
Failsafe Cluster
失败安全,出现异常时直接忽略。通常用于写入审计日志等操作。
-
Failback Cluster
失败自动恢复,后台记录失败请求,重定向发。通常用于消息通知操作。
-
Forking Cluster
并行调用多个服务,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费过多服务资源。(可以通过forks='2’来设置最大并行数)
-
Broadcast Cluster
广播调用所有提供者,逐个调用,任意一台报错则报错 [2]。通常用于通知所有提供者更新缓存或日志等本地 资源信息。
2.3 配置
xml方式
- 服务提供方
<dubbo:service cluster="failsafe" />
- 服务消费方
<dubbo:reference cluster="failsafe" />
注解方式
- 服务提供方
@Service(cluster = "failsafe")
- 服务消费方
@Reference(cluster = "failsafe")