SpringCloud(三):容错组件Hystrix


Springboot版本为2.2.6.RELEASE,SpringCloud版本为Hoxton.SR3

一、Hystrix相关概念

  • Hystrix实现了 超时机制和断路器模式,是Netflix开源的一个类库,用于隔离远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性与容错性
  • 提供保护机制:在调用的服务出现高延迟或失败时,为系统提供保护和控制
  • 防止雪崩
  • 包裹请求:使用HystrixCommand(或HystrixObservableCommand)对依赖的调用逻辑进行包裹,使每个命令在独立线程中运行
  • 跳闸机制:当某个服务提供方的的调用失败率达到一定阈值时,触发Hystrix跳闸机制,停止调用该服务一段时间
  • 资源隔离:Hystrix为每个依赖服务的请求维护了一个小型线程池,如果某个依赖服务的线程池已满,发往该依赖的请求会被立即决绝,而不是排队等待,加速失败判定,防止级联失败,即防止影响到其他依赖服务的请求。
  • 快速失败:不去真正请求服务,而是直接失败
  • 监控:Hystrix可以实时监控运行指标和配置的变化,提供近实时的监控、报警、运维控制
  • 回退机制:当请求失败或当断路器被打开时,执行我们自定义的回退逻辑,提供优雅的服务降级
  • 自我修复:断路器打开一段时间后,会自动进入“半开”状态,进行随机重试,当发现重试成功时,会重置断路器,请求可以正常进行

二、Hystrix整合RestTemplate

  1. 引入Maven依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  1. 启动类上添加注解@EnableCircuitBreaker
  2. 创建Service
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

/**
 * @author IT00ZYQ
 * @date 2021/5/9 10:17
 **/
@Service
public class RestService {

    private final RestTemplate restTemplate;

    public RestService(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    /**
     * defaultFallback指定调用失败时调用的方法
     * @return String
     */
    @HystrixCommand(defaultFallback = "back")
    public String hello() {
        String url = "http://code-service/test";
        return restTemplate.getForObject(url, String.class);
    }

    public String back() {
        return "失败啦,熔断啦";
    }
}
  1. Controller调用Service
@Autowired
private RestService restService;

/**
 * Hystrix整合RestTemplate
 * @return String
 */
@GetMapping("hello")
public String hello() {
    return "hello: " + restService.hello();
}

三、Hystrix整合Feign(一)

  1. 引入Maven依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  1. application.yml添加配置
feign:
  hystrix:
    enabled: true #feign开启hystrix熔断
  1. 启动类上添加注解@EnableCircuitBreaker
  2. 创建@FeignClient的fallback属性标记的接口实现类,实现降级逻辑
import org.springframework.stereotype.Component;

/**
 * 需要添加到Spring容器
 * @author IT00ZYQ
 * @date 2021/5/9 10:32
 **/
@Component
public class FeignHystrixBack implements UserServiceFeign {

    @Override
    public String hello() {
        return "hello, Feign and Hystrix!";
    }
}
  1. @FeignClient注解指定降级时调用实现类的方法
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

/**
 * 依赖于注册中心Eureka
 * fallback 熔断时调用的类,需要注入Spring容器
 * @author IT00ZYQ
 * @date 2021/5/8 18:25
 **/
@FeignClient(name = "code-service", fallback = FeignHystrixBack.class)
public interface UserServiceFeign {
    /**
     * 测试Feign调用
     * @return String
     */
    @GetMapping("test")
    String hello();
}
  1. Controller调用Service
@Autowired
private UserServiceFeign userServiceFeign;


/**
 * Hystrix整合Feign
 * @return String
 */
@GetMapping("hello")
public String hello() {
    return "hello: " + userServiceFeign.hello();
}

四、Hystrix整合Feign(二)

  1. 引入Maven依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  1. application.yml添加配置
feign:
  hystrix:
    enabled: true #feign开启hystrix熔断
  1. 启动类上添加注解@EnableCircuitBreaker
  2. 创建@FeignClient的fallbackFactory属性标记的工厂实现类,实现降级逻辑
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;

/**
 * @author IT00ZYQ
 * @date 2021/5/9 11:18
 **/
@Component
public class FeignHystrixBackFactory implements FallbackFactory<UserServiceFeign> {
    @Override
    public UserServiceFeign create(Throwable throwable) {
        return new UserServiceFeign() {
            @Override
            public String hello() {
                return "降级啦!FeignHystrixBackFactory";
            }
        };
    }
}
  1. @FeignClient注解指定降级时调用工厂实现类
package com.it00zyq.user_service.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

/**
 * 依赖于注册中心Eureka
 * fallbackFactory 熔断时调用的类,需要注入Spring容器
 * @author IT00ZYQ
 * @date 2021/5/8 18:25
 **/
@FeignClient(name = "code-service", fallbackFactory = FeignHystrixBackFactory.class)
public interface UserServiceFeign {
    /**
     * 测试Feign调用
     * @return String
     */
    @GetMapping("test")
    String hello();
}
  1. Controller调用Service
@Autowired
private UserServiceFeign userServiceFeign;

/**
 * Hystrix整合Feign
 * @return String
 */
@GetMapping("hello")
public String hello() {
    return "hello: " + userServiceFeign.hello();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

it00zyq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值