简介
Hystrix是SpringCloud Netflix下的一个库,实现了Circuit Breaker(电路熔断器)模式。关于Circuit Breaker模式的原理,可以参考:Circuit Breaker(电路熔断器)模式原理 。
实际上SpringCloud支持多种Circuit Breaker实现,如:
- Netfix Hystrix
- Resilience4J
- Sentinel
- Spring Retry
本文主要介绍Netfix Hystrix的用法。
实验步骤
我们需要两个应用,分别为bookstore和reading,bookstore作为被访问的应用,reading为应用了Hystrix的应用,reading应用的/to-read
endpoint回去调用bookstore的/recommended
,当访问bookstore的/recommended
失败时,会触发熔断,转而调用一个fallback方法。
bookstore应用
初始化应用
利用Spring Initializr初始化我们的应用,在这里后端服务只要是一个普通的Web服务就可以了,所以添加一个Spring Web
依赖即可:
将得到的压缩包解压后导入到idea中。
主程序
主程序提供了一个/recommended
endpoint,完整代码如下:
package com.example.hystrixcircuitbreakerbookstore;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
@RestController
@SpringBootApplication
public class HystrixCircuitBreakerBookstoreApplication {
@RequestMapping(value = "/recommended")
public String readingList(){
return "Spring in Action (Manning), Cloud Native Java (O'Reilly), Learning Spring Boot (Packt)";
}
public static void main(String[] args) {
SpringApplication.run(HystrixCircuitBreakerBookstoreApplication.class, args);
}
}
应用配置
在src\main\resources\application.properties
中为应用指定一个可用的端口,如下:
server.port=8300
完成以上步骤以后就可以把应用运行起来了。
访问应用
打开浏览器,输入地址http://localhost:8300/recommended
,出现类似以下界面则表示应用正常运行:
reading应用
初始化应用
利用Spring Initializr初始化我们的应用,这里我们添加如下两个依赖:
主程序
主程序提供一个/to-read
endpoint,该endpoint会尝试去bookstore应用中获取数据(见下文),完整代码如下:
package com.example.hystrixcircuitbreakerreading;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.web.client.RestTemplate;
@EnableCircuitBreaker
@RestController
@SpringBootApplication
public class HystrixCircuitBreakerReadingApplication {
@Autowired
private BookService bookService;
@Bean
public RestTemplate rest(RestTemplateBuilder builder) {
return builder.build();
}
@RequestMapping("/to-read")
public String toRead() {
return bookService.readingList();
}
public static void main(String[] args) {
SpringApplication.run(HystrixCircuitBreakerReadingApplication.class, args);
}
}
BookService
Spring Cloud Netflix Hystrix会找到标记了注解@HystrixCommand
的方法,并把这些方法代理起来,从而让Hystrix能够监控它。Hystrix只会监控@Component
和@Service
类中的方法,当监控到某个方法的失败调用次数达到一定阈值的时候,就会断开电路,后续对该方法的调用都会立即失败,并把对该方法的调用重定向到一个fallback方法中。在BookService
类中,我们把readingList
方法带上@HystrixCommand
添加到Hystrix的监控中,当该方法执行失败时会被熔断,熔断后对该方法的调用会被重定向到fallback方法reliable
中,完整代码如下:
package com.example.hystrixcircuitbreakerreading;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.net.URI;
@Service
public class BookService {
private final RestTemplate restTemplate;
public BookService(RestTemplate rest) {
this.restTemplate = rest;
}
@HystrixCommand(fallbackMethod = "reliable")
public String readingList() {
URI uri = URI.create("http://localhost:8300/recommended");
return this.restTemplate.getForObject(uri, String.class);
}
public String reliable() {
return "Cloud Native Java (O'Reilly)";
}
}
应用配置
在src\main\resources\application.properties
中为应用指定一个可用的端口,如下:
server.port=8301
完成以上步骤以后就可以把应用运行起来了。
运行应用
打开浏览器,输入地址http://localhost:8301/to-read
,此时bookstore应用正常运作,因此能从bookstore中拿到数据,显示出来:
将bookstore应用关掉,此时再访问该接口,发现该接口已经被熔断,显示的结果的fallback方法reliable
的输出:
参考资料
Circuit Breaker(电路熔断器)模式原理
https://spring.io/guides/gs/circuit-breaker/