简介
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性;
"断路器"本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的,可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间,不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
特性:1.1 服务熔断
熔断机制是应对雪崩效应的一种微服务链路保护机制;当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回"错误"的响应信息;当检测到该节点微服务调用正常后恢复调用链路;
1.2 服务降级
服务降级:整体资源快不够了,忍痛将某些服务先关掉,待渡过难关,再开启回来;
服务降级处理是在客户端实现完成的,与服务端没有关系;当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的fallback回调,返回一个缺省值;
入门代码实现
创建一个springboot项目:hystrix-demo 搭建eureka参考搭建eureka
配置文件 application.yml
server:
port: 8082
spring:
application:
name: hystrix-demo
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
# feign使用hystrix进行回退
feign:
hystrix:
enabled: true
# 端点管理 hystrixDashboard
management:
endpoints:
web:
exposure:
include: "*"
pom依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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.gj</groupId>
<artifactId>cloud-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>hystrix</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hystrix</name>
<description>Hystrix介绍</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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>
<dependency>
<groupId>cn.gjing</groupId>
<artifactId>tools-httpclient</artifactId>
<version>1.0.2</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
启动类添加注解
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
@EnableFeignClients
@EnableHystrixDashboard
编写service类
127.0.0.1:8090/test地址为demo应用地址 demo搭建参考:demo搭建
@Service
public class TestService {
@HystrixCommand(fallbackMethod = "defaultFallback")
String hello() {
HttpClient httpClient = new HttpClient();
return httpClient.get("http://127.0.0.1:8090/test", String.class);
}
public String defaultFallback() {
return "no hello";
}
}
编写controller
@RestController
public class TestController {
@Resource
private TestService testService;
@PostMapping("/test")
public String test() {
return testService.hello();
}
}
启动 应用
启动eureka,demo,hystrix应用,访问http://localhost:8082/hystrix:
测试结果:http://localhost:8082/test
用post方法测试,浏览器支持get方法,测试demo应用启动和不启动返回结果