天天看点

实战Spring Cloud 微服务容错保护Hystrix

文章目录

  • ​​背景​​
  • ​​一、微服务容错保护的措施​​
  • ​​1.1 服务熔断​​
  • ​​1.2 服务降级​​
  • ​​Spring Cloud Hystrix​​
  • ​​二、实战Hystrix​​
  • ​​2.1 引入Hystrix依赖​​
  • ​​2.2 开启Hystrix支持​​
  • ​​2.3 配置Hystrix​​
  • ​​2.4 在微服务调用接口中增加服务容错保护​​
  • ​​2.5 启动后台微服务进行测试服务可用性​​
  • ​​2.6 关闭后台微服务测试熔断处理​​
  • ​​小结​​

背景

  • 由于网络或者自身的原因,微服务并不能保证服务百分之百可用。对不可用的微服务反复重试调用,会增加服务器的负载,严重的情况下会导致该服务瘫痪。
  • 调用相互依赖的微服务而出现问题也在所难免的。当遇到问题时,应及时地启动应急预案,让系统进行自我调节和保护。
  • 如果不能及时有效地隔离有问题的微服务,则所有的服务请求有可能会因为这个单点故障而阻塞,导致整个服务链都不能正常对外提供服务,从而产生雪崩效应。此时就需要我们对微服务进行容错保护,及时发现微服务故障并进行处理。
实战Spring Cloud 微服务容错保护Hystrix

一、微服务容错保护的措施

1.1 服务熔断

  • 类似熔断保险丝机制,当调用链路的某个微服务不可用或者响应时间太长时,会进行服务熔断,不再有该节点微服务的调用,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后,再恢复调用链路。

1.2 服务降级

  • 当整个微服务架构的负载超出了预设的上限阈值或即将到来的流量预计将会超过预设的阈值时,为了保证重要或基本的服务能正常运行,可以将一些不重要或不紧急的服务进行降级、 延迟 或 暂停使用。

Spring Cloud Hystrix

  • 在Spring Cloud Netflix所提供的解决方案中有一个名为Hystrix(豪猪)的库,通过该库可以为我们解决以下问题:·
  1. 对第三方接口/依赖服务潜在的调用失败提供保护和控制机制。·
  2. 在分布式系统中隔离资源,降低耦合,防止服务之间相互调用而导致级连失败;·
  3. 快速失败及迅速恢复。·在合适的时机对服务进行优雅降级处理。·对服务提供近乎实时的监控、报警和控制操作。
实战Spring Cloud 微服务容错保护Hystrix

二、实战Hystrix

  • 对于微服务容错来说保护的是服务消费方,下面我们对服务调用者UserConsumer进行更改。

2.1 引入Hystrix依赖

<!-- pom.xml -->
    <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            <version>2.1.1.RELEASE</version>
        </dependency>      

2.2 开启Hystrix支持

  • 在启动类中增加@EnableCircuitBreaker注解
/**
 * 主启动类
 */
@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
@EnableCircuitBreaker
public class DemoConsumerApplication {

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

2.3 配置Hystrix

# application.yml 

# 启用hystrix
feign:
  hystrix:
    enabled: true
# hystrix超时设置
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 5000      

2.4 在微服务调用接口中增加服务容错保护

  • 在接口中增加服务容错处理,指定服务熔断时处理的类名
/**
 * 商品微服务接口
 */
@Component
// 增加服务容错处理,指定服务熔断时处理的类名
@FeignClient(value="goods-service",fallback =FallBackService.class )
public interface GoodService {

    @GetMapping(value="/api/goods")
    List<GoodsDTO> getGoods();

}      
  • 实现服务熔断时处理类
/**
 * 服务熔断处理
 */
@Component
public class FallBackService implements GoodService {
    private final static Logger logger= LoggerFactory.getLogger(FallBackService.class) ;

    @Override
    public List<GoodsDTO> getGoods() {
        logger.info("服务已熔断...");
        return new ArrayList<>();
    }
}      

2.5 启动后台微服务进行测试服务可用性

  • 启动后台微服务
  • 实战Spring Cloud 微服务容错保护Hystrix
  • 微服务被调用
  • 实战Spring Cloud 微服务容错保护Hystrix
  • 消费者获取到微服务提供的商品信息
  • 实战Spring Cloud 微服务容错保护Hystrix

2.6 关闭后台微服务测试熔断处理

  • 关闭后台微服务:查看nacos控制台,没有微服务运行
  • 实战Spring Cloud 微服务容错保护Hystrix
  • 使用Rest HttpClient进行服务调用测试:调用者发现微服务已熔断,返回空数据。
实战Spring Cloud 微服务容错保护Hystrix
实战Spring Cloud 微服务容错保护Hystrix

小结

  • 本文介绍了微服务雪崩效应及容错保护机制,及如何使用Hystrix进行基本的熔断和降级等技术实现服务容错,从而提高微服务系统的整体健壮性。
  • 但不幸的是Hystrix也已经停更
  • 目前阿里的Sentinel可以完美替换hystrix