Nacos(1.6)- nacos 服务消费(服务熔断与降级,以及Hystrix的使用)
服务熔断与降级概念
熔断:当下游服务报错不可用时,上游服务为了保证整体服务的可用性,不再继续调用目标服务,直接返回,快速释放资源
降级:当下游服务响应过慢或者不可用时,上游服务调用下游服务的降级逻辑,立即返回结果,熔断可以看成是降级的一种形式
降级有如下几种类型:
- 超时降级
- 失败次数降级
- 故障降级
- 限流降级
参考:
https://blog.csdn.net/Milogenius/article/details/104934611
https://blog.csdn.net/ityouknow/article/details/81230412
为何要使用服务降级
解释了降级的概念,可以先看下如下例子:
在 nacos_demo_provider 服务中,http://127.0.0.1:9092/nacos-provider/hello 接口报错
@RestController
public class NacosProviderController {
@Value("${server.port}")
private String port;
@GetMapping(value = "hello")
public String hello() {
int a = 0;
int b = 1 / a;
return "hello, i am from " + port;
}
}
异常为:
java.lang.ArithmeticException: / by zero
nacos_demo_consumer 服务 http://127.0.0.1:9095/nacos-consumer/hello2 接口调用 nacos_demo_provider 服务 http://127.0.0.1:9092/nacos-provider/hello 接口,假设不做降级处理,那么nacos_demo_provider服务异常会直接导致 nacos_demo_consumer 服务对应接口不可用
如何使用Netflix Hystrix使服务降级
Hystrix 是 Netflix 公司提供的服务降级框架,Spring Cloud OpenFeign 默认集成了 hystrix,所以引入了spring-cloud-starter-openfeign 依赖就可以使用 hystrix 了。
① 使用 hystrix 前要将openfeign对hystrix支持的开关打开
feign:
hystrix:
enabled: true
② 配置 @FeignClient 中 fallback 或 fallbackFactory 属性,fallbackFactory 功能更强些,以 fallbackFactory 配置为例
/**
* path 配置对应服务端的上下文路径
*/
@Component
@FeignClient(name = "nacos-provider", path = "nacos-provider", configuration = {FeignClientConfig.class}, fallbackFactory = HystrixClientFallbackFactory.class)
public interface NacosProviderService {
@RequestMapping(method = RequestMethod.GET, value = "hello")
String hello();
}
③ 编写降级处理类 HystrixClientFallbackFactory
package com.hs.nacos_demo_consumer;
import com.hs.nacos_demo_consumer.service.NacosProviderService;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;
@Component
public class HystrixClientFallbackFactory implements FallbackFactory<NacosProviderService> {
@Override
public NacosProviderService create(Throwable throwable) {
return new NacosProviderService() {
@Override
public String hello() {
System.out.println(throwable.getMessage());
return "服务降级";
}
};
}
}
测试: