zoukankan      html  css  js  c++  java
  • 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毫秒
  • 相关阅读:
    记一次文件上传报错解决过程The temporary upload location is not vali
    Redis反序列化LocalDateTime时报错
    Redis连接池Lettuce Jedis 区别
    Java获取时间打印到控制台
    Java多线程之volatile关键字
    Java多线程之Future,有返回值的线程
    ccf集合竞价
    增广路径求解最大流
    2016年9月ccf
    hash表的建立和查找
  • 原文地址:https://www.cnblogs.com/zxh06820/p/12907145.html
Copyright © 2011-2022 走看看