Dubbo

一、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、调用关系说明

  1. 服务容器启动,加载,运行服务提供者
  2. 服务提供者在启动时,向注册中心注册自己提供服务。
  3. 服务消费者在启动时,向注册中心订阅自己所需要的服务。
  4. 注册中心返回服务提供者地址列表个消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另外一台调用。
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

二、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重试

在这里插入图片描述

各节点关系:

  • 这里的InvokerProvider 的一个可调用 Service 的抽象, Invoker封装了Provider 地址 及Service 接口信息

  • Directory代表多个 Invoker ,可以把它看成 List,但与 List 不同的是,它的值可能是动态变化的, 比如注册中心推送变更

  • ClusterDirectory中的多个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")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值