dubbo 支持服务降级吗_dubbo服务降级

什么是服务降级?

当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作。

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

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

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

测试:

启动服务提供者和消费者,观察到控制台:

点击屏蔽按钮,达到在消费者这一侧直接返回空对象而不会发起远程RPC调用的结果:

测试接口http://localhost:7777/getAllUsers:

屏蔽:

消费者已经屏蔽了远程调用 再次请求:

选择恢复远程调用,点击消费者侧的恢复按钮。然后再次访问,又得到了远程调用的结果:

还有一个按钮“容错”,意思是发生远程调用失败之后,返回空对象。

我们将远程服务添加一个休眠3s的代码;

@Override

public ListgetALlUsers(){

System.out.println("getALlUsers in...");

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

Listusers = userMapper.getAllUsers();

return users;

}

然后修改消费者侧超时调用时间为1s:

//自动注入远程服务

@Reference(loadbalance="random",timeout=1000)

private UserServiceuserService;

重启服务提供者和消费者,再次访问:

界面报了一大堆的错误,这是因为我们没有进行容错,而远程访问异常结果 因此直接显示了。

然后我们点击消费者侧的容错按钮,这样当远程RPC出现异常时就会返回空对象:

再次访问接口,发现虽然接口超时但是返回的是一个空对象,变得更加友好:

文章来源: www.oschina.net,作者:潦草的犀牛,版权归原作者所有,如需转载,请联系作者。

原文链接:https://my.oschina.net/langwanghuangshifu/blog/3196070

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值