Dubbo源码分析8之服务降级

Dubbo源码分析8之服务降级

1.简介

可以通过服务降级功能临时屏蔽某个出错的非关键服务,并定义降级后的返回策略。

服务降低的方式有两种:容错和屏蔽。

配置方式:可以通过dubbo监控中心控制台配置,也可以通过代码配置。

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

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

2.源码分析

首先回顾下上篇文章中的一个请求调用链:

 proxy0#sayHello(String)> InvokerInvocationHandler#invoke(Object, Method, Object[])> MockClusterInvoker#invoke(Invocation) //服务降级逻辑> AbstractClusterInvoker#invoke(Invocation)//调用子类模板方法doInvoke> FailoverClusterInvoker#doInvoke(Invocation, List<Invoker<T>>, LoadBalance)> Filter#invoke(Invoker, Invocation)  // 包含多个 Filter 调用> ListenerInvokerWrapper#invoke(Invocation)> AbstractInvoker#invoke(Invocation) //添加信息到 RpcInvocation#attachment > DubboInvoker#doInvoke(Invocation)> ReferenceCountExchangeClient#request(Object, int)//实现引用计数功能> HeaderExchangeClient#request(Object, int)> HeaderExchangeChannel#request(Object, int)> AbstractPeer#send(Object)> AbstractClient#send(Object, boolean)> NettyChannel#send(Object, boolean)> NioClientSocketChannel#write(Object)    

服务降级就发生在这一行MockClusterInvoker#invoke(Invocation),如下:

public class MockClusterInvoker<T> implements Invoker<T> {
   

    private static final Logger logger = LoggerFactory.getLogger(MockClusterInvoker.class);

    private final Directory<T> directory;

    private final Invoker<T> invoker;

    public MockClusterInvoker(Directory<T> directory, Invoker<T> invoker) {
   
        this.directory = directory;
        this.invoker = invoker;
    }

	//...

    @Override
    public Result invoke(Invocation invocation) throws RpcException {
   
        Result result = null;
		
        String value = directory.getUrl().getMethodParameter(invocation.getMethodName(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值