目录
1、基础概念
2、使用方式
3、OpenFeign使用Hystrix实现降级
3.1、接口写法
3.2、实现FallbackFactory
4、熔断机制
5、依赖隔离
5.1、线程池隔离
5.2、信号量隔离
6、Gateway使用Hystrix实现降级
Hystrix是一个分布式组件,其主要功能有:
Hystrix的设计原则如下:
在pom文件中增加:
org.springframework.cloud
spring-cloud-starter-netflix-hystrix
在application类中增加注解@EnableHystrix,启动熔断:
@EnableHystrix
@EnableFeignClients("com.my.example")
@SpringBootApplication
public class ProviderConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderConsumerApplication.class, args);
}
}
熔断注解有两种,@HystrixCommand用于方法级别,@DefaultProperties用于类级别,他们都可以设置一个fallback方法,在方法执行出现异常时,会自动返回fallback设置方法的返回内容。
@RestController
@DefaultProperties(defaultFallback = "fallback")
public class HystrixController {
@Autowired
private UserClient userClient;
@HystrixCommand(fallbackMethod = "fallback")
@GetMapping("/hystrix")
public String user() {
User user = userClient.queryUser();
return "hello " + user.getName();
}
public String fallback(){
return "服务异常";
}
}
在这个方法里,添加了熔断降级的时间,将超过3s还没有返回值的方法进行降级处理。
@HystrixCommand(fallbackMethod = "fallback", commandProperties = {
@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_THREAD_TIMEOUT_IN_MILLISECONDS, value = "3000")
})
@GetMapping("/hystrix")
public String user() {
User user = userClient.queryUser();
return "hello " + user.getName();
}
在openfeign组件中,已经集成了Hystrix,可以直接进行使用。
在@FeignClient接口中就可以设置fallback触发的类。这个熔断类需要交给IOC托管,通过实现IDataService来实现方法。
@FeignClient(value = "spring-cloud-data-provide", fallback = DataFeign.DataServiceDefaultFallback.class)
public interface DataFeign extends IDataService {
@Component
class DataServiceDefaultFallback implements IDataService {
@Override
public Data sayHello() {
return new Data();
}
}
}
通过对FallbackFactory的实现,完成熔断。FallbackFactory中定义泛型为FeignClient本身,返回FeignClient实现类,因此要实现所有接口的抽象方法,完成熔断构建。
@FeignClient(value = "spring-cloud-user-provide", fallbackFactory = UserClient.UserClientFallback.class)
public interface UserClient {
@GetMapping("/user") User queryUser();
@Component
class UserClientFallback implements FallbackFactory {
@Override
public UserClient create(Throwable cause) {
return new UserClient() {
@Override
public User queryUser() {
return new User();
}
};
}
}
}
Hystrix的熔断机制是,在一定时间内,超过一定百分比的请求失败了,接下来的一定时间内所有的请求都将直接fallback,不再请求至服务器。
Hystrix有三种熔断状态,分别是close,open,half open。在平时,熔断是关闭的,也就是close状态,当满足熔断发生条件时,状态会到达open,熔断开启。当上文所说的熔断时间过去之后,服务器会尝试发送一个请求,如果这个请求得到了正常响应,就可以让open回到close。
在HystrixCommandProperties类中,有参数对触发熔断的条件进行定义,并且有默认值。
想要自定义的话,就将这几个参数加入到注解内即可
@HystrixCommand(fallbackMethod = "fallback", commandProperties = {
@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_THREAD_TIMEOUT_IN_MILLISECONDS, value = "3000"),
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD, value = "6"),
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS, value = "10000"),
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE, value = "50")
})
除了熔断机制之外,为了避免请求无法响应导致的雪崩,Hystrix还实现了依赖隔离。在在HystrixCommandProperties类中,参数execution.isolation.strategy隔离策略起到了控制隔离方式的作用,其默认数值为线程
default_executionIsolationStrategy = HystrixCommandProperties.ExecutionIsolationStrategy.THREAD;
这个枚举中有两个类型,线程和信号量
public static enum ExecutionIsolationStrategy {
THREAD,
SEMAPHORE;
private ExecutionIsolationStrategy() {
}
}
线程池隔离就是不同的业务运行在不同的线程池中,一旦一个请求耗尽线程资源,也只会导致一个线程池无法继续工作,不会影响到整个系统,同时线程池也具有快速恢复的能力。
缺点是线程池本身就会消耗CPU资源,需要合理规划
信号量隔离会设置一个并发处理的最高上限,一旦超过这个上限,超过上限的请求就会直接返回fallback
在gateway组件中增加配置,增加过滤器Hystrix
其配置fallbackUri的内容是固定写法,forward后面的自定义熔断方法需要添加一个同名controller来实现熔断功能
- id: hystrix_route
uri: http://localhost:8083
predicates:
- Path=/hystrix/**
filters:
- StripPrefix=1
- name: Hystrix
args:
name: default
fallbackUri: forward:/fallback
FallbackController类写法如下,其访问路径是要与配置相同的,即fallback。
@RestController
public class FallbackController {
@GetMapping("fallback")
public String fallback(){
return "网关熔断";
}
}
在正式环境下,配置基本都会被配置到默认过滤器中,给每一个路由进行过滤
default-filters:
- name: Hystrix
args:
name: default
fallbackUri: 'forward:/fallback'