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)
在服务提供者和服务消费者上都可以配置服务超时时间,这两者是不⼀样的。 消费者调⽤⼀个服务,分为三步:
- 消费者发送请求(⽹络传输)
- 服务端执⾏服务
- 服务端返回响应(⽹络传输)
如果在服务端和消费端只在其中⼀⽅配置了timeout,那么没有歧义,**表示消费端调⽤服务的超时时间,**消费端如果超过时间还没有收到响应结果,则消费端会抛超时异常,但,服务端不会抛异常,服务端在执⾏服务后,会检查执⾏该服务的时间,如果超过timeout,则会打印⼀个超时⽇志。服务会正常的执⾏完。
如果在服务端和消费端各配了⼀个timeout,那就⽐较复杂了,假设
- 服务执⾏为5s
- 消费端timeout=3s
- 服务端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 集群容错
- 集群容错是整个集群范围内的容错
- 服务降级是单个服务提供者的⾃身容错
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做的事项呀!!