首页 > 其他分享 >网关限流方案

网关限流方案

时间:2024-05-28 14:45:36浏览次数:21  
标签:方案 网关 http name springframework rate 限流 import

网关限流是保护后端服务的一种常见方法,它可以防止流量激增导致系统崩溃。以下是几种常见的网关限流方案及其实现示例:

一、基于Nginx的限流

1. 配置示例(nginx)

http {
    # 定义限速器
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;

    server {
        location / {
            # 应用限速器
            limit_req zone=mylimit burst=5 nodelay;
            proxy_pass http://backend_service;
        }
    }
}

2. 说明

  • limit_req_zone:定义一个限速器,基于客户端IP地址,存储在10m大小的共享内存中,限速为每秒1个请求。
  • limit_req:应用限速规则,允许突发流量5个请求,nodelay表示请求超过突发限制时立即返回错误。

二、基于Spring Cloud Gateway的限流

1. 配置示例(yaml)

spring:
  cloud:
    gateway:
      routes:
      - id: limit_route
        uri: http://localhost:8080
        predicates:
        - Path=/api/**
        filters:
        - name: RequestRateLimiter
          args:
            key-resolver: '#{@remoteAddrKeyResolver}'
            redis-rate-limiter.replenishRate: 10
            redis-rate-limiter.burstCapacity: 20

2. 实现Key Resolver(Java)

import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Mono;

@Configuration
public class RateLimiterConfig {

    @Bean
    public KeyResolver remoteAddrKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
    }
}

3. 说明

  • RequestRateLimiter:使用Redis限流器。
  • key-resolver:定义限流键,这里基于客户端IP地址。
  • redis-rate-limiter.replenishRate:每秒新增令牌数。
  • redis-rate-limiter.burstCapacity:令牌桶的最大容量,允许突发流量。

三、基于Kong的限流

1. 配置Kong(shell)

curl -i -X POST http://localhost:8001/services/your_service_name/plugins \
    --data "name=rate-limiting" \
    --data "config.minute=100"

2. 说明

  • config.minute:每分钟允许的最大请求数。

四、基于Envoy的限流

1. 配置示例(yaml)

static_resources:
  listeners:
    - name: listener_0
      address:
        socket_address:
          address: 0.0.0.0
          port_value: 10000
      filter_chains:
        - filters:
            - name: envoy.filters.network.http_connection_manager
              config:
                route_config:
                  virtual_hosts:
                    - name: backend
                      domains: ["*"]
                      routes:
                        - match:
                            prefix: "/"
                          route:
                            cluster: service_backend
                http_filters:
                  - name: envoy.filters.http.router
                  - name: envoy.filters.http.local_ratelimit
                    typed_config:
                      "@type": type.googleapis.com/envoy.config.filter.http.local_rate_limit.v2.LocalRateLimit
                      stat_prefix: http_local_rate_limiter
                      token_bucket:
                        max_tokens: 100
                        tokens_per_fill: 10
                        fill_interval: 1s

2. 说明

  • token_bucket.max_tokens:令牌桶的最大容量。
  • tokens_per_fill:每次填充的令牌数。
  • fill_interval:填充令牌的时间间隔。

 

实际应用

在实际项目中,根据业务需求和技术栈选择合适的限流方案。例如:

  • Nginx限流:适用于简单、高性能的限流需求。
  • Spring Cloud Gateway限流:适用于Spring生态圈,支持复杂的限流和路由策略。
  • Kong限流:高度可扩展、支持多种插件,适用于大型分布式系统。
  • Envoy限流:提供丰富的流量管理功能,适用于微服务架构。

示例代码

基于Spring Cloud Gateway的示例

pom.xml文件:

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
    </dependency>
</dependencies>

application.yml文件:

spring:
  cloud:
    gateway:
      routes:
      - id: limit_route
        uri: http://localhost:8080
        predicates:
        - Path=/api/**
        filters:
        - name: RequestRateLimiter
          args:
            key-resolver: '#{@remoteAddrKeyResolver}'
            redis-rate-limiter.replenishRate: 10
            redis-rate-limiter.burstCapacity: 20

RateLimiterConfig.java文件:

import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Mono;

@Configuration
public class RateLimiterConfig {

    @Bean
    public KeyResolver remoteAddrKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
    }
}

通过上述配置和代码,即可实现基于Spring Cloud Gateway的限流机制。根据实际需求,还可以进一步增加自定义限流策略和监控报警等功能。

 

标签:方案,网关,http,name,springframework,rate,限流,import
From: https://www.cnblogs.com/zhangleinewcharm/p/18217978

相关文章

  • Go实战全家桶之九:统一网关
    开源:https://gitee.com/ichub/gocenter.git代码:配置:gateway:bypass:-path:/goauth/login-path:/goauth/logoutroutes:-path:/datadictserviceId:web.platform.com-path:/deptempserviceId:web.platform.com-p......
  • 【舞台灯方案】LED驱动恒流芯片pwm深度调光APS54085降压IC
    产品描述APS54085是一款PWM工作模式,高效率、外围简单、内置功率MOS管,适用于5-100V输入的高精度降压LED恒流驱动芯片。最大电流2.0A。APS54085可实现线性调光和PWM调光,线性调光有效电压范围0.52-2.55V.PWM调光频率范围100HZ-30KHZ。APS54085工作频率可以通过R......
  • CDC 数据实时同步入湖的技术、架构和方案(截至2024年5月的现状调研)
    博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维码进入京东手......
  • 金融信创生态实验室第三期金融信创优秀解决方案--中间件解决方案
    编者按为了更好地落实金融信创生态实验室(简称“实验室”,法人机构名称“北京金安信息技术有限责任公司”)“共赢桥、适配库、孵化器”定位,打造金融信创公共服务平台,实验室初步形成了金融信创解决方案(以下简称“解决方案”)的“征集-甄选-发布”闭环运行机制,于2021年11月启动第......
  • 网关路由快速入门
    在SpringBoot中整合SpringCloudGateway是一个常见的需求,尤其是当需要构建一个微服务架构的应用程序时。SpringCloudGateway是SpringCloud生态系统中的一个项目,它提供了一个API网关,用于处理服务之间的请求路由、安全、监控和限流等功能。使用引入依赖<dependency>......
  • 如何安全地进行隔离网文件导出,最优方案出炉!
    越来越多的企业在网络建设时进行网络隔离,通常与提高安全性和控制风险有关。但网络隔离后,企业仍存在与外部客户、合作伙伴等数据交换的场景需求,即如何安全进行隔离网文件导出,是企业急需解决的一个难题。先来看一下,企业通常会采取哪些隔离方式吧?1、网闸/光闸隔离:阻断网络通信协议,......
  • kkFileView——全能的在线文件预览解决方案
    引言在数字化办公日益普及的今天,文件的在线预览成为了一个不可或缺的功能。无论是个人还是企业,都希望能够在浏览器中直接打开并浏览各种格式的文档。今天,我们将探索一款国产开源免费的在线文件文档预览软件——kkFileView。一、kkFileView简介kkFileView是一个基于Spring......
  • Nginx R31 doc-13-Limiting Access to Proxied HTTP Resources 访问限流
    前言大家好,我是老马。很高兴遇到你。我们为java开发者实现了java版本的nginxhttps://github.com/houbb/nginx4j如果你想知道servlet如何处理的,可以参考我的另一个项目:手写从零实现简易版tomcatminicat手写nginx系列如果你对netty不是很熟悉,可以读一下从......
  • 使用istio服务网格作为api网关
    API网关作为客户端访问后端的入口由来已久,主要是管理“南北”流量,近几年开始流行ServiceMesh架构,主要是管理内部系统,(即“东西”流量),而像Istio这样的服务网格也有内置网关,可以将系统内外的流量置于统一控制之下。这通常会给Istio的初次用户带来困惑。ServiceMesh和A......
  • 智慧水产养殖解决方案
    智慧水产养殖解决方案可以适用于不同的水产养殖场景,如室内塘口、室外塘口和室外大水面养殖。此解决方案可以帮助鱼类、虾类、贝类、蟹类、鳖类等水产养殖进行数字化、智能化、自动化管理,提升养殖过程的精准度、精细度、便捷度和高效度。  方案主要内容包括环境监测监控、异常......