一起来学SpringCloud之整合hystrix服务熔断和降级

简介: 一起来学SpringCloud之整合hystrix服务熔断和降级

微信截图_20230209163713.png


前言

大家好,一直以来我都本着用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 基础知识 的铺垫。目前正在出一个SpringCloud长期系列教程,从入门到进阶, 篇幅会较多~


适合人群

  • 有一定的Java基础
  • 想尝试微服务开发
  • 有SpringBoot开发基础
  • 想学习或了解SpringCloud
  • 想提高自己的同学

大佬可以绕过 ~


背景

如果你是一路看过来的,很高兴你能够耐心看完。之前带大家学了Springboot这门框架,熟练掌握了单体应用的开发,如今微服务开发盛行,对我们的技术要求也是越来越高,薪资也是令人兴奋。这个系列将会带大家学习SpringCloud微服务开发,我会带大家一步一步的入门,耐心看完你一定会有收获~


情景回顾

上期带大家一起认识了如何基于rest的服务远程调用以及带大家学习了restTemplate的常见用法,本期带着上期遗留下来的问题学习hystrix,我们一起来看一下吧~


hystrix 是啥

我们上期结尾的时候提到过服务间调用会产生一些问题,试想一下,会有哪些问题。我们先抛开服务间调用, 拿正常的前端去请求服务端来讲, 有时候我们会发现有的接口会很慢导致接口超时, 如果服务端或者前端不去处理的话,会一直处于等待状态, 当大批量的请求过来时,发现服务就被堵在那了,最终导致服务不可用甚至挂掉。微服务之间调用同样的也会产生这种问题,甚至还会有雪崩效应,因为服务之间都是关联的,那么怎么解决呢?下面就是我要给大家介绍的SpringCloud的另一个核心组件 Hystrix

同样的,我们先认识一下它是啥?Hystrix可以让我们对服务间的调用进行控制,提供了容错机制。Hystrix  通过将依赖服务进行资源隔离,进而阻止某个依赖服务出现故障时在整个系统所有的依赖服务调用中进行蔓延;同时Hystrix还提供故障时的 fallback 降级机制, 它可以帮助我们提升服务的可用性和稳定性


环境搭建

首先我们新建一个项目模块方便测试, 大家自行创建, 紧接着修改pom.xml

<!--  hystrix-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
复制代码


  • HelloController
@RestController
@RequestMapping("/hello")
public class HelloController {
    @Autowired
    private UserService userService;
    /**
     * 服务容错测试
     * @return
     */
    @RequestMapping("/hello/user/hyx")
    @ResponseBody
    public User hello2() {
        return userService.hello("HystrixCommand");
    }
}
复制代码


  • User
@Data
public class User {
    private String username;
}
复制代码


  • UserService
@Service
public class UserService {
     public User hello(String name) {
        Map<String, Object> params = new HashMap<>();
        params.put("name", name);
        User u = restTemplate.getForObject("http://provider/hello/app/{name}", User.class, params);
        return u;
    }
}
复制代码

核心部分就是这个UserService,下面我们看下怎么去使用


常用方法

此外,我们还需要再开启producer服务(上期中已实现)


服务熔断配置

使用也很简单,只需要指定注解即可,下面给大家介绍常用的配置

@HystrixCommand(
    commandProperties= {
        @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "5000"),
            // 如果5秒内,请求达到了4个,错误率达到50%以上,就开启跳闸,
        @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "4"),
        @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"),
        // 如果3秒以后再调用,会再执行一次业务方法 // 就会直接走fallback,业务代码将不再会调用
        @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "3000"),
        // 信号隔离设置 - 在主线程执行
        //只需要设置execution.isolation.strategy = SEMAPHORE即可
        // 并设置并发数
        @HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE"),
        @HystrixProperty(name="execution.isolation.semaphore.maxConcurrentRequests", value="10")
    }
)
 public User hello(String name) {
    Map<String, Object> params = new HashMap<>();
    params.put("name", name);
    User u = restTemplate.getForObject("http://provider/hello/app/{name}", User.class, params);
    return u;
}
复制代码


服务降级配置

@HystrixCommand(
    // 设置回调 - 请求错误时回调
    // 还可以对降级的服务进行分组
    fallbackMethod = "getUserDefault", commandKey = "getUserById", groupKey = "userGroup", threadPoolKey = "getUserThread",
    commandProperties= {
        @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "5000"),
            // 如果5秒内,请求达到了4个,错误率达到50%以上,就开启跳闸,
        @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "4"),
        @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"),
        // 如果3秒以后再调用,会再执行一次业务方法 // 就会直接走fallback,业务代码将不再会调用
        @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "3000"),
        // 信号隔离设置 - 在主线程执行
        //只需要设置execution.isolation.strategy = SEMAPHORE即可
        // 并设置并发数
        @HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE"),
        @HystrixProperty(name="execution.isolation.semaphore.maxConcurrentRequests", value="10")
    }
)
 public User hello(String name) {
    Map<String, Object> params = new HashMap<>();
    params.put("name", name);
    User u = restTemplate.getForObject("http://provider/hello/app/{name}", User.class, params);
    return u;
}
 // 如果该方法抛出错误 就会降级到 getUserDefault1 , 也可以通过 ignoreExceptions 去忽略某些异常
    @HystrixCommand(fallbackMethod = "getUserDefault1", ignoreExceptions = {NullPointerException.class})
    public User getUserDefault(String name, Throwable e) {
        // 获取异常信息
        System.out.println(e.getMessage());
        // 测试服务降级 - 该方法会错误 回调 getUserDefault1
//        String a = null;
//        a.toString();
        User user = new User();
        user.setUsername("defaultUser");
        return user;
    }
    public User getUserDefault1(String name) {
        User user = new User();
        user.setUsername("defaultUser 1");
        return user;
    }
复制代码


结束语

本期到这里就结束了, 总结一下,本节主要讲了,服务之间如何进结合hystrix进行降级和熔断处理,其实yml中也可以做一些配置,这个留给大家自己实践了, 建议大家自己多去尝试 ~


下期预告

我们知道,微服务场景下,服务不可能就跑一个,需要结合应用场景来跑多个,那么如何去做负载均衡呢❓。 下期,给大家讲另外一个组件 ribbon, 关注我,不迷路, 下期不见不散 ~

相关文章
|
1月前
|
存储 数据可视化 Java
基于MicrometerTracing门面和Zipkin实现集成springcloud2023的服务追踪
Sleuth将会停止维护,Sleuth最新版本也只支持springboot2。作为替代可以使用MicrometerTracing在微服务中作为服务追踪的工具。
105 1
|
12天前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
44 3
|
2月前
|
消息中间件 存储 Java
SpringCloud基础9——服务异步通信-高级篇
消息可靠性、死信交换机、惰性队列、MQ集群
SpringCloud基础9——服务异步通信-高级篇
|
2月前
|
存储 NoSQL 调度
|
2月前
|
Java API 对象存储
微服务魔法启动!Spring Cloud与Netflix OSS联手,零基础也能创造服务奇迹!
这段内容介绍了如何使用Spring Cloud和Netflix OSS构建微服务架构。首先,基于Spring Boot创建项目并添加Spring Cloud依赖项。接着配置Eureka服务器实现服务发现,然后创建REST控制器作为API入口。为提高服务稳定性,利用Hystrix实现断路器模式。最后,在启动类中启用Eureka客户端功能。此外,还可集成其他Netflix OSS组件以增强系统功能。通过这些步骤,开发者可以更高效地构建稳定且可扩展的微服务系统。
58 1
|
2月前
|
SpringCloudAlibaba API 开发者
新版-SpringCloud+SpringCloud Alibaba
新版-SpringCloud+SpringCloud Alibaba
|
3月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
127 1
|
1月前
|
JSON SpringCloudAlibaba Java
Springcloud Alibaba + jdk17+nacos 项目实践
本文基于 `Springcloud Alibaba + JDK17 + Nacos2.x` 介绍了一个微服务项目的搭建过程,包括项目依赖、配置文件、开发实践中的新特性(如文本块、NPE增强、模式匹配)以及常见的问题和解决方案。通过本文,读者可以了解如何高效地搭建和开发微服务项目,并解决一些常见的开发难题。项目代码已上传至 Gitee,欢迎交流学习。
135 1
Springcloud Alibaba + jdk17+nacos 项目实践
|
1月前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
2月前
|
人工智能 前端开发 Java
Spring Cloud Alibaba AI,阿里AI这不得玩一下
🏀闪亮主角: 大家好,我是JavaDog程序狗。今天分享Spring Cloud Alibaba AI,基于Spring AI并提供阿里云通义大模型的Java AI应用。本狗用SpringBoot+uniapp+uview2对接Spring Cloud Alibaba AI,带你打造聊天小AI。 📘故事背景: 🎁获取源码: 关注公众号“JavaDog程序狗”,发送“alibaba-ai”即可获取源码。 🎯主要目标:
96 0