SpringCloud 之Hystrix断路器

熔断器Hystrix快速入门

1、什么是熔断器Hystrix
Hystrix 能使你的系统在出现依赖服务失效的时候,通过隔离系统所依赖的服务,防止服务级联失败,同时提供失败回退机制,更优雅地应对失效,并使你的系统能更快地从异常中恢复。

2、为什么要使用熔断器
在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应。服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者”的不可用,并将不可用逐渐放大的过程。

3、快速体验
OpenFeign 本身支持Hystrix,所以只需要引入 OpenFeign依赖即可。

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

开启hystrix。

#开启hystrix断路器
feign:
  hystrix:
    enabled: true

创建熔断实现类,实现远程调用 Feign 接口。

@Component
public class LabelClientImpl implements LabelClient {
	@Override
	public Result findById(String id) {
		return new Result(false, StatusCode.ERROR, "熔断器启动了");
	}
}

在远程调用 Feign 接口中指定熔断实现类。

@FeignClient(value="tensquare‐base", fallback = LabelClientImpl.class)

雪崩效应

在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应。服务雪崩效应是一种因服务提供者的不可用导致服务消费者的不可用,并将不可用逐渐放大的过程。

如果下图所示:A作为服务提供者,B为A的服务消费者,C和D是B的服务消费者。A不可用引起了B的不可用,并将不可用像滚雪球一样放大到C和D时,雪崩效应就形成了。
在这里插入图片描述

Hystrix简介

官网地址:https://github.com/Netflix/Hystrix/
官网宣布Hystrix已经停止更新并进入维护状态了,所以不建议使用了,替代方案:Spring Cloud Alibaba Sentinel
在这里插入图片描述
在这里插入图片描述
Netflix开源了Hystrix组件,实现了断路器模式,SpringCloud对这一组件进行了整合。 在微服务架构中,一个请求需要调用多个服务是非常常见的,如下图:
在这里插入图片描述
当对特定服务的呼叫达到一定阈值时(Hystrix中的默认值为5秒内的20次故障),电路打开,不进行通讯。并且是一个隔离的线程中进行的。
断路打开后,可用避免连锁故障,fallback方法可以直接返回一个固定值。
在这里插入图片描述

Hystrix设计原则

  • 防止单个服务的故障耗尽整个服务的 Servlet 容器(例如 Tomcat )的线程资源。
  • 快速失败机制,如果某个服务出现了故障,则调用该服务的请求快速失败,而不是线程等待。
  • 具有自我修复的能力,若服务正常了,熔断器关闭,服务故障,熔断器启动,避免服务正常后也无法正常调用服务。

Ribbon中使用断路器

改造eureka-ribbon-client工程的代码,首先在pox.xml文件中加入spring-cloud-starter-netflix-hystrix的起步依赖:

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

在启动类中添加@EnableHystrix注解开启Hystrix。

使用@HystrixCommand注解创建熔断器的功能,并指定了fallbackMethod熔断方法。

package com.yq.ribbon.controller;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class DemoController {

    @Autowired
    RestTemplate restTemplate;

    @GetMapping("/ribbon")
    @HystrixCommand(fallbackMethod = "error")
    public String demo() {
        return restTemplate.getForObject("http://eureka-client/hello", String.class);
    }
    
	// 服务降级方法要和原方法的参数列表一致
    public String error() {
        return "sorry,error!";
    }
}

启动测试,然后断掉将要将费的服务。
在这里插入图片描述
当服务不可用时,会执行熔断器指定的方法,而不是等待响应超时,这很好的控制了容器的线程阻塞。

Feign中使用断路器

由于 Feign 的起步依赖中已经 引入了 Hystrix 的依赖,所以在 Feign 中使用 Hystrix 不需要引入任何的依赖 。
Feign默认没有打开Hystrix功能,需要在配置文件中配置打开它。

#开启hystrix断路器
feign:
  hystrix:
    enabled: true

创建服务降级类FeignClientCallback

import org.springframework.stereotype.Component;

// 此类中的方法专门用于服务降级,该类一般要实现调用远程服务的接口(这样保证方法名一致)
@Component
public class FeignClientCallback implements FeignClientInter {

    // 服务降级的方法要和原方法一致(名称、参数列表)
    @Override
    public String sayHelloFromClient() {
        return "服务降级方法返回";
    }
}

在Feign客户端中添加fallback属性指定服务降级的类就行了。
在这里插入图片描述
启动测试,然后断掉将要将费的服务。
在这里插入图片描述
说明断路器起作用了。


版权声明:本文为const_原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。