首页 > 其他分享 >在Spring Cloud中使用Hystrix服务完成熔断降级处理

在Spring Cloud中使用Hystrix服务完成熔断降级处理

时间:2023-12-28 11:32:50浏览次数:32  
标签:降级 Hystrix Spring 熔断 超时 方法 Cloud


举例上次发布博文隔了好几天了,今天我们重点围绕Spring Cloud的Hystrix服务的熔断降级处理进行,在之前篇的文章中,我们完成了Spring Cloud的各个微服务模块的搭建,这个是既往的事实,如果你还不知道该如何搭建Spring Cloud微服务,请参照我之前发的文章,Spring Cloud系列文章就行。


正式开始文章之前,请先了解一下,熔断降级服务到底是什么?

熔断降级服务是一种在分布式系统中处理故障和异常情况的重要机制。它可以帮助我们解决以下需求:

  • 防止级联故障:在分布式系统中,一个服务的故障可能会导致其他依赖该服务的服务也出现故障,从而形成级联故障。通过熔断机制,当某个服务发生故障时,可以快速地停止对该服务的请求,避免级联故障的发生。
  • 提高系统的可用性:通过熔断机制,可以在服务不可用或响应时间过长时,快速地切换到备用的降级逻辑,返回预先定义的默认结果,从而保证系统的可用性。这对于对实时性要求不高的服务来说尤为重要。
  • 优化系统资源利用:当服务发生故障或超时时,熔断机制可以避免不必要的资源消耗,例如数据库连接、线程池等。通过快速失败和返回降级结果,可以释放资源并提高系统的整体性能
  • 提供故障监控和告警:熔断降级服务通常会记录和统计服务的故障情况,例如错误率、响应时间等指标。这些指标可以用于监控系统的健康状况,并触发告警机制,及时通知开发人员或运维人员进行故障排查和处理。

在Spring Cloud系列的搭建Spring Cloud熔断降级服务中我们的案例完成了在请求错误的时候,我们返回了一个备用的电影名称给前台,那么这篇我们来完善一个在超时时间未得到响应的时候,我们的Hystrix会调用相关方法进行降级处理,并且返回我们的降级结果。


题外话


为方便你漏了太多模块,本文给出Spring Cloud的系列的源码,请参照博主博文进行评鉴:https://gitee.com/laohei520/spring-cloud-learn.git 如果您觉得有用的话,请一定要点个关注或者星星。给予博主更好的支持,白嫖并不能鼓励博主持续更新。

在Spring Cloud中使用Hystrix服务完成熔断降级处理_hystrix


本篇主要围绕这个模块进行。

其中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异常。在捕获到超时异常后,我们可以执行相应的超时处理逻辑。

另外,我们还捕获了InterruptedExceptionExecutionException异常,用于处理其他可能发生的异常情况。

测试:

如果你使用的是博主提供的代码,那么你就可以先运行Eureka 服务,如果你并且直接使用博主提供代码,那么请先启动你配置的Eureka模块,如果没配置,其实也可以启动,得看你自行选择了。之后再启动Hystrix服务模块

前端网页访问地址: http://localhost:2383/miaow

由于存在模拟超时并且时间为5秒,故而我们的结果必然是Fallback result,如果我们设置时间为小于3秒,那么我们的结果返回就又不一样了。

在Spring Cloud中使用Hystrix服务完成熔断降级处理_spring cloud_02

Spring Cloud的Hystrix熔断降级底层原理

Spring Cloud的Hystrix熔断降级是基于Netflix的Hystrix库实现的。

线程池隔离Hystrix会为每个被@HystrixCommand注解修饰的方法创建一个独立的线程池,用于执行该方法的逻辑。这样可以实现方法级别的隔离,避免因一个方法的执行问题影响到其他方法。

超时机制:Hystrix会为每个方法设置一个超时时间,如果方法的执行时间超过了设定的超时时间,Hystrix会将该方法的执行线程中断,并执行降级逻辑。

熔断器:Hystrix会根据一定的条件来判断是否打开熔断器。当熔断器打开时,所有对该方法的请求都会被快速失败,而不会执行实际的方法逻辑。这样可以避免因连续的请求失败导致系统资源耗尽。

降级逻辑:当方法的执行时间超过超时时间或熔断器打开时,Hystrix会执行预先定义的降级逻辑,返回一个默认的结果或执行备用的逻辑。降级逻辑可以是一个预先定义的方法,也可以是一个回退方法。

监控和指标收集:Hystrix会收集每个方法的执行情况、熔断器的状态、降级逻辑的执行次数等指标,并提供可视化的监控面板,方便开发人员进行监控和调优。


标签:降级,Hystrix,Spring,熔断,超时,方法,Cloud
From: https://blog.51cto.com/miaow/9012008

相关文章

  • SpringBoot 整合 ShardingSphere JDBC、MySQL分表实例
    1.概述ShardingSphere分为ShardingSphere-JDBC、ShardingSphere-Proxy、ShardingSphere-Sidecar(TODO)。ShardingSphere官方手册:传送门;这里使用的是ShardingSphere-JDBC,ShardingSphere-JDBC为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar......
  • Spring IoC(控制反转)、DI(依赖注入)
    1.IoCIoC(InversionofControl,控制反转)面向对象的一种设计思想,很多语言的框架都使用了IoC这个设计思想,并非特属于Spring,其实现为将实例对象交给第三方容器管理,创建实例对象的时候,注入这些实例对象所依赖的实例对象,而不是在内部创建。所谓的内部创建如下所示,连接数据库的DateSour......
  • Spring之RestTemplate使用小结
    Spring之RestTemplate使用小结1.基本接口捞出源码,看一下其给出的一些常用接口,基本上可以分为下面几种//get请求public<T>TgetForObject();public<T>ResponseEntity<T>getForEntity();//head请求publicHttpHeadersheadForHeaders();//post请求publicURI......
  • 【Spring】SpringMVC项目升级成SpringBoot实践
    将SpringMVC项目升级为SpringBoot项目需要一系列详细的步骤。以下是一个更详细的步骤指南:项目初始化:创建一个新的SpringBoot项目。您可以使用SpringInitializr或SpringBoot的Maven插件来快速生成项目结构。依赖管理:在新项目中,添加所需的依赖。根据您的项目需求,添加SpringBoot......
  • VS Code 设置 Spring Boot2.x 项目启动参数与 VM 参数
    参考https://blog.csdn.net/Jawfneo/article/details/101677042环境环境版本说明windows10vscode1.85.1SpringBootExtensionPackv0.2.1vscode插件ExtensionPackforJavav0.25.15vscode插件JDK11Springboot2.3.12.RELEASEApach......
  • spring原理(一)
    定义bean类的属性值类publicclassPropertyValue{privatefinalStringname;privatefinalObjectvalue;publicPropertyValue(Stringname,Objectvalue){this.name=name;this.value=value;}publicStringgetName()......
  • springboot 共享session
    在SpringBoot中,可以使用SpringSession来实现共享session。SpringSession是一个基于Spring的会话管理框架,它提供了跨多个服务器的会话共享功能。要使用SpringSession实现共享session,需要按照以下步骤进行配置:添加依赖在SpringBoot项目的pom.xml文件中添加SpringSession的依赖:x......
  • Spring Boot2.x 集成 Skywalking 9.1.0
    参考https://skywalking.apache.org/https://www.cnblogs.com/xiaqiuchu/p/17931230.html(本文使用的该文章的代码,进入可下载源码)https://juejin.cn/post/7001849172278116389#heading-7注意事项本文代码环境为单注册中心、单服务提供者、单消费者。管理面板左侧菜单在没......
  • Spring MVC (文件上传下载)
     1.介绍1)三层架构:表现层(UI):负责数据展示;业务层(BLL):负责业务处理;数据层(DAL):负责数据操作; 2)MVCSpringMVC(Model-View-Controller)是Spring的一部分,基于Java的Web框架,用于开发Web应用框架。提供一种模型(Model)-视图(Vie......
  • Spring Boot2.x 集成 Eureka 与 Feign
    参考https://blog.csdn.net/m0_37959155/article/details/122521406https://blog.csdn.net/Shnywe/article/details/123682758https://www.cnblogs.com/yxth/p/10845640.htmlhttps://juejin.cn/post/6973680096011878407本文完整代码下载注意事项Feign集成了Hystrix......