Hystrix 就是断路器,也叫熔断器。
在分布式系统中有很多的模块相互之间进行交互,如果其中的一个出现了问题,那么就会影响整个流程,导致整个服务出现故障。假如某一个模块无法正常工作时,能够通过我们提前配置的容错措施来使得整个系统能够继续正常运行,这样就可以在单个模块出问题时及时熔断该链路,不影响整个系统的运行。
Spring Cloud 断路器提供了跨不同断路器实现的抽象。
支持的实现
- Netfix Hystrix
- Resilience4J
- Sentinel
- Spring Retry
现在我们的一个8080端口服务宕机了,我们@HystrixCommand(fallbackMethod = "error")注解来捕捉到这个事件。
代码实现一下
一、直接使用上篇的eureka client服务,加入hystrix依赖
<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.xing</groupId><artifactId>StudyCloud</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>StudyCloud-eureka-client</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><!--web组件--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--eurekaclient组件--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
二、启动类中加@EnableCircuitBreaker注解启动熔断器
packagecom.xing.study.cloud.eureka; importcom.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; importorg.springframework.boot.SpringApplication; importorg.springframework.boot.autoconfigure.SpringBootApplication; importorg.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; importorg.springframework.cloud.netflix.eureka.EnableEurekaClient; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.RestController; importorg.springframework.web.client.RestTemplate; /*** @author rt*/publicclassApplication { "/") (publicStringhome() { return"Hello World"; } fallbackMethod="error") ("/hystrix") (publicStringhystrix() { returnnewRestTemplate().getForObject("http://127.0.0.1:8080/",String.class); } /*** 回调方法* @return str*/publicStringerror(){ return"/hystrix调用8080端口地址失败拉,回调error方法"; } publicstaticvoidmain(String[] args) { SpringApplication.run(Application.class, args); } }
配置文件还是保持上篇的
spring.application.name=eureka-client1server.port=8882eureka.instance.instance-id=eureka-client1eureka.client.service-url.defaultZone=http://172.23.13.15:8881/eureka/eureka.client.register-with-eureka=trueeureka.client.fetch-registry=true
三、启动服务(记得要启动Eureka Server项目)
访问发布的接口:http://127.0.0.1:8882/hystrix
可以看到在一定时间后,跳到了error()方法,我们就可以在error方法中进行回退、降级、缓存结果啥的,有兴趣可以继续往深学学。
目前hystrix已经停止更新了,以后使用的话再好好学习。
CircuitBreakerFactory.create API将创建一个名为CircuitBreaker的类的实例 。
该run方法需要Supplier和aFunction。
Supplier是您要包装在断路器中的代码。
Function是如果断路器跳闸将执行的回调方法。
将传递Throwable导致触发回退的函数。
如果不想提供回退,可以选择排除回退。
END