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

【愚公系列】2023年11月 Java教学课程 192-SpringCloud(Hystrix服务限流)

作者头像
愚公搬代码
发布2025-06-02 14:48:36
发布2025-06-02 14:48:36
9300
代码可运行
举报
文章被收录于专栏:历史专栏历史专栏
运行总次数:0
代码可运行

🚀前言

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

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

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

🚀一、Hystrix服务限流

微服务的服务限流是指在微服务架构中对服务进行流量控制的一种机制。服务限流可以避免服务的稳定性和可用性受到影响,同时也可以优化资源的利用效率。

服务限流可以通过以下方式实现:

  1. 基于时间窗口的限流:在一定时间内,限制服务的请求次数或并发数,例如每秒只允许处理100个请求。
  2. 基于资源利用率的限流:根据服务的资源利用率(例如 CPU 使用率、内存使用率),来限制服务的请求次数或并发数,避免资源竞争导致系统崩溃。
  3. 基于负载均衡的限流:通过对服务进行负载均衡,可以将流量均衡分配到不同的服务节点上,从而实现流量的分散和限流。

服务限流可以使用一些开源工具来实现,如 Netflix 的 Hystrix、Alibaba 的 Sentinel 等。这些工具提供了丰富的限流策略和监控功能,可以方便地实现服务限流。

🔎1.Hystrix服务限流二种模式

Hystrix提供了两种服务限流模式:

  1. 线程池隔离模式(Thread Pool Isolation):将服务调用封装在单独的线程池中,不同服务的执行互不影响,可以实现对每个服务的限流。
  2. 信号量隔离模式(Semaphore Isolation):使用信号量实现对服务的限流,将多个服务调用放在同一个线程池中,通过对信号量的控制来限制服务的并发数。

这两种模式有不同的使用场景,线程池隔离模式在处理复杂的耗时操作时更加可靠,而信号量隔离模式则适合处理轻量的、并发量较大的任务。

🔎3.Hystrix限流配置

hystrix-provider服务端模块

🦋3.1 引入Hystrix依赖
代码语言:javascript
代码运行次数:0
运行
复制
<?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
代码运行次数:0
运行
复制
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
代码运行次数:0
运行
复制
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 使用

1)线程池隔离的设置

代码语言:javascript
代码运行次数:0
运行
复制
//线程池隔离的设置
@HystrixCommand(
        groupKey="test-provider",
        threadPoolKey="test-provider",
        threadPoolProperties = {
                @HystrixProperty(name = "coreSize", value = "20"),//线程池大小
                @HystrixProperty(name = "maximumSize", value = "30"),//最大线程池大小
                @HystrixProperty(name = "maxQueueSize", value = "20"),//最大队列长度
                @HystrixProperty(name =  "keepAliveTimeMinutes", value = "2")//线程存活时间
        },commandProperties = {
        @HystrixProperty(name = "execution.isolation.strategy",value = "THREAD")

2)信号量隔离的设置

代码语言:javascript
代码运行次数:0
运行
复制
//信号量隔离的设置
@HystrixCommand(
        //用来设置降级方法
        fallbackMethod = "myTestFallbackMethod",
        commandProperties = {
                //进行熔断配置
                //条件1,设置在滚动时间窗口中,断路器的最小请求数(没有达到不会熔断)。默认20。
                @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold" ,value = "10"),
                //条件2,设置断路器打开的错误百分比。在滚动时间内,在请求数量超过requestVolumeThreshold的值,且错误请求数的百分比超过这个比例,断路器就为打开状态。
                @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage" ,value = "30"),
                //条件3,设置滚动时间窗的长度,单位毫秒。这个时间窗口就是断路器收集信息的持续时间。断路器在收集指标信息的时会根据这个时间窗口把这个窗口拆分成多个桶,每个桶代表一段时间的指标,默认10000.
                @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds" ,value = "10000"),
                //设置当断路器打开之后的休眠时间,休眠时间结束后断路器为半开状态,断路器能接受请求,如果请求失败又重新回到打开状态,如果请求成功又回到关闭状态
                //单位是毫秒
                @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds" ,value = "3000"),

                //配置信号量隔离
                //配置信号量的数值
                @HystrixProperty(name = "execution.isolation.semaphore.maxConcurrentRequests",value = "100"),
                //选择策略为信号量隔离
                @HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE"),
                //设置HystrixCommand执行的超时时间,单位毫秒
                @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000000000")
        }
)
public String Test(){
    ....
}

public String myTestFallbackMethod() {
    log.info("========myTestFallbackMethod=========");
    return "myTestFallbackMethod";
}

🚀感谢:给读者的一封信

亲爱的读者,

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

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

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

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

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

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

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

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