首页 > 其他分享 >基于Spring Boot2.x 设置 Spring Cloud Gateway 限流(令牌桶模式)

基于Spring Boot2.x 设置 Spring Cloud Gateway 限流(令牌桶模式)

时间:2023-12-31 18:22:46浏览次数:30  
标签:spring Boot2 限流 模块 Spring routes gateway cloud

参考

注意

  1. 配置中设置限流但是不设置 key-resolver访问会直接返回 403 错误码。
  2. 限流达到阈值会返回 429 错误码。

环境

环境 版本 说明
Windows 10
VS Code 1.85.1
Spring Boot Extension Pack v0.2.1 vscode插件
Extension Pack for Java v0.25.15 vscode插件
JDK 11
Springboot 2.3.12.RELEASE
spring-cloud-dependencies Hoxton.SR12 mvn依赖
spring-cloud-starter-gateway 未设置 mvn依赖
spring-boot-starter-data-redis-reactive 未设置 mvn依赖(限流桶用到)
Apache Maven 3.8.6
Redis 7.2.3 基于docker
Docker 24.0.6
Docker Desktop 4.25.2 (129061)

正文

项目为多模块项目,其中包含网关模块(gateway)、api模块(api)和公共模块(common);网关模块将请求映射到api模块,公共模块存放公共代码。

网关模块(gateway)代码

  1. pom.xml 引入网关与 Redis 依赖。

    <!-- 限流用到 -->
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
    </dependency>
    <!-- 网关与 spring-boot-starter-web 互斥,只能保留其一-->
    <dependency> 
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    
  2. 入口文件 gateway\src\main\java\com\xiaqiuchu\gateway\DemoApplication.java

    package com.xiaqiuchu.gateway;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.cloud.client.SpringCloudApplication;
    
    @SpringCloudApplication
    public class DemoApplication {
    	public static void main(String[] args) {
    		SpringApplication.run(DemoApplication.class, args);
    	}
    
    }
    
  3. 创建 gateway\src\main\java\com\xiaqiuchu\gateway\config\KeyResolverConfiguration.java

    package com.xiaqiuchu.gateway.config;
    
    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 KeyResolverConfiguration {
    	@Bean
    	public KeyResolver pathKeyResolver(){
    		return exchange -> Mono.just(exchange.getRequest().getURI().getPath());
    	}
    }
    
  4. 修改配置 gateway\src\main\resources\application.properties

    server.port=8080
    
    # 网关日志
    logging.level.org.springframework.cloud.gateway: trace
    
    # 配置 https://blog.csdn.net/yuanchangliang/article/details/109579705
    # 介绍 https://blog.csdn.net/qq_38380025/article/details/102968559
    spring.cloud.gateway.routes[0].id=gateway
    spring.cloud.gateway.routes[0].uri=http://127.0.0.1:8081
    spring.cloud.gateway.routes[0].predicates[0]=Path=/student/**
    
    # 测试路由
    spring.cloud.gateway.routes[1].id=test
    spring.cloud.gateway.routes[1].uri=http://127.0.0.1:8081
    spring.cloud.gateway.routes[1].predicates[0]=Path=/index/**
    
    # 默认限流规则为 令牌桶。(限流默认关闭)
    # 应用于路由的过滤器的名称
    spring.cloud.gateway.routes[1].filters[0].name=RequestRateLimiter
    # 令牌入桶的速度为每秒n个,相当于QPS
    spring.cloud.gateway.routes[1].filters[0].args.redis-rate-limiter.replenishRate=1
    # 这里2n只是举例入桶和出桶,入桶与出桶数量按照实际情况进行设置。
    # 桶内能装2n个令牌,相当于峰值,要注意的是:第一秒从桶内能去2n个,但是第二秒只能取到n个了,因为入桶速度是每秒n个
    spring.cloud.gateway.routes[1].filters[0].args.redis-rate-limiter.burstCapacity=2
    # 每个请求需要的令牌数
    spring.cloud.gateway.routes[1].filters[0].args.redis-rate-limiter.requestedTokens=1
    # 限流的键的解析器的 Bean 对象的名字(不设置这个访问会直接403)
    spring.cloud.gateway.routes[1].filters[0].args.key-resolver=#{@pathKeyResolver}
    
    # redis配置
    spring.redis.host=127.0.0.1
    spring.redis.port=6379
    

api模块(api)模块代码

本模块是 web 模块,提供接口供 网关模块(gateway)映射,本模块端口号为 8081 。

公共模块(common)模块代码

本模块存放公共文件。

测试

设置令牌桶容量为2,每秒填充1个。
image

标签:spring,Boot2,限流,模块,Spring,routes,gateway,cloud
From: https://www.cnblogs.com/xiaqiuchu/p/17937830

相关文章

  • Spring学习记录之引入外部属性配置文件
    Spring学习记录之引入外部属性配置文件前言这篇文章是我第二次学习b站老杜的spring相关课程所进行的学习记录,算是对课程内容及笔记的二次整理,以自己的理解方式进行二次记录,其中理解可能存在错误,欢迎且接受各位大佬们的批评指正;关于本笔记,只是我对于相关知识遗忘时快速查阅了解......
  • SpringBoot接入Mybatis-Flex
    相信不少的伙伴在日常开发中应该都用过MyBatis增强框架吧,目前来说国内用的比较多的无非就是MyBatis-Plus,那么今天我再给大家介绍一款新的MyBatis增强框架,它就是MyBatis-Flex。那么这个框架到底怎么样呢,跟MyBatis-Plus有什么不一样的呢,下面我们先来看下它的介绍,这是官网的一段介......
  • SpringBoot2 整合 Eurkea 实例
    文章目录1.概述2.注册示例2.1工程目录2.2引入依赖2.3启动类2.4配置文件2.5启动服务注册中心3.服务提供者(eurekaclient)实例3.1工程目录3.2引入依赖3.3Java源文件3.5配置文件3.6启动服务提供者参考文献1.概述Eurkea主要负责服务治理功能。服务治理主要用来实现各......
  • SpringBoot2 整合 SpringCloud Feign 实例
    文章目录1.简介2.工程实例2.1注册中心springcloud-study-eureka-server2.1.1依赖pom.xml2.1.2配置文件application.properties2.1.3启动类EurekaServerApplication.java2.2服务提供者springcloud-study-hello-service2.2.1依赖pom.xml2.2.2配置文件application.ym......
  • SpringBoot2 整合 SpringCloud 的 Hystrix断路器 实例
    文章目录1.概述2.短路器3.SpringFeign使用Hystrix断路器3.1工程实例3.2修改Fegin模块3.3测试运行参考文献1.概述微服务架构中服务之间互相调用,单个服务通常会集群部署,由于网络等原因,服务不能保证100%可用,如果单个服务出现问题会出现请求的堆积,Servlet容器的线程资源......
  • SpringBoot2 整合 Redis 实例,实现写入和读取的操作
    1.启动RedisServer启动redisserver,如下图所示,端口号6379:2.工程实例2.1工程目录工程目录如下图所示:2.2pom.xml引入依赖:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>......
  • Spring 事务失效的情况
    1.数据库引擎不支持事务以MySQL为例,MyISAM存储引擎不支持事务,InnoDB引擎支持事务。2.异常被catch执行以下测试方法,数据成功插入,调用test方法没有回滚。@Override@Transactional(rollbackFor=Exception.class,propagation=Propagation.REQUIRED)publicvoid......
  • Spring Boot2.x 集成 OpenFeign 实现 Hystrix 熔断降级与 Ribbon 负载均衡配置
    参考https://blog.csdn.net/zhangchaoyang/article/details/123453616https://blog.csdn.net/u010277958/article/details/88744263https://blog.csdn.net/iwlnner/article/details/110090595https://cloud.tencent.com/developer/article/2225692https://blog.csdn.net/z......
  • Spring AOP快速上手
    什么是AOPAOP全称是aspect-orientedprograming面向切面编程。用于解决横向关注点的问题,横向关注点是指多个模块或者模块中的多个功能需要共享的功能,如日志记录、事务管理、安全控制等等。即重复性的代码抽象出来,形成可复用的代码模块。AOP的核心术语Joinpoint(连接点):程序执......
  • SpringBoot原理学习
    一、IoC/DI相关1.如何进行依赖注入?①依赖注入的三种方式Ⅰ.属性注入/***Field注入/属性注入**///@Resource(name="mySQLDbServiceImpl")//@Autowired@Qualifier(value="mySQLDbServiceImpl")privateDbServicedbService;@Aut......