Hystrix
Hystrix是一个用于分布式系统的延迟和容错的开源库。在分布式系统里,许多依赖不可避免的调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整个服务失败,避免级联故障,以提高分布式系统的弹性。
“断路器”本身是一种开关装置,当某个服务单元发生故障监控(类似熔断保险丝),向调用方法返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方法无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延。乃至雪崩。
何为服务雪崩
多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C有调用其他的微服务,这就是所谓的”扇出”,如扇出的链路上某个微服务的调用响应式过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统雪崩,所谓的”雪崩效应”。
一:服务熔断
注解: @HystrixCommand(fallbackMethod = "") //调用失败回调方法
@EnableCircuitBreaker //添加熔断支持
pom文件
<!--Hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
启动类
@SpringBootApplication
@EnableEurekaClient //在服务启动后自动注册到Eureka中
@EnableDiscoveryClient //服务发现
@EnableCircuitBreaker //添加熔断支持
public class HystrixDeptProvider_8001 {
public static void main(String[] args) {
SpringApplication.run(HystrixDeptProvider_8001.class,args);
}
}
@RestController
public class DeptController {
@Autowired
private DeptService deptService;
@GetMapping("dept/get/{id}")
@HystrixCommand(fallbackMethod = "hystrixGet") //调用失败回调方法
public Dept get(@PathVariable("id") Long id) {
Dept dept = deptService.queryById(id);
if (dept == null) {
throw new RuntimeException("id>=" + id + "用户不存在");
} return dept;
}
public Dept hystrixGet(@PathVariable("id") Long id) {
return new Dept().setDeptno(id).setDname("id>=" + id + "用户不存在" + "hystrixGet");
}}
二:服务降级
客户端application.yml
server:
port: 80
#Eureka配置
eureka:
client:
register-with-eureka: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
#开启降级feign.hystrix
feign:
hystrix:
enabled: true
interface DeptClientService
@Component
@FeignClient(value = "SPRINGCLOUD-PRIOVIDER-DEPT",fallbackFactory =
DeptClientServiceFactory.class) //fallbackFactory
public interface DeptClientService {
@PostMapping("/dept/add")
public boolean addDept(Dept dept);
@GetMapping("/dept/get/{id}")
public Dept queryById(@PathVariable("id")Long id);
@GetMapping("/dept/all")
public List<Dept> queryAll();
}
FallbackFactory
@Component
public class DeptClientServiceFactory implements FallbackFactory {
@Override
public Object create(Throwable throwable) {
return new DeptClientService() {
@Override
public boolean addDept(Dept dept) {
return false;
}
@Override
public Dept queryById(Long id) {
return new Dept().setDeptno(id).setDname("id>=" + id +
"没有对应信息,客户端提供降级的信息,这个服务已经被关闭").setDb_source(
"没有信息");
}
@Override
public List<Dept> queryAll() {
return null;
}
};
}
}
服务熔断: 服务器端,某个服务超时或者异常,引起熔断;
服务降级: 客户端 从整体网站请求负载考虑,当某个服务熔断或者关闭后,服务将不再被调用,此时准备FallbackFactory 返回默认值,保证客户端有些功能还能用;缺点服务体验下降;