【Spring Cloud】Gateway 服务网关限流

news2025/2/27 14:07:34

文章目录

  • route限流
    • 导入依赖
    • 编写配置类
    • 测试
  • 自定义API分组
  • 总结

网关是所有请求的公共入口,所以可以在网关进行限流,而且限流的方式也很多,我们本次采用前面学过的 Sentinel 组件来实现网关的限流。

Sentinel 支持对 SpringCloud Gateway、Zuul等主流网关进行限流。

在这里插入图片描述

从1.6.0版本开始,Sentinel提供了SpringCloud Gateway的适配模块,可以提供两种资源维度的限流:

  • route维度:即在Spring配置文件中配置的路由条目,资源名为对应的routeld;
  • 自定义API维度:用户可以利用Sentinel提供的API来自定义一些API分组;

route限流

导入依赖

<dependency>
	<groupId>com.alibaba.csp</groupId>
	<artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
</dependency>

编写配置类

基于Sentinel的Gateway限流是通过其提供的Filter来完成的,使用时只需注入对应的SentinelGatewayFilter实例以及SentinelGatewayBlockExceptionHandler实例即可。

@Configuration
public class GatewayConfiguration {
    private final List<ViewResolver> viewResolvers;
    private final ServerCodecConfigurer serverCodecConfigurer;

    public GatewayConfiguration(ObjectProvider<List<ViewResolver>> viewResolversProvider, ServerCodecConfigurer serverCodecConfigurer) {
        this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);
        this.serverCodecConfigurer = serverCodecConfigurer;
    }

    //初始化一个限流的过滤器
    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public GlobalFilter sentinelGatewayFilter() {
        return new SentinelGatewayFilter();
    }

    //配置初始化的限流参数
    @PostConstruct
    public void initGatewayRules() {
        Set<GatewayFlowRule> rules = new HashSet<>();
        rules.add(new GatewayFlowRule("shop-product")//资源名称,对应路由id
                        .setCount(1)//限流阀值
                        .setIntervalSec(1)//统计时间窗口,单位是秒,默认是1秒
        );
        GatewayRuleManager.loadRules(rules);
    }


    //配置限流异常处理器
    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() {
        return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);
    }

    //自定义限流异常页面
    @PostConstruct
    public void initBlockHandlers() {
        BlockRequestHandler blockRequestHandler = new BlockRequestHandler() {
            @Override
            public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
                Map map= new HashMap<>();
                map.put("code", 0);
                map.put("message", "接口被限流了");
                return ServerResponse
                        .status(HttpStatus.OK)
                        .contentType(MediaType.APPLICATION_JSON_UTF8)
                        .body(BodyInserters.fromObject(map));
            }
        } ;
        GatewayCallbackManager.setBlockHandler(blockRequestHandler);
    }
}

其中,GatewayFlowRule 网关限流规则中提供了如下属性:

  • resource:资源名称,可以是网关中的route名称或者用户自定义的API分组名称。
  • resourceMode:资源模型,限流规则是针对API Gateway的 route (RESOURCE_MODE_ROUTE_ID)还是用户在Sentinel 中定义的API分组(RESOURCE_MODE_CUSTOM_API_NAME),默认route。
  • grade:限流指标维度,同限流规则的 grade 字段。
  • count:限流阈值。
  • intervalSec:统计时间窗口,单位是秒, 默认是1 秒。
  • controlBehavior:流量整形的控制效果,同限流规则的controlBehavior字段,目前支持快速失败和匀速排队两种模式,默认快速失败。
  • burst:应对突发请求时额外允许的请求数目。
  • maxQueueingTimeoutMs:匀速排队模式下的最长排队时间,单位是毫秒,仅在匀速排队模式下生效。
  • paramItem:参数限流配置。若不提供,则代表针对参数进行限流,该网关规则将会被转换成普通流控规则;否则会转换热点规则。其中的字段如下:
    • arseStrategy: 从请求中提取参数的策略,目前支持提取来源IP(PARAM_PARSE_STRATEGY_CLIENT_IP)、Host(PARAM_PARSE_STRATEGY_HOST)、任意Header(PARAM_PARSE_STRATEGY_HEADER)和任意URL 参数(PARAM_PARSE_STRATEGY_URL_PARAM)四种模式。
    • fieldName:若提取策略选择Header模式或者URL参数模式,则需要指定对应的Header名称或URL参数名称。
    • pattern和matchStrategy: 为后续参数匹配特性预留,目前末实现。

测试

在一秒钟内多次访问http://localhost:7000/product/product/1?token=1232就可以看到限流启作用了。

在这里插入图片描述

自定义API分组

自定义API分组是一种更细粒度的限流规则定义

//配置初始化的限流参数
@PostConstruct
public void initGatewayRules() {
    Set<GatewayFlowRule> rules = new HashSet<>();
    rules.add(new GatewayFlowRule("shop_product_api").setCount(1).setIntervalSec(1));
    rules.add(new GatewayFlowRule("shop_order_api").setCount(1).setIntervalSec(1));
    GatewayRuleManager.loadRules(rules);
}

//自定义API分组
@PostConstruct
private void initCustomizedApis(){
    Set<ApiDefinition> definitions = new HashSet<>();
    //定义小组1
    ApiDefinition api1 = new ApiDefinition("shop_product_api")
            .setPredicateItems(new HashSet<ApiPredicateItem>(){{
                //以/product/product/api1开头的请求
                add(new ApiPathPredicateItem().setPattern("/product/product/**")
                        .setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_PREFIX));
            }});
    //定义小组2
    ApiDefinition api2 = new ApiDefinition("shop_order_api")
            .setPredicateItems(new HashSet<ApiPredicateItem>(){{
                //完全匹配/order/order2/message
                add(new ApiPathPredicateItem().setPattern("/order/order2/message"));
            }});
    definitions.add(api1);
    definitions.add(api2);
    GatewayApiDefinitionManager.loadApiDefinitions(definitions);
}

在一秒钟内多次访问http://localhost:7000/product/product/1?token=1232也可以看到限流启作用了。
在这里插入图片描述

总结

到这儿,Gateway 服务网关限流的内容就已经介绍完了。下一篇将为大家带来链路追踪Sleuth相关的文章,敬请期待吧!

后续的文章,我们将继续完善我们的微服务系统,集成更多的Alibaba组件。想要了解更多JAVA后端知识,请点击文末名片与我交流吧。留下您的一键三连,让我们在这个寒冷的东西互相温暖吧!

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

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

相关文章

网络程序通信的流程---socket与TCP的简单认识

网络程序通信的流程 网络程序通信的流程&#xff1a; 1.通过ip地址找到网络中的设备 2.通过端口号找到对应进程的端口 3.传输数据时还需要使用传输协议&#xff08;TCP&#xff09;&#xff0c;保证数据的可靠性 4.socket完成进程之间网络数据的传输 ip地址的介绍 IP地址…

知识库的创建(5) - FaissKBService

文章目录 前言一、追踪代码二、源码分析三、详解kb_faiss_pool类的load_vector_store1. 方法定义2. 方法实现3. 优点4. 再看看self.new_vector_store 总结 前言 上一篇文章&#xff0c;我们追到了这里&#xff0c;了解了kb是通过KBServiceFactory产生的一个对象&#xff0c;而…

计算机网络-BGP路由优选原则八

一、优选到Next_Hop的IGP度量值最小的路由。 查看BGP路由详细信息&#xff1a; [AR1]dis bgp routing-table 192.168.1.0BGP local router ID : 1.1.1.1Local AS number : 100Paths: 2 available, 1 best, 1 selectBGP routing table entry information of 192.168.1.0/24:Fr…

ADOP带你了解:数据中心的高速互联解决方案

随着大语言模型和AIGC的飞速发展&#xff0c;数据中心对于高速、高可靠性的网络连接需求日益增长。ADOP系列产品正是在这样的背景下应运而生&#xff0c;为现代数据中心提供了全面的连接解决方案。 ADOP系列产品概览 ADOP系列产品旨在为云、高性能计算、Web 2.0、企业、电信、…

Python | Leetcode Python题解之第167题两数之和II-输入有序数组

题目&#xff1a; 题解&#xff1a; class Solution:def twoSum(self, numbers: List[int], target: int) -> List[int]:low, high 0, len(numbers) - 1while low < high:total numbers[low] numbers[high]if total target:return [low 1, high 1]elif total <…

吴恩达机器学习 第二课 week4 决策树

目录 01 学习目标 02 实现工具 03 问题描述 04 构建决策树 05 总结 01 学习目标 &#xff08;1&#xff09;理解“熵”、“交叉熵&#xff08;信息增益&#xff09;”的概念 &#xff08;2&#xff09;掌握决策树的构建步骤与要点 02 实现工具 &#xff08;1&#xff09;…

格式化数据恢复,4个方法,恢复文件好帮手

“由于电脑病毒的原因&#xff0c;我不得已将磁盘格式化了&#xff0c;不知道大家有没有方法恢复格式化的数据呢&#xff1f;” 在数字时代的浪潮中&#xff0c;我们每个人的生活都如同被数据编织成的一幅幅绚丽画卷。然而&#xff0c;有时这幅画卷可能会因为一次意外的格式化操…

【科研基础】通感一体化讲座

通信和感知在硬件结构上相似&#xff0c;高效地利用资源&#xff0c;实现相互的增益&#xff1b; 感知是基于不同的任务&#xff0c;比如

Python联动Mysql

首先配置pip源(不然在安装库的时候会很慢!!!) pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/安装必要库: mysql.connector MySQL 连接器/ODBC 是 MySQL ODBC 驱动程序&#xff08;以前称为 MyODBC 驱动程序&#xff09;系列的名称&#xff0c;它使…

计算机网络:运输层 - TCP 流量控制 拥塞控制

计算机网络&#xff1a;运输层 - TCP 流量控制 & 拥塞控制 滑动窗口流量控制拥塞控制慢开始算法拥塞避免算法快重传算法快恢复算法 滑动窗口 如图所示&#xff1a; 在TCP首部中有一个窗口字段&#xff0c;该字段就基于滑动窗口来辅助流量控制和拥塞控制。所以我们先讲解滑…

kotlin集合框架

1、集合框架的接口类型对比 2、不可变和可变List fun main() {// 不可变List - 不能删除或添加元素val intList: List<Int> listOf(1,2,3)intList.forEach{println(it) // 1 2 3}println("")// 可变List - 可以删除或添加元素val mutableList mutableListO…

为什么要学Java?

想要自己教会自己java&#xff0c;从小白成长到架构师。实现硬实力就业&#xff01; 因为Java是全球排名第一的编程语言&#xff0c;Java工程师也是市场需求最大的软件工程师&#xff0c;选择Java&#xff0c;就是选择了高薪。 为什么Java应用最广泛&#xff1f; 从互联网到…

[Linux] 文件系统

UNIX操作系统将文件组织成一个有层次的树形结构&#xff1a; 标准目录&#xff1a; 根目录&#xff1a; /tmp目录 主目录&#xff1a; 这就是主目录 一般与系统有关的信息都存放在etc目录下 注意&#xff1a; /etc/passwd存放的是用户账户信息&#xff0c;不是密码信息&#xf…

适用于所有 Android 手机的 8 大 Android 解锁工具

有时您无法解锁手机&#xff0c;因为您忘记了密码或设备停止响应解锁图案。不要惊慌。我们在这里为您列出了最好的 Android 解锁工具。只需选择一个您喜欢的。 为了保护重要数据&#xff0c;许多手机用户倾向于使用图案锁、密码、指纹甚至面部识别来锁定设备。但有时&#xff…

抉择与未来:高考后专业与学校的深度选择思考

引言 随着2024年高考的尘埃落定&#xff0c;数百万考生及其家庭正面临一个至关重要的决策&#xff1a;在有限的分数条件下&#xff0c;是优先选择专业还是学校&#xff1f;这一选择不仅影响着个人的未来职业道路&#xff0c;也关系到大学生活的质量和个人综合素质的培养。本文将…

Mysten Labs宣布推出Walrus:一种去中心化存储和数据可用性协议

Walrus是为区块链应用和自主代理提供的创新去中心化存储网络。Walrus存储系统今天以开发者预览版的形式发布&#xff0c;面向Sui开发者征求反馈意见&#xff0c;并预计很快会向其他Web3社区广泛推广。 通过采用纠删编码创新技术&#xff0c;Walrus能够快速且稳健地将非结构化数…

功能测试 之 单模块测试----添加会员

1.需求分析 点击【添加会员】按钮后&#xff0c;页面跳转至添加会员详细页面。 说明&#xff1a; 会员昵称&#xff1a;必填&#xff0c;长度在20个字符&#xff08;除去空格&#xff09;以内&#xff0c;&#xff08;会员昵称&#xff09;可以重复&#xff1b;登录密码&#x…

Druid未授权访问漏洞修复

前言 安全组针对系统漏扫发现系统存在Druid未授权访问&#xff0c;会引发泄露系统敏感信息&#xff0c;漏洞链接为ip:端口/druid/index.html&#xff0c;可以清楚的查看数据库的相关连接信息&#xff0c;如下图所示&#xff1a; 漏洞修复 1、关闭Druid监控页面 在Druid的配…

【Linux】基础IO_1

文章目录 六、基础IO1. C语言的文件接口2. 系统文件I/O 未完待续 六、基础IO 1. C语言的文件接口 我们知道 文件 文件内容 文件属性 。即使是一个空文件&#xff0c;仍然会在磁盘中占据空间。那打开文件是什么意思呢&#xff1f;其实文件打开的意思就是&#xff1a;将文件从…