Dubbo 服务降级 mock
概念:
- 当服务器压力剧增的情况下,根据实际业务情况以及流量对一些服务和页面有策略的不处理或者换种简单的方式处理,从而释放一些服务器资源来保证核心交易正常运作和高效运作。
种类:
- mock=force:return null:表示消费者对该服务方法调用直接返回null值,不发起远程调用。用来屏蔽不重要的服务不可用时对调用方的影响;
- mock=fail:return null:表示消费者对该服务方法调用在失败后,再返回null值,不抛出异常。用来容忍不重要服务不稳定时对调用方的影响。
Dubbo 集群容错 Cluster
Dubbo 的 Cluster 有什么用?
- 通过 Cluster 从 Directory服务目录 获取所有可调用的远程服务的 Invoker 列表,并且经过了路由规则的过滤,剩下的 Invokers,通过 Cluster.join() 封装成一个 Invoker 返回给消费者
- cluster 是一个中间层,为消费者屏蔽了服务提供者的情况,简化了消费者的使用,同时也更加方便的替换各种集群容错措施。
- 集群容错是消费端实现的
Cluster 的实现类
FailoverClusterInvoker
- 失败自动切换,一般用于触发重试 retries 的时候,适用于幂等操作(查询、修改、删除)。
- 根据负载均衡从中选择一个 Invoker 进行远程调用,同时也会记录上一次选择的 Invoker,使得每次调用不会一直换 Invoker
FailfastClusterInvoker
- 只会进行一次远程调用,如果失败后立即抛出异常,也就是快速失败
- 适用于不支持幂等的操作(新增)
FailsafeClusterInvoker
- 失败安全的 cluster,也就是调用出错仅仅日志记录一下,然后返回一个空结果
- 适用于写入审计日志等操作
FailbackClusterInvoker
- 失败自动恢复,cluster 调用失败后,会记录下来这次调用,然后返回一个空结果给服务消费者,同时会通过定时任务对失败的调用进行重调。
- 一般适用于消息通知等最大努力场景
ForkingClusterInvoker
- cluster 会在运行时将所有 Invoker 都通过线程池进行并发调用,只要有一个服务提供者成功即返回结果
- 一般适用于实时性要求比较高的读操作
BroadcastClusterInvoker
- cluster 会在运行时把所有的 Invoker 逐个调用,然后在最后判断如果有一个调用抛错就会抛出异常
- 适用于通知所有提供者更新缓存或者日志等本地资源信息的场景,要求每台服务器的信息一致
Dubbo 负载均衡 LoadBalance
- 服务提供者一般都采用集群部署,这样 cluster 虽然暴露一个 Invoker 给消费者调用,但是调用的时候,需要通过负载均衡选择出合适的服务提供者给消费者调用
AbstractLoadBalance
- 实现 LoadBalance 接口,封装一些公共的逻辑,实现服务预热
- 当服务刚启动的时候不能一下让负载过高,得让它慢慢热身,再加上负载,所以 getWeight() 计算权重的方法会判断服务运行的时间,来进行服务的降权,这是一个优化手段。
RandomLoadBalance
- 基于权重的随机负载均衡,Dubbo默认的负载均衡机制
LeastActiveLoadBalance
- 最少活跃数负载均衡,最少活跃数根据上一次服务器处理请求花费的时间
- 通过遍历 Invokers ,寻找最小活跃数的 Invoker, 如果有多个 Invoker 具有相同的最小活跃数,会记录这些 Invoker 的下标,通过权重进行选择类似于 RandomLoadBalance
ConsistentHashLoadBalance
- 一致性Hash负载均衡算法
- 详解一致性Hash算法
RoundRobinLoadBalance
- 基于权重的轮询负载均衡
总结
- 首先在服务引入的时候,将多个远程调用都塞入 Directory 中,然后通过 Cluster 来封装这个目录,封装的同时提供各种容错功能,如果FailOver、FailFast等等,最终暴露给消费者的就是一个 Invoker
- 消费者调用的时候会在目录里面得到 Invoker 列表,会经过路由的过滤,得到这些 Invokers 之后再由 LoadBalance 来进行负载均衡选择一个 Invoker,最终发起调用