Dubbo的一些高级用法

325 阅读4分钟

dubbo常规用法都是在服务提供方加个@Service注解,消费方用@Reference注解,再稍微注意一点,无非加个timeout属性标识一下超时时间,也不知道超时时间设置了会有啥影响

最近对注解的各个参数和Dubbo重新回顾了一下,发现事情并不简单。下面来看下这些你可能不知道,但一定好玩的功能。

服务超时时间到底怎么配?

@Reference和@Service都有timeout属性,那么区别是啥呢
提供者设置的timeout属性并不会实际影响整个调用流程,超时之后会在服务提供端打一个warn日志
消费者设置的timeout则会在超时之后直接在消费端报timeout的错误,但是无法打断服务提供者已经开始执行的线程。所以这里要做好幂等,万一扣费扣了三次,等着挨削了...

提供者是谁,我要自己定

@Reference注解有个url参数,这个参数可以让你指定提供者的url,一旦指定之后,消费者就会绕开负载均衡策略,直连上指定的提供者
在开发或者测试环境下,我们可能需要直连到某一台服务器,或者在某些场景下,我们只需要测试某个接口从特定提供者提供,可以使用这个参数,不过实话实说,用处不是太多~

负载不均衡怎么办

@Reference注解同样提供了loadbalance参数,用来指定负载均衡策略,官方可用的策略有四种


1. Random LoadBalance
随机负载,按权重设置随机概率
这种负载策略下,调用量越大分布越均匀,而且支持通过动态调配权重来调整负载情况

2. RoundRobin LoadBalance
轮询策略

3. LeastActive LoadBalance
最少活跃调用数
这个只配置在消费端,具体逻辑大家可以另外再查询,后面单独讲负载策略的区别

4.ConsistentHash LoadBalance
一致性hash
这种策略下会根据参数的hash值来做负载均衡,所以如果参数一致,会调用到同一个服务

集群容错

dubbo提供的集群容错参数是cluster
@Reference(cluster="xx") 注解即可完成容错策略的选择
集群容错也有对应的几种策略:

Failfast Cluster 快速失败,只执行一次就失败,通常用于非幂等,新增
FailSafe Cluster 失败安全,直接忽略,通常用于写入审计日志
FailBack Cluster 失败自动回复,定时重发
Forking Cluster 并行调用多个服务器,只要一个成功就返回

服务降级

容错降级是大家听到过最多但一般不太玩的到的东西,dubbo也为服务降级做了一点小功能,同样也是能用注解参数配置

@Reference mock="fail: return 123"
@Reference mock="force: return 123"

fail和force的区别是fail是失败后返回降级策略,force则不会调用服务,直接强制失败返回降级策略

本地存根我打赌你没怎么听过

感觉是个非常陌生的名词,Stub倒是常见,grpc玩过的同学应该也有见过,这个我理解类似一个远程调用的前置操作,调用Provider的时候,会生成一个proxy类,这时候会反向来找stub做一些前置操作,可以做一些缓存和参数校验之类的
但是日常写的时候很少会这么去玩,可以采用别的方式

泛化调用实用又不是很实用

能够带来更好的泛化操作,但是实际上rpc框架又希望能限制接口和参数来保证对接口进行更好的管控 泛化接口实现

impl GenericService

调用方

@Reference(id="demoService",version,innterfaceName="全限定类名",generic=true")

Rest调用

通过@Path在服务提供方增加地址从而让dubbo接口支持rest调用
这个功能整体来说目前不太常用,因为大家基本也是有自己的业务网关,这类能力会通过网关封装提供