springcloud之Hystrix熔断入门

Hystix是Netflix开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败。

Hystix解决雪崩问题的手段有两个:

  • 线程隔离

  • 服务熔断

1.线程隔离,服务降级

服务降级:优先保证核心服务,而非核心服务不可用或弱可用。

触发Hystix服务降级的情况:

  • 线程池已满

  • 请求超时

1.1在consumer的pom中引入hystrix熔断

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

1.2在引导类中添加注解,开启熔断

使用@EnableCircuitBreaker注解来开启熔断

到现在引导类上的注解包括:@SpringBootApplication  @EnableDiscoveryClient  @EnableCircuitBreaker

Spring提供了一个组合注解:@SpringCloudApplication  组合注解来代替之前的3个注解

@SpringCloudApplication
public class ItestConsumerApplication {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(ItestConsumerApplication.class, args);
    }
}

1.3降级逻辑

修改consumer中的UserController

  当目标服务的调用出现故障,希望快速失败,给用户一个友好提示。

  需要提前编写好失败时的降级处理逻辑,要使用HystixCommond来完成:

把降级逻辑方法配置在类上,实现默认fallback

@Controller
@RequestMapping("consumer/user")
@DefaultProperties(defaultFallback = "fallBackMethod")  //指定一个类的全局熔断方法;
public class UserController { @Autowired private RestTemplate restTemplate; @GetMapping @ResponseBody @HystrixCommand //标记该方法需要熔断public String queryUserById(@RequestParam("id") Long id) { String user = this.restTemplate.getForObject("http://test-provider/user/" + id, String.class); return user; }   

  // 这是熔断方法:返回值要和被熔断的方法的返回值保持一致,熔断方法不需要参数
public String queryUserByIdFallBack(Long id){ return "请求繁忙,请稍后再试!"; } }

熔断降级后处理的逻辑方法要跟正常逻辑执行方法保持一致:相同的参数列表和返回值声明

注解:

  • @DefaultProperties(defaultFallback = "defaultFallBack"):在类上指明统一的失败降级方法

  • @HystrixCommand:在方法上直接使用该注解,使用默认的剪辑方法。

  • defaultFallback:默认降级方法,不用任何参数,以匹配更多方法,但是返回值一定一致

2.服务熔断

  也叫断路器,其英文单词为:Circuit Breaker

熔断状态机3个状态:

  • Closed:关闭状态,所有请求都正常访问。

  • Open:打开状态,所有请求都会被降级。Hystix会对请求情况计数,当一定时间内失败请求百分比达到阈值,则触发熔断,断路器会完全打开。默认失败比例的阈值是50%,请求次数最少不低于20次。

  • Half Open:半开状态,open状态不是永久的,打开后会进入休眠时间(默认是5S)。随后断路器会自动进入半开状态。此时会释放部分请求通过,若这些请求都是健康的,则会完全关闭断路器,否则继续保持打开,再次进行休眠计时

2.1 默认触发熔断配置

一般不要配置修改熔断策略:

```properties
circuitBreaker.requestVolumeThreshold=默认
circuitBreaker.sleepWindowInMilliseconds=默认
circuitBreaker.errorThresholdPercentage=默认
```

- requestVolumeThreshold:触发熔断的最小请求次数,默认20
- errorThresholdPercentage:触发熔断的失败请求最小占比,默认50%
- sleepWindowInMilliseconds:休眠时长,默认是5000毫秒

猜你喜欢

转载自www.cnblogs.com/zxh06820/p/12907145.html
今日推荐