SpringCloud基础(六)Hystrix:熔断降级

目录

1、基础概念

2、使用方式

3、OpenFeign使用Hystrix实现降级

3.1、接口写法

3.2、实现FallbackFactory

4、熔断机制

5、依赖隔离

5.1、线程池隔离

5.2、信号量隔离

6、Gateway使用Hystrix实现降级


1、基础概念

Hystrix是一个分布式组件,其主要功能有:

  1. 对第三方客户端访问的依赖项的延迟和故障进行保护和控制
  2. 在复杂的分布式系统中阻止级联故障
  3. 快速失败,快速恢复
  4. 回退,尽可能优雅地降级
  5. 启用近实时监控,警报和操作控制

Hystrix的设计原则如下:

  1. 防止任何单个依赖耗尽容器所有用户线程
  2. 减少负载并快速失败,取代请求排队方式
  3. 根据情况提供降级方法,来保护用户不受到故障影响
  4. 使用服务隔离的方式,限制依赖项故障产生的影响
  5. 以接近实时的度量,监视和警报来优化发现时间。

2、使用方式

在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();
}

3、OpenFeign使用Hystrix实现降级

在openfeign组件中,已经集成了Hystrix,可以直接进行使用。

3.1、接口写法

在@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();
        }
    }
}

3.2、实现FallbackFactory

通过对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();
                }
            };
        }
    }
}

4、熔断机制

Hystrix的熔断机制是,在一定时间内,超过一定百分比的请求失败了,接下来的一定时间内所有的请求都将直接fallback,不再请求至服务器。

Hystrix有三种熔断状态,分别是close,open,half open。在平时,熔断是关闭的,也就是close状态,当满足熔断发生条件时,状态会到达open,熔断开启。当上文所说的熔断时间过去之后,服务器会尝试发送一个请求,如果这个请求得到了正常响应,就可以让open回到close。

在HystrixCommandProperties类中,有参数对触发熔断的条件进行定义,并且有默认值。

  1. requestVolumeThreshold:最小请求次数,默认值20
  2. sleepWindowInMilliseconds:触发熔断后拒绝访问时长,默认值5000,即5秒
  3. errorThresholdPercentage:失败请求比例,默认值50

想要自定义的话,就将这几个参数加入到注解内即可

@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")
    })

5、依赖隔离

除了熔断机制之外,为了避免请求无法响应导致的雪崩,Hystrix还实现了依赖隔离。在在HystrixCommandProperties类中,参数execution.isolation.strategy隔离策略起到了控制隔离方式的作用,其默认数值为线程

default_executionIsolationStrategy = HystrixCommandProperties.ExecutionIsolationStrategy.THREAD;

 这个枚举中有两个类型,线程和信号量

    public static enum ExecutionIsolationStrategy {
        THREAD,
        SEMAPHORE;

        private ExecutionIsolationStrategy() {
        }
    }

5.1、线程池隔离

线程池隔离就是不同的业务运行在不同的线程池中,一旦一个请求耗尽线程资源,也只会导致一个线程池无法继续工作,不会影响到整个系统,同时线程池也具有快速恢复的能力。

缺点是线程池本身就会消耗CPU资源,需要合理规划

5.2、信号量隔离

信号量隔离会设置一个并发处理的最高上限,一旦超过这个上限,超过上限的请求就会直接返回fallback

6、Gateway使用Hystrix实现降级

在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'

你可能感兴趣的:(spring,基础,spring,cloud,Hystrix,熔断降级)