duubo高可用:服务降级(十三)

版权声明:原创文章,未经允许不得转载。ps: 传统电商火热的时代已经成为过去 , 下一个阶段属于大数据 人工智能 , 服务、便捷、安全、效率、创新成为下一个阶段互联网时代的新词汇,而IT技术也随着行业的变化发展而不断更迭。对于码农的出路总结一句话:追技术不如追领域。[基础][设计][能力] https://blog.csdn.net/shengqianfeng/article/details/82320883

什么是服务降级?

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

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

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

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"));

其中:

  1. mock=force:return+null 表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。
  2. 还可以改为 mock=fail:return+null 表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。

测试:

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

扫描二维码关注公众号,回复: 3105263 查看本文章

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

开始测试接口http://localhost:7777/getAllUsers时:

屏蔽后:

可以看到消费者已经屏蔽了远程调用直接返回空对象,再次请求:

可以看到已经不再返回了!

我们也可以选择恢复远程调用,点击消费者侧的恢复按钮:

然后再次访问,又得到了远程调用的结果:

还有一个按钮“容错”,意思是发生远程调用失败之后,返回空对象,我们将远程服务添加一个休眠3s的代码;

@Override
	public List<User> getALlUsers(){
		System.out.println("getALlUsers in...");
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		List<User> users = userMapper.getAllUsers();
		return users;
	}

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

   //自动注入远程服务
	@Reference(loadbalance="random",timeout=1000)
	private UserService<User> userService;

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

看到界面报了一大堆的错误,这是因为我们没有进行荣错而直接打印超时了,远程访问异常结果直接显示了。然后我们点击消费者侧的容错按钮,这样当远程RPC出现异常时就会返回空对象:

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

这就是我们对一部分边缘服务降级的处理,保证核心服务得到更多资源。

猜你喜欢

转载自blog.csdn.net/shengqianfeng/article/details/82320883