微服务组件--限流框架Spring Cloud Hystrix分析

Hystrix的介绍【1】Hystrix是springCloud的组件之一 , Hystrix 可以让我们在分布式系统中对服务间的调用进行控制加入一些调用延迟或者依赖故障的容错机制 。
【2】Hystrix 通过将依赖服务进行资源隔离进而阻止某个依赖服务出现故障时在整个系统所有的依赖服务调用中进行蔓延;【防止服务雪崩】
【3】其核心功能:
1)服务隔离(服务限流)
通过线程池或者信号量判断是否已满,超出容量的请求直接降级,以达到限流的作用 。
2)服务熔断
当失败率达到阈值自动触发降级,熔断器触发的快速失败会有助于系统防止崩溃 。【可以说熔断是特定条件的降级】
3)服务降级
服务降级是当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行 。
Hystrix的简单使用【1】引入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>【2】启动类开启hystrix功能
@SpringBootApplication//注册到eureka@EnableEurekaClient//开启断路器功能@EnableCircuitBreakerpublic class WebApplication {【微服务组件--限流框架Spring Cloud Hystrix分析】【3】注解@HystrixCommand参数分析
@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic @interface HystrixCommand {// HystrixCommand 命令所属的组的名称:默认注解方法类的名称String groupKey() default "";// HystrixCommand 命令的key值 , 默认值为注解方法的名称String commandKey() default "";// 线程池名称,默认定义为groupKeyString threadPoolKey() default "";// 定义回退方法的名称, 此方法必须和hystrix的执行方法在相同类中String fallbackMethod() default "";// 配置hystrix命令的参数HystrixProperty[] commandProperties() default {};// 配置hystrix依赖的线程池的参数HystrixProperty[] threadPoolProperties() default {};// 如果hystrix方法抛出的异常包括RUNTIME_EXCEPTION,则会被封装HystrixRuntimeException异常 。我们也可以通过此方法定义哪些需要忽略的异常Class<? extends Throwable>[] ignoreExceptions() default {};// 定义执行hystrix observable的命令的模式,类型详细见ObservableExecutionModeObservableExecutionMode observableExecutionMode() default ObservableExecutionMode.EAGER;// 如果hystrix方法抛出的异常包括RUNTIME_EXCEPTION , 则会被封装HystrixRuntimeException异常 。此方法定义需要抛出的异常HystrixException[] raiseHystrixExceptions() default {};// 定义回调方法:但是defaultFallback不能传入参数,返回参数和hystrix的命令兼容String defaultFallback() default "";}【4】使用示例
//线程池隔离的设置,线程池隔离与信号量隔离的最大区别在于发送请求的线程,信号量是采用调用方法的线程 , 而线程池则是用池内的线程去发送请求@HystrixCommand(groupKey="test-provider",threadPoolKey="test-provider",threadPoolProperties = {@HystrixProperty(name = "coreSize", value = "https://www.huyubaike.com/biancheng/20"),//线程池大小@HystrixProperty(name = "maximumSize", value = "https://www.huyubaike.com/biancheng/30"),//最大线程池大小@HystrixProperty(name = "maxQueueSize", value = "https://www.huyubaike.com/biancheng/20"),//最大队列长度@HystrixProperty(name ="keepAliveTimeMinutes", value = "https://www.huyubaike.com/biancheng/2")//线程存活时间},commandProperties = {@HystrixProperty(name = "execution.isolation.strategy",value = "https://www.huyubaike.com/biancheng/THREAD")}//信号量隔离的设置@HystrixCommand(//用来设置降级方法fallbackMethod = "myTestFallbackMethod",commandProperties = {//进行熔断配置//条件1,设置在滚动时间窗口中,断路器的最小请求数(没有达到不会熔断) 。默认20 。@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold" ,value = "https://www.huyubaike.com/biancheng/10"),//条件2 , 设置断路器打开的错误百分比 。在滚动时间内,在请求数量超过requestVolumeThreshold的值,且错误请求数的百分比超过这个比例,断路器就为打开状态 。@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage" ,value = "https://www.huyubaike.com/biancheng/30"),//条件3,设置滚动时间窗的长度,单位毫秒 。这个时间窗口就是断路器收集信息的持续时间 。断路器在收集指标信息的时会根据这个时间窗口把这个窗口拆分成多个桶,每个桶代表一段时间的指标,默认10000.@HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds" ,value = "https://www.huyubaike.com/biancheng/10000"),//设置当断路器打开之后的休眠时间,休眠时间结束后断路器为半开状态 , 断路器能接受请求,如果请求失败又重新回到打开状态 , 如果请求成功又回到关闭状态//单位是毫秒@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds" ,value = "https://www.huyubaike.com/biancheng/3000"),//配置信号量隔离//配置信号量的数值@HystrixProperty(name = "execution.isolation.semaphore.maxConcurrentRequests",value = "https://www.huyubaike.com/biancheng/100"),//选择策略为信号量隔离@HystrixProperty(name = "execution.isolation.strategy", value = "https://www.huyubaike.com/biancheng/SEMAPHORE"),//设置HystrixCommand执行的超时时间,单位毫秒@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "https://www.huyubaike.com/biancheng/1000000000")})public String Test(){....}public String myTestFallbackMethod() {log.info("========myTestFallbackMethod=========");return "myTestFallbackMethod";}

推荐阅读