首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【愚公系列】2023年11月 Java教学课程 191-SpringCloud(Hystrix服务熔断)

【愚公系列】2023年11月 Java教学课程 191-SpringCloud(Hystrix服务熔断)

作者头像
愚公搬代码
发布2025-06-02 14:43:43
发布2025-06-02 14:43:43
1880
举报
文章被收录于专栏:历史专栏历史专栏

🚀前言

微服务中的熔断器是一种模式,旨在提高应用程序的可靠性和可用性。它是一种机制,用于监视应用程序的运行状况,识别异常情况并在必要时自动断开对不可用服务的访问,以保护整个系统免受失败服务的影响。

熔断器通过设置一个阈值来实现自动断开服务,当服务的错误率超过这个阈值时,熔断器将打开,并快速断开对这个服务的访问,以避免问题蔓延到整个系统。在断开服务的同时,熔断器会向系统发送警报,以通知管理员采取必要的措施。

熔断器在微服务中的作用非常重要,它可以保证应用程序的可用性,在面对故障和异常情况时,保护系统免受影响。因此,熔断器常被认为是微服务系统设计中的核心部分。

🚀一、Hystrix服务熔断

微服务的服务熔断是一种保护机制,用于避免整个服务系统因为某一个服务的故障而崩溃。当某个服务出现故障时,熔断器会自动切断对该服务的访问,并将请求转发到备用的服务或者返回错误信息。这样可以保证整个系统的可用性和稳定性,同时也能够减少故障对其他服务的影响。通过熔断机制,可以快速识别和响应故障,并能够实现自动恢复。这样可以提高整个系统的可靠性和可维护性。

🔎1.Hystrix服务熔断有三种状态

Hystrix服务熔断有三种状态:

  1. 关闭状态(Closed):Hystrix的默认状态,表示所有请求都可以正常通过。
  2. 开启状态(Open):表示当前系统压力过大,服务已经熔断,不再接受请求,直接返回服务降级的结果。
  3. 半开状态(Half-Open):表示服务已经恢复,但是仅允许有限数量的请求通过,以免因过多的请求导致服务再次熔断。在这种状态下,如果请求成功,则表示服务已经恢复正常,否则重新回到开启状态。

🔎2.断路器三个重要参数

断路器通常有三个重要参数:

  1. 快照时间窗:这是一个时间段,用于收集请求的统计信息,例如请求总数、错误数、响应时间等。当断路器在这个时间窗内达到请求总数阈值时,会基于错误百分比阈值来判断是否熔断。
  2. 请求总数阈值:当断路器在快照时间窗内收到的请求总数达到该阈值时,会检查错误百分比是否超过设定的阈值。如果超过,则熔断断路器。
  3. 错误百分比阈值:当断路器在快照时间窗内收到的请求错误数占总请求数的百分比超过该阈值时,断路器会被熔断。这是因为错误百分比过高可能意味着服务出现了故障或异常,无法提供可靠的响应。

这些参数的设置应该考虑服务的性能和可靠性需求,以及对故障的容错能力等方面。

🔎3.Hystrix服务熔断配置

hystrix-provider服务端模块

🦋3.1 引入Hystrix依赖
代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud-demo</artifactId>
        <groupId>cn.itcast.demo</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>hystrix-provider</artifactId>
    <dependencies>

        <!--spring boot web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>


        <!-- eureka-client -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!-- hystrix -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
    </dependencies>
</project>
🦋3.2 application.yml配置
代码语言:javascript
复制
server:
  port: 8001

eureka:
  instance:
    hostname: localhost # 主机名
    prefer-ip-address: true # 将当前实例的ip注册到eureka server 中。默认是false 注册主机名
    ip-address: 127.0.0.1 # 设置当前实例的ip
    instance-id: ${eureka.instance.ip-address}:${spring.application.name}:${server.port} # 设置web控制台显示的 实例id
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
spring:
  application:
    name: hystrix-provider # 设置当前应用的名称。将来会在eureka中Application显示。将来需要使用该名称来获取路径
🦋3.3 启动类添加激活注解

使用@EnableCircuitBreaker启动注解:

代码语言:javascript
复制
package com.itheima.provider;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * 启动类
 */

@EnableEurekaClient //该注解 在新版本中可以省略
@SpringBootApplication
@EnableCircuitBreaker // 开启Hystrix功能
public class ProviderApp {


    public static void main(String[] args) {
        SpringApplication.run(ProviderApp.class,args);
    }
}

有的环境会提示@EnableCircuitBreaker is deprecated已弃用,用@EnableHystrix注解代替即可。

🦋3.4 使用

使用@HystrixCommand(fallbackMethod ="findOne_fallback")启动降级:

代码语言:javascript
复制
@HystrixCommand(fallbackMethod = "circuitFallback", commandProperties = {
        @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),//是否开启断路器
        @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),// 请求次数
        @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"),// 时间窗口期
        @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60")// 失败率达到多少后跳
})
@GetMapping(value = "/hystrix/circuit/{id}")
public String paymentCircuit(@PathVariable("id") Integer id) {
    if (id < 0) {
        throw new RuntimeException("id不能为负数");
    }
    String serial = IdUtil.simpleUUID();
    return "调用成功,线程池:" + Thread.currentThread().getName() + "访问paymentInfoTimeOut,serial=" + serial;
}

public String circuitFallback(Integer id) {
    return "测试断路器,线程池:" + Thread.currentThread().getName() + "访问paymentInfoTimeOut,id=" + id;

}

意思就是在10s的窗口期内,发送十次请求,假如说有60%也就是6次都失败了,就激活断路器。 在controller中写出响应的调用,然后进行访问,如果十次中有六次及以上是负数,会发现,第11次时就算是正数仍然会进入fallback方法,因为此时进行了服务熔断。

而当他断路器激活以后,所有的请求都无法处理了,而过一段时间之后,断路器又会尝试着让少量的请求通过一下(也就是断路器进入了half-open状态),而如果请求仍然失败,断路器又会重新回到open状态,如果请求成功,断路器则会关闭。也就是链路恢复。


🚀感谢:给读者的一封信

亲爱的读者,

我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。

如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。

我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🚀前言
  • 🚀一、Hystrix服务熔断
    • 🔎1.Hystrix服务熔断有三种状态
    • 🔎2.断路器三个重要参数
    • 🔎3.Hystrix服务熔断配置
      • 🦋3.1 引入Hystrix依赖
      • 🦋3.2 application.yml配置
      • 🦋3.3 启动类添加激活注解
      • 🦋3.4 使用
  • 🚀感谢:给读者的一封信
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档