Spring Cloud教程-使用Hystrix实现容错性
使用Hystrix实现容错性
由于微服务之间相互依赖,微服务必须非常可靠。微服务架构包含大量小型微服务。这些微服务相互通信以满足其需求。
微服务的实例可能会频繁上下线。随着微服务之间交互的次数增加,系统中微服务发生故障的机会也会增加。
容错性
考虑这样一个场景,有六个微服务正在相互通信。微服务-5在某个时刻停机,而所有其他微服务都直接或间接依赖于它,因此所有其他服务也停机。
解决这个问题的方法是在微服务失败时使用回退机制。微服务的这一方面称为容错性。
可以借助断路器来实现容错性。断路器是一种模式,用于包装对外部服务的请求并检测其失败。如果检测到故障,断路器将打开。所有随后的请求立即返回错误,而不是向不健康的服务发出请求。它监视并检测服务的关闭和对其他服务的错误行为。它拒绝调用,直到它再次变得健康。
Hystrix
Hystrix是一个库,用于控制微服务之间的交互,以提供延迟和容错性。此外,修改用户界面以让用户知道某些事情可能不像预期的那样工作或需要更多时间也是有道理的。
使用Hystrix实现容错性
步骤1: 打开limits-service的pom.xml文件,并添加Hystrix依赖项
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
步骤2: 打开LimitsServicesApplication.java文件,并使用注解@EnableHystrix启用Hystrix。
package cn.javatiku.microservices.limitsservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
@SpringBootApplication
@EnableHystrix
public class LimitsServiceApplication
{
public static void main(String[] args)
{
SpringApplication.run(LimitsServiceApplication.class, args);
}
}
步骤3: 打开LimitsConfigurationController.java文件并创建一个Get方法。
@GetMapping("/fault-tolerance-example")
//configuring a fallback method
@HystrixCommand(fallbackMethod="fallbackRetrieveConfigurations")
public LimitConfiguration retrieveConfigurations()
{
throw new RuntimeException("Not Available");
}
//defining the fallback method
public LimitConfiguration fallbackRetrieveConfigurations()
{
//returning the default configuration
return new LimitConfiguration(999, 9);
}
让我们理解上述方法中发生了什么。
在上面的方法中,我们创建了一个故障容忍的Get映射。在下一行,我们使用注解@HystrixCommand配置了fallback方法。我们定义了一个名为fallbackRetrieveConfigurations()的方法,如果发生任何故障,它将返回默认值。
回退方法
回退方法是在发生故障时调用的方法。Hystrix允许我们为每个服务方法定义回退方法。这里有一个问题,如果方法抛出异常,那么应该返回什么给消费者呢?
答案是,如果retrieveConfiguraions()*失败,将调用*fallbackRetrieveConfigurations()*方法。回退方法返回硬编码的*LimitConfiguration实例。
步骤4: 打开浏览器,调用URL http://localhost:8080/fault-tolerance-example
。它返回我们在fallbackRetrieveConfigurations()方法中返回的值。