一、Hystrix服务熔断
概述
读音:黑丝踹ks
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统中,许多依赖不可避免的会调用失败,超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,提高分布式系统的弹性
熔断机制是应对雪崩效应的一种微服务链路保户机制,当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的相应信息。当检测当该节点微服务调用响应正常后恢复调用链路,熔断机制的注解是@HystrixCommand
“熔断器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控,,某个异常条件被触发,直接熔断整个服务。,向调用方法返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出吊牌用方法无法处理的异常,就保证了服务调用方的线程不会被长时间占用,避免故障在分布式系统中蔓延,乃至雪崩
使用步骤
(1)导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.2.3.RELEASE</version>
</dependency>
(2)在调用方法@HystrixCommand注解
当查询数据库时,User是存在的,则正常返回,当不存在时User为null,我自定义了一个异常
此时该方法出现异常,就会通过 @HystrixCommand(fallbackMethod =“hystrix_GET” ),找到下面的备选响应
//正常的功能方法
@GetMapping("/product/findone/{id}")
@HystrixCommand(fallbackMethod ="hystrix_GET" ) //去找备选响应,进行服务降级
public User findById(@PathVariable("id") Integer id) {
User user = userService.findById(id);
if (null == user){
throw new RuntimeException("该"+id+"没有对应信息");
}
return user;
}
//备选响应,服务降级
public User hystrix_GET(@PathVariable("id") Integer id){
return new User(id,"该ID:"+id+"没有对应的数据","Hystrix服务降级");
}
(3)启动类上加@EnableCircuitBreaker注解,开启服务熔断机制
(4)运行结果
可以设置当服务被调用多少次失败后,开启熔断。
二、Hystrix服务降级
概述
服务降级处理是在客户端实现完成的,与服务端没有关系
整体资源快不够了,忍痛将某些服务端先关掉,但是关闭后还要返回一些信息,此时可以在客户端进行服务降级。
使用步骤
(1)在客户端创建降级服务类,继承FallbackFactory接口,FallbackFactory接口的泛型为要调用的那个类
@Component
public class UserClientService implements FallbackFactory<UserService> { //Feign调用的接口
@Override
public UserService create(Throwable throwable) {
//构建匿名
return new UserService() {
@Override
public User findById(Integer id) {
return new User(id,"该ID:"+id+"没有对应的数据","Hystrix此服务以关闭");
}
@Override
public List<User> findAll() {
return null;
}
};
}
}
(2)配置服务降级回调
// 当资源不够时,会关闭调用远程UserService,转而调用回调类中的回调函数
@FeignClient(value = "UserService ",fallbackFactory = UserClientService.class) //指明服务关闭后,会返回方法的类的字节码
public interface UserService {
@GetMapping("/product/findone/{id}")
public User findById(@PathVariable("id") Integer id);
@GetMapping("/product/list")
public List<User> findAll();
}
(3)配置配置文件
feign: #开启服务熔断服务降级
hystrix:
enabled: true
(4)当我们将关闭UserService 服务时,客户端就会调UserClientService类中的对于方法
三、总结
分布式项目中,有数十个依赖关系,每个依赖关系在某些时候不可避免地失败。
服务雪崩:当A调用微服务B,B调C,和其他微服务,这是扇出,当扇出链路上某个微服务调用响应时间过长或者不可用,对微服务的A的调用就会占用越来越多的系统资源,导致系统崩溃,所谓的雪崩效应
服务熔断:一般是某个服务异常引起的,相当于“保险丝”,当某个异常条件被触发,直接熔断整个服务,不是等到此服务超时
服务降级:降级一般是从整体负荷考虑,当某个服务熔断之后,服务器将不再被调用,客户端可自己准备一个本地的fallback回调,返回一个缺省值,虽然服务水平下降,当能用,比直接挂掉要强
springcloud是spring,采用AOP的思想,异常处理信息,我们某个服务的功能是每个方法,我们还可以使用AOP直接在api层通过接口设置服务降级
四、Hystrix的Dashboard流监控
创建一个新的模块,该模块可以通过图形化界面观测流量
(1)添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
(2)添加配置文件
server:
port: 9001
management:
endpoints:
web:
exposure:
include: "*"
hystrix:
dashboard:
proxy-stream-allow-list: "*"
(3)最后在启动类上加上@EnableHystrixDashboard,此时可以访问http://localhost:port/hystrix查看监控主页