举例上次发布博文隔了好几天了,今天我们重点围绕Spring Cloud的Hystrix服务的熔断降级处理进行,在之前篇的文章中,我们完成了Spring Cloud的各个微服务模块的搭建,这个是既往的事实,如果你还不知道该如何搭建Spring Cloud微服务,请参照我之前发的文章,Spring Cloud系列文章就行。
正式开始文章之前,请先了解一下,熔断降级服务到底是什么?
熔断降级服务是一种在分布式系统中处理故障和异常情况的重要机制。它可以帮助我们解决以下需求:
- 防止级联故障:在分布式系统中,一个服务的故障可能会导致其他依赖该服务的服务也出现故障,从而形成级联故障。通过熔断机制,当某个服务发生故障时,可以快速地停止对该服务的请求,避免级联故障的发生。
- 提高系统的可用性:通过熔断机制,可以
在服务不可用或响应时间过长时,快速地切换到备用的降级逻辑
,返回预先定义的默认结果,从而保证系统的可用性。这对于对实时性要求不高的服务来说尤为重要。 - 优化系统资源利用:当
服务发生故障或超时时,熔断机制可以避免不必要的资源消耗
,例如数据库连接、线程池等。通过快速失败和返回降级结果,可以释放资源并提高系统的整体性能
。 - 提供故障监控和告警:熔断降级服务通常会
记录和统计
服务的故障情况,例如错误率、响应时间等指标。这些指标可以用于监控系统的健康状况,并触发告警机制,及时通知开发人员或运维人员进行故障排查和处理。
在Spring Cloud系列的搭建Spring Cloud熔断降级服务中我们的案例完成了在请求错误的时候,我们返回了一个备用的电影名称给前台,那么这篇我们来完善一个在超时时间未得到响应的时候,我们的Hystrix会调用相关方法进行降级处理,并且返回我们的降级结果。
题外话
为方便你漏了太多模块,本文给出Spring Cloud的系列的源码,请参照博主博文进行评鉴:https://gitee.com/laohei520/spring-cloud-learn.git 如果您觉得有用的话,请一定要点个关注或者星星。给予博主更好的支持,白嫖并不能鼓励博主持续更新。
本篇主要围绕这个模块进行。
其中miaow开头的是本篇文章重点关注的。
Service层代码
@Service
public class MiaowService {
@HystrixCommand(commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")}, fallbackMethod = "fallbackMethod")
public String yourMethod() throws InterruptedException {
// 实现你的业务逻辑
//我在这里休眠5秒,代表服务超时了。
Thread.sleep(5000);
// 如果发生异常或者超时,Hystrix将会调用fallbackMethod方法进行降级处理
return "Your result";
}
public String fallbackMethod() {
// 降级处理逻辑
return "Fallback result";
}
}
ok,模拟实现了一个Service层,并在本文中设置了一个如果超时时间超过3秒后,我们就执行fallbackMethod
方法,为了本案例简单,或者说减少代码量,我这里就直接使用线程池的休眠方法,在youMethod
中休眠了5秒,达到上边执行异常的条件,如果那个注解内容看不懂,我们使用@HystrixCommand注解来标记yourMethod方法,并通过commandProperties属性设置了超时时间为3秒。
就这样了,其中fallbackMethod后边指定的事我们在执行出现问题时候,指定的我们想要展示的错误的方法,也就我们的熔断降级处理的方法。
Controller 代码
到这一步其实我们已经就成功一半了,接下来我们就需要使用一个测试的方法,来测试我们是否达到了熔断降级的方法,具体代码如下:
@RestController
public class MiaowController {
@Autowired
private MiaowService miaowService;
private final ExecutorService executorService = Executors.newFixedThreadPool(10);
@GetMapping("/miaow")
public String miaow(){
Future<String> future = executorService.submit(() -> miaowService.yourMethod());
try {
return future.get(3, TimeUnit.SECONDS);
} catch (TimeoutException e) {
// 超时处理逻辑
return miaowService.fallbackMethod();
} catch (InterruptedException | ExecutionException e) {
// 异常处理逻辑
return "请求发生异常,请稍后重试";
}
}
}
在上述代码中,我们使用ExecutorService
创建一个线程池,并将MiaowService
的方法调用放在一个Callable
对象中提交给线程池执行。然后,我们使用Future对象来获取方法执行的结果。
通过future.get(3, TimeUnit.SECONDS)
方法,我们设置了一个3秒的超时时间,如果在超时时间内未得到结果,将抛出TimeoutException
异常。在捕获到超时异常后,我们可以执行相应的超时处理逻辑。
另外,我们还捕获了InterruptedException
和ExecutionException
异常,用于处理其他可能发生的异常情况。
测试:
如果你使用的是博主提供的代码,那么你就可以先运行Eureka 服务,如果你并且直接使用博主提供代码,那么请先启动你配置的Eureka模块,如果没配置,其实也可以启动,得看你自行选择了。之后再启动Hystrix服务模块
前端网页访问地址: http://localhost:2383/miaow
由于存在模拟超时并且时间为5秒,故而我们的结果必然是Fallback result,如果我们设置时间为小于3秒,那么我们的结果返回就又不一样了。
Spring Cloud的Hystrix熔断降级底层原理
Spring Cloud的Hystrix熔断降级是基于Netflix的Hystrix库实现的。
线程池隔离:Hystrix会为每个被@HystrixCommand
注解修饰的方法创建一个独立的线程池,用于执行该方法的逻辑。这样可以实现方法级别的隔离,避免因一个方法的执行问题影响到其他方法。
超时机制:Hystrix会为每个方法设置一个超时时间,如果方法的执行时间超过了设定的超时时间,Hystrix会将该方法的执行线程中断,并执行降级逻辑。
熔断器:Hystrix会根据一定的条件来判断是否打开熔断器。当熔断器打开时,所有对该方法的请求都会被快速失败,而不会执行实际的方法逻辑。这样可以避免因连续的请求失败导致系统资源耗尽。
降级逻辑:当方法的执行时间超过超时时间或熔断器打开时,Hystrix会执行预先定义的降级逻辑,返回一个默认的结果或执行备用的逻辑。降级逻辑可以是一个预先定义的方法,也可以是一个回退方法。
监控和指标收集:Hystrix会收集每个方法的执行情况、熔断器的状态、降级逻辑的执行次数等指标,并提供可视化的监控面板,方便开发人员进行监控和调优。