深入学习spring cloud gateway 限流熔断

深入学习Spring Cloud Gateway 限流熔断攻略

什么是Spring Cloud Gateway

Spring Cloud Gateway是一个构建在Spring Framework 5,Project Reactor和Spring Boot 2之上的网关,可以作为所有基于HTTP路由的API的入口点。它提供了一种简单而有效的方式来传递客户端请求到多个下游服务实例。

限流熔断

在微服务架构中,服务之间的通信是基于网络进行的,由于网络的不稳定性,可能会出现响应延迟、服务故障等问题。为了保证服务的高可用性和稳定性,需要对服务进行一些保护性措施,其中限流和熔断是两种常见的保护措施。

限流

限流是通过对流量进行控制,使其达到服务所能承受的范围内,从而保证服务的可用性和稳定性。Spring Cloud Gateway通过应用Hystrix组件中的限流来达到限制请求流量的目的。可以通过在网关路由定义中配置限流规则,例如:

spring:
  cloud:
    gateway:
      routes:
        - id: book_service_route
          uri: http://localhost:9090
          predicates:
            - Path=/books/**
          filters:
            - name: Hystrix
              args:
                fallbackUri: forward:/fallback/bookservicefallback
                name: bookservicefallback # Hystrix命令名称
                fallback:
                  type: THROWS_EXCEPTION # 回退时执行的类型,这里是抛出异常
                # 以下是Hystrix插件的属性
                circuitBreaker.requestVolumeThreshold: 2 # 当在10秒内达到5个请求时开启熔断
                circuitBreaker.errorThresholdPercentage: 50 # 当请求失败率达到50%后开启熔断
                circuitBreaker.sleepWindowInMilliseconds: 5000 # 熔断开启5秒后,进入半熔断状态
                execution.isolation.thread.timeoutInMilliseconds: 1000 # 执行超时时间
                # 限流配置属性
                rateLimiter.enabled: true # 启用限流
                rateLimiter.rateLimiter-type: user # 根据用户进行限流
                rateLimiter.user-key-resolver-type: PrincipalNameKeyResolver # 能够解析用户信息,以便进行限流
                rateLimiter.redis-rate-limiter.replenishRate: 1 # 令牌桶的填充速率
                rateLimiter.redis-rate-limiter.burstCapacity: 1 # 令牌桶的容量

上述配置使用了Hystrix的限流属性,同时也使用了RateLimiter来进行具体的限流操作。

熔断

熔断是指当某个服务出现故障或延迟等异常情况时,关闭或断开对该服务的访问,直到该服务恢复正常。Gateway通过应用Hystrix组件中的熔断机制来达到熔断的目的。可以通过在网关路由定义中配置熔断规则,例如:

spring:
  cloud:
    gateway:
      routes:
        - id: book_service_route
          uri: http://localhost:9090
          predicates:
            - Path=/books/**
          filters:
            - name: Hystrix
              args:
                fallbackUri: forward:/fallback/bookservicefallback
                name: bookservicefallback # Hystrix命令名称
                fallback:
                  type: THROWS_EXCEPTION # 回退时执行的类型,这里是抛出异常
                # 以下是Hystrix熔断插件的属性
                circuitBreaker.requestVolumeThreshold: 2 # 当在10秒内达到5个请求时开启熔断
                circuitBreaker.errorThresholdPercentage: 50 # 当请求失败率达到50%后开启熔断
                circuitBreaker.sleepWindowInMilliseconds: 5000 # 熔断开启5秒后,进入半熔断状态
                execution.isolation.thread.timeoutInMilliseconds: 1000 # 执行超时时间

上述配置使用了Hystrix的熔断属性,在请求达到一定量之后,如果大批量的请求出现异常,那么Gateway就会开启熔断机制,限制对应路由的请求,防止对服务造成压力。

示例

下面是两个使用限流和熔断的示例。

示例1:限流

考虑一个情况,当用户对我们的API进行请求时,为了保护我们的服务,我们需要对每个请求进行限流,以防止攻击和过度使用。我们可以根据用户IP地址来限流。

spring:
  cloud:
    gateway:
      routes:
        - id: rate_limiter_route
          uri: http://localhost:9000
          predicates:
            - Path=/limit/**
          filters:
            - name: RequestRateLimiter
              # IP地址作为限流键值,每秒最多处理1个请求
              args:
                key-resolver: "#{@ipKeyResolver}"
                redis-rate-limiter.replenishRate: 1
                redis-rate-limiter.burstCapacity: 1

上述配置使用了RequestRateLimiter过滤器,并采用了基于IP地址的限流策略。同时,我们需要定义一个IP地址解析器:

@Component
public class IpKeyResolver implements KeyResolver {

    @Override
    public Mono<String> resolve(ServerWebExchange exchange) {
        return Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
    }
}

示例2:熔断

考虑另一个情况,我们需要在网关上实现熔断机制,以避免后端服务不可用或超时。我们可以为每个路由配置Hystrix过滤器,并在超过指定阈值的情况下打开熔断器。

spring:
  cloud:
    gateway:
      routes:
        - id: fallback_route
          uri: https://example.com
          predicates:
            - Path=/fallback/**
          filters:
            - name: Hystrix
              args:
                name: fallbackcmd
                fallbackUri: forward:/fallbackmessage
                # 設置熔斷器相關參數
                circuitBreaker.requestVolumeThreshold: 2
                circuitBreaker.sleepWindowInMilliseconds: 10000 
                circuitBreaker.errorThresholdPercentage: 50
                # 執行請求的相關參數
                execution.isolation.thread.timeoutInMilliseconds: 2000
        - uri: lb://stockquote
          predicates:
            - Path=/stock/**
          filters:
            - name: Hystrix
              args:
                name: hystrixcmd
                fallbackUri: forward:/fallback/stockfallback
                circuitBreaker.requestVolumeThreshold: 2
                circuitBreaker.sleepWindowInMilliseconds: 10000 
                circuitBreaker.errorThresholdPercentage: 50
                execution.isolation.thread.timeoutInMilliseconds: 5000

上述配置为两个路由配置了Hystrix过滤器,并分别采用了不同的熔断策略。当后端服务不可用或超时时,Gateway将为该路由开启熔断机制。这样做可以保持系统的稳定性,并防止系统负载达到过高。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入学习spring cloud gateway 限流熔断 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • Python django框架输入汉字,数字,字符生成二维码实现详解

    首先,我们需要明确一下本攻略的目的:即使用 Python 和 Django 框架实现输入汉字、数字和字符生成二维码的功能。接下来,将从以下三个步骤详细讲解整个流程: 安装必要库和工具 我们需要使用 Python 语言和 Django 框架来实现这个功能,因此需要安装 Python 和 Django 相应的库。同时,为了生成二维码,我们还需要安装 qrcode…

    人工智能概论 2023年5月25日
    00
  • 运行tensorflow python程序,限制对GPU和CPU的占用操作

    要限制TensorFlow Python程序对GPU和CPU的占用操作,可以使用TensorFlow的tf.config模块中的experimental API。以下是详细步骤: 步骤一:导入依赖库 首先需要导入TensorFlow和其他依赖库: import tensorflow as tf import os 步骤二:设置GPU的内存增长 可以使用以下代…

    人工智能概论 2023年5月24日
    00
  • 详解springboot整合mongodb

    下面是“详解SpringBoot整合MongoDB”的完整攻略: 1. 前置条件 在使用SpringBoot整合MongoDB之前,需要先满足以下条件: 安装Java JDK,推荐使用Java 8或以上版本。 安装MongoDB数据库,推荐使用MongoDB 4.0或以上版本。 在IDE中安装SpringBoot插件,推荐使用IntelliJ IDEA或Ec…

    人工智能概论 2023年5月25日
    00
  • 解决python 打包成exe太大的问题

    当我们把Python程序打包成.exe文件时,可能会遇到打包后的文件太大的问题。解决办法是使用一些第三方工具进行压缩和优化。下面是解决Python打包成.exe太大问题的完整攻略。 1. 通过PyInstaller压缩 PyInstaller是一个易于使用的打包工具,可以将Python程序打包成独立的可执行文件,包括Windows、Linux和Mac OS …

    人工智能概览 2023年5月25日
    00
  • tensorflow指定GPU与动态分配GPU memory设置

    下面我会详细讲解“TensorFlow指定GPU与动态分配GPU memory设置”的完整攻略。 指定GPU 在TensorFlow中,如果我们有多个GPU可用,可以通过以下两种方式指定哪个GPU要被使用: 1. 手动设置 可以手动设置环境变量CUDA_VISIBLE_DEVICES指定哪些GPU可被使用,这个环境变量的值是一个按逗号分隔的GPU编号列表,例…

    人工智能概论 2023年5月24日
    00
  • Python3数字求和的实例

    Python3数字求和的实例是一个非常简单的程序,但它很好地展示了Python语言的一些关键特性。下面我来详细讲解这个程序的实现方法: 程序的实现方法 我们将使用Python解释器来运行这个程序,主要有以下两个步骤: 打开Python解释器:许多操作系统都已经默认安装了Python解释器,输入python3并按下回车键即可打开它。 编写Python代码:使用…

    人工智能概论 2023年5月25日
    00
  • 深入浅析nginx部署及简单优化

    深入浅析nginx部署及简单优化 1. 简介 这是一个关于如何部署nginx及简单优化的攻略。nginx是一个高性能的、开源的、跨平台的Web服务器和反向代理服务器。在我们的Web应用程序中,它可以扮演着负责静态资源服务的Web服务器和扮演负责反向代理的反向代理服务器的角色。 在本攻略中,我们将深入了解如何在Linux平台上部署nginx,并提供几个简单的优…

    人工智能概览 2023年5月25日
    00
  • 联想拯救者Y9000P 2022款值得入手吗 联想拯救者Y9000P 2022游戏本深度评测

    联想拯救者Y9000P 2022款的评测 一、外观设计 联想拯救者Y9000P 2022款采用了与上一代相同的黑色金属机身,看起来非常稳重、沉稳。机身采用了镜面印花技术和雾面工艺,让整体外观更加细腻,而且不容易留下指纹和污渍。键盘背光也经过了升级,按下键盘之后的反馈更加顺畅,手感更加舒适。 另外,拯救者Y9000P 2022款还加入了最新的2.5K OLED…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部