持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情
作者平台:
| CSDN:blog.csdn.net/qq_41153943…
| 知乎:www.zhihu.com/people/1024…
| GitHub:github.com/JiangXia-10…
| 微信公众号:1024笔记
本文一共1822字,预计阅读9分钟
前言
我们知道在微服务的项目中,Spring Cloud进行接口调用时,一般时需要使用Feign进行接口调用,如果接口之间的调用触发了某个条件,比如某个接口在10秒内产生超过20次请求,并且如果请求的错误百分比大于阈值(比如50%),这时候需要开启一种保护机制,从而保证整个系统的一个可用性。这种机制就是熔断机制,一般使用熔断机制的组件是Hystrix组件。
服务雪崩
如果在微服务项目中某一个接口调用出现问题,很有可能会造成服务雪崩。
雪崩是一种自然现象,指的是当山上的积雪内部的内聚力抗拒不了它所受到的重力拉引时,某一个很小的雪块便向下滑动,并且雪块越滚越大,从而引起大量雪体崩塌的现象。
那么服务的雪崩就可以理解成某一个接口调用出现的问题,直接引起与其相关联的所有接口出现调用问题,从而导致整个微服务系统出现崩溃,这种可以称之为服务雪崩,也叫做级联故障(cascading failures)。
比如在某个微服务的系统中正常情况下,微服务A B C D 之间互相的调用都是正常的(D调C,C调B,B调A)。但是随着时间推移,微服务A突然在某一个时间点挂了,但是此时的微服务B还在不断地调用微服务A,但是由于服务A已经挂了,所以B调用A必须等待服务调用超时。我们知道每次服务调用时,调用方都会去创建线程(而线程是计算机的资源,比如cpu、内存等资源)。所以在高并发的场景下,服务B所在的机器就会去创建线程,并且上述的情况下会阻塞大量的线程,但是由于计算机资源是有限的,所以最后服务B的服务器就会宕机。同理可得,也会导致后面服务C、服务D也出现这种情况,造成服务雪崩的情况。
什么是Hystrix
Hystrix是一个应用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整个体系服务失败,避免服务雪崩,从而提高整个分布式系统的弹性。
比如系统中有很多服务,当某些服务不稳定的时候,使用这些服务的用户线程将会阻塞,如果没有隔离机制,系统随时就有可能会挂掉,从而带来很大的风险。SpringCloud使用Hystrix组件提供断路器、资源隔离与自我修复功能。
Hystrix的使用
在一个spring cloud的微服务的项目中使用Hystrix其实很简单,和其他组件的使用一样,首先只需要引入Hystrix相关的依赖:
<!-- ribbon组件 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<!--hystrix依赖,主要是用 @HystrixCommand -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<!--nacos进行服务注册与发现-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--服务调用Openfeign组件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
然后需要在application.properties配置文件中添加hystrix相关的配置,开启熔断机制:
feign.hystrix.enabled=true
设置hystrix超时时间,默认1000ms,这里设置6000ms:
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=6000
首先需要修改openfeignclient接口,这里主要修改@FeignClient注解的内容,增加fallback属性,设置其值为OrderDegradeFeignClient.class:
@FeignClient(name = "service-order", fallback = OrderDegradeFeignClient .class)
@Component
public interface OrderClient {
@DeleteMapping(value = "order/{orderId}")
public Result removeOrder(@PathVariable("orderId") String orderId);
@DeleteMapping(value = "order/delete-batch")
public Result removeOrderList(@RequestParam("orderIdList") List orderIdList);
}
fallback属性配置回调处理类,该处理类是作为 Feign 熔断器的逻辑处理类。然后在调用方的client的包中(和OrderClient 接口同一层的那个包下)创建一个熔断器的实现类:
@Component
public class OrderDegradeFeignClient implements OrderClient {
@Override
public Result removeOrder(String orderId) {
return Result .error().message("请求超时");
}
@Override
public Result removeOrderList(List orderIdList) {
return Result .error().message("请求超时");
}
}
如果需要查看Hystrix实例执行情况可以使用Hystrix Dashboard,在依赖中引入:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
在启动类上添加@EnableHystrixDashboard注解启动仪表盘功能。
总结
本文主要介绍了什么是hystrix熔断器以及其在springcloud项目中的简单使用。hystrix熔断器主要是指在一定的时间窗口内,当请求的次数达到一定的失败比率后,hystrix就会主动拒绝服务,采取将请求直接降级等方式,从而有效的缓解了服务雪崩的问题,通过快速错误的方式,有效的控制服务之间链路调用的响应时间,保证整个微服务的健康。