RPC框架-Dubbo入门

1.RPC概念

rpc对于程序员来说,就是远程方法调用。

远程⽅法调⽤和本地⽅法调⽤是相对的两个概念,本地⽅法调⽤指的是进程内部的⽅法调⽤,⽽远程⽅法调⽤指的是两个进程内的⽅法相互调⽤。

如果实现远程⽅法调⽤,基本的就是通过⽹络,通过传输数据来进⾏调⽤。所以就有了:

  1. RPC over Http:基于Http协议来传输数据
  2. PRC over Tcp:基于Tcp协议来传输数据

对于所传输的数据,可以交由RPC的双⽅来协商定义,但基本都会包括:
3. 调⽤的是哪个类或接⼝
4. 调⽤的是哪个⽅法,⽅法名
5. 调⽤⽅法的⼊参、返参

所以,我们其实可以看到RPC的⾃定义性是很⾼的,各个公司内部都可以实现⾃⼰的⼀套RPC框架,⽽Dubbo就是阿⾥所开源出来的⼀套RPC框架。

2.什么是Dubbo

官⽹地址:http://dubbo.apache.org/zh/

⽬前,官⽹上是这么介绍的:Apache Dubbo 是⼀款⾼性能、轻量级的开源 Java 服务框架在⼏个⽉前,官⽹的介绍是:Apache Dubbo 是⼀款⾼性能、轻量级的开源 Java RPC框架。

为什么会将RPC改为服务?
Dubbo⼀开始的定位就是RPC,专注于两个服务之间的调⽤。但随着微服务的盛⾏,除开服务调⽤之外,Dubbo也在逐步的涉猎服务治理、服务监控、服务⽹关等等,所以现在的Dubbo⽬标已经不⽌是RPC框架了,⽽是和Spring Cloud类似想成为了⼀个服务框架。

3.总体架构

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

Dubbo 架构具有以下几个特点,分别是连通性、健壮性、伸缩性、以及向未来架构的升级性。

连通性

注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。

监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示。

服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销。

服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销。

注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外。

注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者。

注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表

注册中心和监控中心都是可选的,服务消费者可以直连服务提供者。

健壮性

监控中心宕掉不影响使用,只是丢失部分采样数据。

数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务。

注册中心对等集群,任意一台宕掉后,将自动切换到另一台。

注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯。

服务提供者无状态,任意一台宕掉后,不影响使用。

服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复。

伸缩性

注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心。

服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者。

升级性

当服务集群规模进一步扩大,带动IT治理结构进一步升级,需要实现动态部署,进行流动计算,现有分布式服务架构不会带来阻力。下图是未来可能的一种架构:

dubbo-architucture-futures在这里插入图片描述

节点 角色说明
Deployer 自动部署服务的本地代理
Repository 仓库用于存储服务应用发布包
Scheduler 调度中心基于访问压力自动增减服务提供者
Admin 统一管理控制台
Registry 服务注册与发现的注册中心
Monitor 统计服务的调用次数和调用时间的监控中心

4.开源RPC框架对⽐

在这里插入图片描述

5.dubbo的基本应用和高级应用

5.1负载均衡

官⽹地址:http://dubbo.apache.org/zh/docs/v2.7/user/examples/loadbalance/

5.1.1负载均衡策略

在集群负载均衡时,Dubbo 提供了多种均衡策略缺省为random 随机调用。

如果在消费端和服务端都配置了负载均衡策略,以消费端为准

可以自行扩展负载均衡策略,参见:负载均衡扩展

①Random LoadBalance

随机,按权重设置随机概率。

在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

②RoundRobin LoadBalance

轮询,按公约后的权重设置轮询比率

存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

③LeastActive LoadBalance

最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。使的提供者收到更请求,因为越慢的提供者的调用前后计数差会越大。

最少活跃调⽤数是如何进⾏统计的?

讲道理,最少活跃数应该是在服务提供者端进⾏统计的,服务提供者统计有多少个请求正在执⾏中。但在Dubbo中,就是不讲道理,它是在消费端进⾏统计的,为什么能在消费端进⾏统计?

逻辑是这样的:消费端的调用计数法

  1. 消费者会缓存所调⽤服务的所有提供者,⽐如记为p1、p2、p3三个服务提供者,每个提供者内都有⼀个属性记为active默认位0
  2. 消费者在调⽤次服务时,如果负载均衡策略是leastactive
  3. 消费者端会判断缓存的所有服务提供者的active,选择最⼩的,如果都相同,则随机
  4. 选出某⼀个服务提供者后,假设位p2,Dubbo就会对p2.active+1
  5. 然后真正发出请求调⽤该服务
  6. 消费端收到响应结果后,对p2.active-1
  7. 这样就完成了对某个服务提供者当前活跃调⽤数进⾏了统计,并且并不影响服务调⽤的性能

④ConsistentHash LoadBalance

一致性 Hash,相同参数的请求总是发到同一提供者。

当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

缺省只对第一个参数 Hash,如果要修改,请配置 <dubbo:parameter key=“hash.arguments” value=“0,1” />

缺省用 160 份虚拟节点,如果要修改,请配置 <dubbo:parameter key=“hash.nodes” value=“320” />

5.1.2负载均衡策略配置

服务端服务级别

<dubbo:service interface="..." loadbalance="roundrobin" />

客户端服务级别

<dubbo:reference interface="..." loadbalance="roundrobin" />

服务端方法级别

<dubbo:service interface="...">
<dubbo:method name="..." loadbalance="roundrobin"/>

</dubbo:service>

客户端方法级别

<dubbo:reference interface="...">
    <dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:reference>

5.2服务超时

在服务提供者和服务消费者上都可以配置服务超时时间,这两者是不⼀样的。

消费者调⽤⼀个服务,分为三步:

  1. 消费者发送请求(⽹络传输)
  2. 服务端执⾏服务
  3. 服务端返回响应(⽹络传输)

如果在服务端和消费端只在其中⼀⽅配置了timeout,那么没有歧义,表示消费端调⽤服务的超时时间,消费端如果超过时间还没有收到响应结果,则消费端会抛超时异常,,服务端不会抛异常,服务端在执⾏服务后,会检查执⾏该服务的时间,如果超过timeout,则会打印⼀个超时⽇志。服务会正常的执⾏完。

如果在服务端和消费端配了⼀个timeout,那就⽐较复杂了,假设

  1. 服务执⾏为5s
  2. 消费端timeout=3s
  3. 服务端timeout=6s
    那么消费端调⽤服务时,消费端会收到超时异常(因为消费端超时了),服务端⼀切正常(服务端没有超时)。

5.3集群容错

官⽹地址:http://dubbo.apache.org/zh/docs/v2.7/user/examples/fault-tolerent-strategy/
集群容错:服务消费者在调⽤某个服务时,这个服务有多个服务提供者,在经过负载均衡后选出其中⼀个服务提供者之后进⾏调⽤,但调⽤报错后,Dubbo所采取的后续处理策略。

5.3.1集群容错策略

①Failover Cluster
失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。可通过 retries=“2” 来设置重试次数(不含第一次)。
重试次数配置如下:

<dubbo:service retries="2" />

②Failfast Cluster

快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。

③Failsafe Cluster
失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。

④Failback Cluster
失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。

⑤Forking Cluster

并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks=“2” 来设置最大并行数。

⑥Broadcast Cluster
广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。

现在广播调用中,可以通过 broadcast.fail.percent 配置节点调用失败的比例,当达到这个比例后,BroadcastClusterInvoker 将不再调用其他节点,直接抛出异常。 broadcast.fail.percent 取值在 0~100 范围内。默认情况下当全部调用失败后,才会抛出异常。 broadcast.fail.percent 只是控制的当失败后是否继续调用其他节点,并不改变结果(任意一台报错则报错)。broadcast.fail.percent 参数 在 dubbo2.7.10 及以上版本生效。

Broadcast Cluster 配置 broadcast.fail.percent。

broadcast.fail.percent=20 代表了当 20% 的节点调用失败就抛出异常,不再调用其他节点。

@reference(cluster = "broadcast", parameters = {"broadcast.fail.percent", "20"})

5.3.2集群容错配置

服务提供方配置集群模式

<dubbo:service cluster="failsafe" />

消费方配置集群模式

<dubbo:reference cluster="failsafe" />

5.4服务降级

官⽹地址:http://dubbo.apache.org/zh/docs/v2.7/user/examples/service-downgrade/

服务降级:服务消费者在调⽤某个服务提供者时,如果该服务提供者报错了,临时屏蔽某个出错的非关键服务,并定义降级后的返回策略。

集群容错和服务降级的区别在于:

  1. 集群容错是整个集群范围内的容错
  2. 服务降级是单个服务提供者的⾃身容错

向注册中心写入动态配置覆盖规则:

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 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。

5.5路由规则

通过 Dubbo 中的路由规则做服务治理。

路由规则:https://dubbo.apache.org/zh/docs/v2.7/user/examples/routing-rule/

5.5.1路由规则表示:

路由规则在发起一次RPC调用前起到过滤目标服务器地址的作用,过滤后的地址列表,将作为消费端最终发起RPC调用的备选地址。

5.5.2路由规则分类:

条件路由。支持以服务Consumer 应用为粒度配置路由规则。

标签路由。以 Provider 应用为粒度配置路由规则。

5.6动态配置

官⽹地址:http://dubbo.apache.org/zh/docs/v2.7/user/examples/config-rule/

意动态配置修改的是服务参数,并不能修改服务的协议、IP、PORT、VERSION、GROUP,因为这5个信息是服务的标识信息,是服务的身份证号,是不能修改的。

5.7 蓝绿发布、灰度发布

https://zhuanlan.zhihu.com/p/42671353

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值