深入学习spring cloud gateway 限流熔断

yizhihongxing

深入学习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日

相关文章

  • Nodejs 识别图片类型的方法

    Nodejs 识别图片类型的方法 在 Node.js 中,我们可以使用第三方包 file-type 来识别图片类型,它提供了一个简单的 API 来帮助我们快速判断文件类型。 安装 可以通过 npm 安装: npm install file-type 使用 在使用 file-type 之前,需要确保你已经将图片的文件内容读取到了内存中,如果你只有图片的文件名,…

    人工智能概论 2023年5月25日
    00
  • 切换路径在Jupyter里调用本地文件的操作

    下面是在Jupyter中切换路径并调用本地文件的完整攻略。 1. 确认当前工作路径 在打开一个jupyter notebook时,需要通过运行以下代码来确认当前工作路径。 import os os.getcwd() 该代码的含义是导入os模块,使用os.getcwd()函数来查询当前工作路径。其中os.getcwd()可以返回当前工作路径的字符串。 2. 修…

    人工智能概览 2023年5月25日
    00
  • 零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门

    零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门 本文将介绍如何搭建一个基于 Node.js、Express、Ejs、Mongodb 的服务器,以及如何开发应用。如果您还没有 Node.js 的基础,可以先学习一下,并确保已经在您的计算机上安装了 Node.js 环境。 安装 安装 Node.js 以及 npm。可以在 N…

    人工智能概论 2023年5月25日
    00
  • JAVA代码设置selector不同状态下的背景颜色

    准备工作: 在HTML中,selector主要是针对class属性和id属性的选择器。在CSS中可以通过设置不同属性值来使得不同选择器状态下的元素有不同的背景颜色。然而,如果希望在JAVA代码中设置selector不同状态下的背景颜色,需要借助相关类库。 步骤: 首先需要添加布局文件。在XML文件中添加以下代码,以创建一个Button按钮作为示例: <…

    人工智能概论 2023年5月24日
    00
  • python opencv 读取本地视频文件 修改ffmpeg的方法

    下面是详细讲解“python opencv 读取本地视频文件 修改ffmpeg的方法”的完整攻略: 一、前置条件 在进行本文讲解前,请确保你已经安装好了 Python 和 OpenCV,以及正确配置了环境变量。 二、读取本地视频文件 使用 Python 调用 OpenCV 读取本地视频文件,可以采用以下代码: import cv2 cap = cv2.Vid…

    人工智能概览 2023年5月25日
    00
  • 详解Pytorch+PyG实现GCN过程示例

    详解Pytorch+PyG实现GCN过程示例 这篇攻略将会详细讲解如何使用PyTorch和PyG实现图卷积网络(GCN)。我们将通过两条示例说明如何使用PyG和PyTorch来实现GCN,并对代码进行详细分析。 简介 图形数据(或称为网络数据或图形数据)由许多顶点和边组成,这些组成通常是不规则的,图形中顶点之间的拓扑关系也是不规则的。GCN是一种用于处理图形…

    人工智能概论 2023年5月25日
    00
  • 图文详解nginx日志切割的实现

    图文详解nginx日志切割的实现 什么是nginx日志切割 nginx是一个高性能的web服务器和反向代理服务器,会记录用户请求Nginx服务器的日志。日志记录包括请求IP、请求时间、请求路径、状态码等,这些信息对于排查问题和运营分析都有很大帮助。但是,随着访问量的不断增加,日志文件不断增大,如果不对日志进行处理,会影响磁盘的可用空间和读写效率,导致服务器的…

    人工智能概览 2023年5月25日
    00
  • keras中的backend.clip用法

    Keras中的backend.clip函数用于将张量的数值限制在给定的区间内。具体来说,它将张量中小于最小值的元素替换为最小值,大于最大值的元素替换为最大值。 该函数的语法为: backend.clip(x, min_value, max_value) 其中,x表示要被剪枝的张量,min_value表示张量中允许的最小值,max_value表示张量中允许的最…

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