Bootstrap

dubbo应用

1、什么是RPC

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

2、什么是dubbo

Apache Dubbo是⼀款⾼性能、轻量级的开源Java服务框架

dubbo的基本原理

在这里插入图片描述

3、dubbo的应用

3.1 doubbo的@Service注解和Spring的@Service注解的区别

3.2 dubbo一个接口可以提供做个服务,唯一确定一个服务形如

协议(dubbo)😕/ip:port/接口名+group+version

3.3 dubbo的负载均衡策略

官网地址

1)Random LoadBalance (random)

可配置的provider、也可配置在consumer,主要配置在consumer端

1、服务端: @Service(iversion = “generic”,protocol = “p1”,loadbalance =
“roundrobin”)
2、消费端 @Reference(version = “generic”, loadbalance =
“roundrobin”)

2)RoundRobin LoadBalance (roundrobin)

3)LeastActive LoadBalance(leastactive):

原理

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

理解:

其实是消费者缓存每个服务提供者在本地,并为每个服务提供者分配属性active,请求到该服务active+1,该服务返回结果后active-1,当有多个请求都请求到某一服务但是该服务为能正常返回时,该active的值会一值比较大。所以应该选择active值最小的服务进行请求。

4)ConsistentHash LoadBalance (consistenthash)

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

3.4 dubbo的服务超时

配置

@Service(version = “timeout”, timeout = 4000)

在服务提供者和服务消费者上都可以配置服务超时时间,这两者是不⼀样的。 消费者调⽤⼀个服务,分为三步:

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

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

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

3.5 dubbo的集群容错

官网地址
在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。

1)Failover Cluster

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

2)Failfast Cluster

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

3)Failsafe Cluster

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

4)Failback Cluster

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

5)Forking Cluster

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

6)Broadcast Cluster

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

3.5 dubbo的服务降级

官网地址

配置在消费端:

@Reference(version = "timeout", timeout = 1000, mock = "force: return 123")

什么时服务降级?

服务消费者在调⽤某个服务提供者时,如果该服务提供者报错了,所采取的措施。

使用方式

1)mock=force:return+null 表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。
2)mock=fail:return+null 表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。

服务降级 VS 集群容错

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

3.6 dubbo的本地伪存

同“dubbo的服务降级”一样,使用mock属性默认只能不活provider抛出的RpcException。

mock内的值

1、true,此时必须在consumer端有接口名+Mock的类,且该类需实现接口。
2、实现了同服务提供接口相同的接口,如com.foo.BarServiceMock,类名没有要求
3、return ** 等同与 fail:return ** 提供方抛出RpcException时触发
4、throw ** 等同与 fail:throw ** 提供方抛出RpcException时触发
5、force:return ** 或者 force:throw ** 不请求服务提供者直接返回

3.6 dubbo的本地存根

使用
 @Reference(version = "timeout", timeout = 1000, stub = "true")
Stub原理

在这里插入图片描述

我的理解:

本地存根就是在consumer端,生成一个代理对象,用于处理前置的业务请求(参数校验、缓存等),及后置的非RpcException。但,一般在调用provider的接口时,业务系统会有业务类去做Stub做的事项呀!!

3.7 dubbo的参数回调

3.8 dubbo的异步调⽤

3.9 dubbo的泛化服务

4.0 Dubbo中的REST

;