【Java编程系列】Springcloud-gateway自带限流方案实践篇

news2024/10/7 16:21:58

1、前言

        作为一个后端开发,对于后端服务的安全性方面,一定要有足够的考虑。近期的开发工作中,有一个实现分享外部链接的需求点,个人认为这一块会有安全隐患。比如,因为这个分享的外链会被用户无限制点开查看,那如果有人恶意点击,或高频调用,那这种情况可能会对我们的后端服务造成一定的隐患问题。所以,防患于未然,今天考虑做个限流处理的方案。


2、限流实现

2.1 限流方式

    限流方式有多种,例如Nginx、zuul、springcloud-gateway,Google的guava,或是应用服务AOP内。

2.2 限流算法

    限流算法常用的有4种:固定窗口限流算法、滑动窗口限流算法、漏桶算法、令牌桶算法

2.3 springcloud-gateway内部自带限流实现

引入pom依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

<!--基于 reactive stream 的redis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

注入限流维度的bean:

package xxx.xxx.xxx.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import reactor.core.publisher.Mono;

@EnableDiscoveryClient
@SpringBootApplication
@ComponentScan(value = "xxx.xxx.xxx")
public class GatewayStartup {
	public static void main(String[] args) {
		SpringApplication.run(GatewayStartup.class, args);
	}
	
	@Bean(name = "remoteAddrKeyResolver")
	public KeyResolver remoteAddrKeyResolver() {
		//按请求ip限流
	    return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
	}
}

在yml中设置路由限流的配置

spring:
  cloud:
    gateway:
      routes:  #限流路由配置
       - id: requestLimiter
         uri: lb://testService  #路由的服务名称
         predicates:
           - Path= /context/testLimit/**  #需要限流的接口路径
         filters:
           - name: RequestRateLimiter	#过滤器名称
             args:
              key-resolver: "#{@remoteAddrKeyResolver}"	#使用SpEL表达式根据#{@beanName}从 Spring 容器中获取 Bean 对象
              redis-rate-limiter.replenishRate: 20 # 令牌桶填充的速率 秒为单位
              redis-rate-limiter.burstCapacity: 20 # 令牌桶总容量
              redis-rate-limiter.requestedTokens: 1 # 每次请求获取的令牌数
  redis:
    host: localhost
    port: 6379

对限流路径下的一个接口,通过压测工具,进行多线程压测一番,看看实践演示效果:

我这里使用的压测工具是ApiFox,也可以使用Jmeter之类的,下面设置5个线程,每个线程循环请求5次

 通过测试报告可以看到:

 再测一次:

 其实,gateway这里主要是依赖于redis来实现的令牌桶的限流处理,我们可以查看redis内的限流key情况:

到此,基本限流就实现完成啦!!!


3、总结

        在实践过程中,有2个点需要注意:
        ①第一点,yml中的配置一定要注意缩进格式,以及path路径的配置(我一开始就是路径少写了,导致没生效;缩进不对会导致启动报错)
        ②第二点,redis中的限流存储的key值,只有在请求执行过程中才会查看的到,请求结束后不一会儿,key就会被删除,看不到这个key值啦(刚开始我去查询key值就是在执行结束之后,一直看不到key值效果)

        最后,对于限流的配置数值,其实也没有一个权威的限制标准,所以需要根据自己的服务能力以及平常业务的正常TPS值来做一下参考,一般设置一个高于平常业务的TPS值,应该就差不多了。因为个人认为,一般只有恶意请求或是攻击请求,才有可能会比自己设置的阈值高出很多。

        若有任何不对之处,欢迎下方留言探讨~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/554173.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

常见分布函数。

一维常见分布函数 1.离散型 ① 0 - 1分布 记 X~B(1,p) 如果X的概率分布为 ( 1 0 p 1 − p ) \begin{pmatrix} 1 & 0 \\ p & 1-p \end{pmatrix} (1p​01−p​),则称X服从参数为P的0-1分布&#xff08;0<p<1&#xff09;。 注&#xff1a;0-1分布又称一次伯努利试…

iOS-Telegraph异步响应实现

背景 Telegraph该库只支持管理本地同步请求&#xff0c;为了长远打算&#xff0c;需要研究是否能使response异步回调的方法 参考gitHub-Telegraph文档 现象&#xff1a;根据文档说明和示例&#xff0c;以及查看源码实现确认该第三方库确实只支持管理本地同步的请求响应 它的…

【程序员日记】——从业务编排到低代码 | 京东云技术团队

之前总聊微服务&#xff0c;今天换一个话题—低代码。 低代码这个词也是最近这几年很火的概念&#xff0c;尤其是遇到大环境下行&#xff0c;很多大厂和互联网那个公司也在慢慢在低代码方向发力&#xff0c;当然&#xff0c;对于传统项目交付型的软件公司&#xff0c;低代码也…

LabVIEWCompactRIO 开发指南28 可重入和非重入子VI之间的权衡

LabVIEWCompactRIO 开发指南28 了解可重入和非重入子VI之间的权衡 重入是子VI执行属性中的设置。在LabVIEW FPGA中&#xff0c;子VI执行默认设置为可重入。重入在FPGA逻辑中创建子VI的多个副本。这能够并行执行子VI的多个副本&#xff0c;同时存储不同且独立的数据存储。 在…

计算GMAC和GFLOPS

GMAC 代表“Giga Multiply-Add Operations per Second”&#xff08;每秒千兆乘法累加运算&#xff09;&#xff0c;是用于衡量深度学习模型计算效率的指标。它表示每秒在模型中执行的乘法累加运算的数量&#xff0c;以每秒十亿 (giga) 表示。 乘法累加 (MAC) 运算是许多数学计…

opencv_c++学习(十七)

一、边缘检测 左侧上面的曲线表示的是像素从左到右的变化&#xff0c;下面的曲线是上面曲线求导而得。 Sobel边缘检测算子&#xff1a; Sobel(InputArray src, outputArray dst,int ddepth, int dx, int dy, int ksize 3, double scale 1, double delta 0, int borderType …

AI 图像编辑技术 DragGAN 问世,用户可以通过拖拽改变汽车大小或人物表情等

&#x1f680; AI 图像编辑技术 DragGAN 问世&#xff0c;用户可以通过拖拽改变汽车大小或人物表情等 近日&#xff0c;马克斯・普朗克计算机科学研究所研究者们推出了一种控制GAN的新方法DragGAN&#xff0c;用户可以通过拖拽改变汽车大小或人物表情等。 DragGAN类似于Photo…

顶层策划打开互联网市场大门

大家好&#xff01;我是小鱼。随着市面上越来越多的中小企业老板进入互联网市场&#xff0c;对软件开发的技术和要求也逐渐高了起来。单纯做一个商城已经远远不满足客户的需求了。那么客户他到底需要什么? 小编总结了一下&#xff0c;第一客户需要一个完整的系统体系&#xff…

类和对象 - 下(C++)

目录 构造函数补充 构造函数体赋值 初始化列表 explicit关键字 Static成员 概念 特性 友元 友元函数 友元类 内部类 匿名对象 编译器对拷贝对象的优化 理解类和对象 构造函数补充 构造函数体赋值 构造函数&#xff1a; 我们知道 构造函数本质就是在对象创建的同时对其进行初始…

【Android】配置不同的开发和生产环境

目录 前言 配置build.gradle&#xff08;Module级别&#xff09; 创建对应环境的目录 切换不同环境 ​编辑选择打包的环境 前言 在web开发中不同的环境对应的配置不一样&#xff0c;比如开发环境的url是这样&#xff0c;测试环境的url是那样的&#xff0c;在app中也会涉…

双轮平衡车实现自平衡功能

1. 功能说明 在双轮小车上安装一个六轴陀螺仪传感器&#xff0c;本文示例将实现双轮小车自主平衡功能。 2. 电子硬件 在这个示例中&#xff0c;我们采用了以下硬件&#xff0c;请大家参考&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#xff09; 扩展板 Big…

基于网络的思维导图WiseMapping

在退烧了一天半之后&#xff0c;老苏的抗原终于变两道杠了。之前还总怀疑自己是无症状&#xff0c;大意了&#xff0c;被新冠给查缺补漏了 &#x1f602; 什么是 WiseMapping &#xff1f; WiseMapping 是一款基于网络的免费思维导图产品。该项目的目标是提供可由企业、教育和学…

Java面试知识点(全)-分布式和微服务-dubbo面试知识点

Dubbo是什么&#xff1f; Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架&#xff0c;现已成为 Apache 基金会孵化项目。 面试官问你如果这个都不清楚&#xff0c;那下面的就没必要问了。 官网&#xff1a;http://dubbo.apache.org 为什么要用Dubbo&#xff1f…

内存泄漏之DispatcherTimer

https://www.jianshu.com/p/7e9ecb383bd0 我们经常会在程序中使用DispatcherTimer&#xff0c;但是如果一不小心就会发生内存泄漏&#xff0c;请看下面的Demo&#xff1a; 内存泄漏代码 我创建了一个简单的窗口Example1.xaml&#xff1a; <Window x:Class"MemoryLea…

Keep your Eyes on the Lane Real-time Attention-guided Lane Detection 论文精读

关注车道&#xff1a;实时注意力引导车道线检测 摘要 现代车道线检测方法在复杂的现实世界场景中取得了显著的性能&#xff0c;但许多方法在保持实时效率方面存在问题&#xff0c;这对自动驾驶汽车很重要。在这项工作中&#xff0c;我们提出了LaneATT&#xff1a;一种基于锚点…

【降维打击】T分布随机近邻嵌入(T-SNE)Python实践

近几天看到论文里面有T分布随机近邻嵌入&#xff08;T-distributed stochastic neighbor embedding, T-SNE&#xff09;这种可视化方法&#xff0c;以前好像也看到过&#xff0c;但没有系统了解过&#xff0c;现有时间正好实践记录一下。 1. T-SNE简介 T-SNE是一种降维方法&am…

搭建监控日志系统

在微服务或者集群架构中&#xff0c;一次请求的调用会跨多个服务&#xff08;web&#xff0c;mysql&#xff0c;feign等&#xff09;、多个模块&#xff08;用户模块&#xff0c;商品模块等&#xff09;、多个容器&#xff08;用户模块可能有多个实例&#xff09;&#xff0c;这…

【科普】干货!带你从0了解移动机器人(二)—— 移动机器人硬件组成

移动机器人是一个多功能于一体的综合系统&#xff0c;内容涵盖了传感器技术、自动化技术、信息处理、电子工程等&#xff0c;它集环境感知、动态决策与规划于一体&#xff0c;是目前科学技术发展最活跃的领域之一。移动机器人的各种组件之间需要协同工作才能实现机器人的自主移…

【源码解析】RuoYi-Vue-Plus翻译功能 Translation 源码分析

类说明功能Translation通用翻译注解标注需要翻译的字段&#xff0c;用于实体类字段上TranslationType翻译类型注解标注翻译字段的实现类型&#xff0c;用于实现类上标注TransConstant翻译常量TranslationType 类型常量TranslationConfig翻译模块配置类配置初始化&#xff0c;设…

深度学习基础入门篇[9.2]:卷积之1*1 卷积(残差网络)、2D/3D卷积、转置卷积数学推导、应用实例

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…