只需三步实现Gateway结合Sentinel实现无侵入网关限流,注意避坑!

news2024/11/24 17:37:13

前言:本文基于您已有基础的可运行的微服务系统,使用了Sping Cloud Alibaba,Gateway,Nacos等;目标实现网关流控类型的限流。

顾名思义限流用于在高并发场景下限制请求流量的进入,保护系统不被冲垮。阿里巴巴的开源sentinel可以通过设置不同种类规则实现对不同的资源的保护。

  • 资源:可以是任何东西;服务,方法,代码...
  • 规则:流控规则、熔断降级规则、系统保护规则、热点规则、网关API分组规则、网关流控规则

本文使用的各版本对应关系如下(官方链接:版本对应关系)

<spring.boot>2.6.7</spring.boot>
<spring-cloud>2021.0.2</spring-cloud>
<spring-cloud-alibaba>2021.0.4.0</spring-cloud-alibaba>

本文目标

  • 微服务整合sentinel
  • 使用sentinel客户端生成网关限流规则,并持久化到nacos中
  • 规则生效,产生限流效果

三步走战略


1.整合sentinel

1.1.服务端整合

1.1.1.引入pom

<!--网关组件-->
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<!--sentinel限流-->
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

<!-- SpringCloud Ailibaba Sentinel Gateway -->
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>

<!-- 通过nacos持久化流控规则 -->
<dependency>
   <groupId>com.alibaba.csp</groupId>
   <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

配置Sentinel Starter,必须有spring-cloud-alibaba-sentinel-gateway,spring-cloud-starter-gateway 依赖来让 spring-cloud-alibaba-sentinel-gateway 模块里的 Spring Cloud Gateway 自动化配置类生效。

避坑点1:通过Spring Cloud Alibaba接入sentinel需要将spring.cloud.sentinel.filter.enabled 配置项置为 false(网关流控默认粒度为route和自定义API分组维度,不支持URL粒度)

避坑点2:通过Spring Cloud Alibaba Sentinel 数据源模块,网关流控规则数据源类型是 gw-flow而不是flow

1.1.2.编写规则配置文件

在gatewaymodule中新建application-sentinel.yaml文件

配置规则

spring:
  cloud:
    sentinel:
      enabled: true
      datasource:
        ds1:
          nacos:
            server-addr: ${spring.cloud.nacos.config.server-addr}
            namespace: ${spring.cloud.nacos.config.namespace}
            data-id: ${spring.application.name}-gateway-flow-rules
            group-Id: SENTINEL_GROUP
            rule-type: gw-flow
            data-type: json
        ds2:
          nacos:
            server-addr: ${spring.cloud.nacos.config.server-addr}
            namespace: ${spring.cloud.nacos.config.namespace}
            data-id: ${spring.application.name}-gateway-api-rules
            group-Id: SENTINEL_GROUP
            rule-type: gw-api-group
            data-type: json
          ds3:
            nacos:
              server-addr: ${spring.cloud.nacos.config.server-addr}
              namespace: ${spring.cloud.nacos.config.namespace}
              data-id: ${spring.application.name}-degrade-rules
              group-Id: SENTINEL_GROUP
              rule-type: degrade
              data-type: json
          ds4:
            nacos:
              server-addr: ${spring.cloud.nacos.config.server-addr}
              namespace: ${spring.cloud.nacos.config.namespace}
              data-id: ${spring.application.name}-system-rules
              group-Id: SENTINEL_GROUP
              rule-type: system
              data-type: json
      log:
        dir: /home/omo/sentinel/logs
        # 启用向sentinel发送心跳
      eager: true
      scg:
        fallback:
          response-status: 429
          mode: response
          response-body: '{"code": 429,"message": "前方拥堵,请稍后再试!"}'

1.sentinel dashboard默认会以spring.application.name开头生成规则,ds1、ds2为本次测试的类型

2.data-type为读取数据类型,此处设置为json

3.最后的fallback配置了被限流后的自定义响应

1.1.3.配置通信端口

服务和sentinel dashboard之间通信端口配置

spring:
  cloud:
    sentinel:
      transport:
        # sentinel控制台地址
        dashboard: localhost:8081
        # 跟sentinel控制台交流的端口,随意指定一个未使用的端口即可,默认是8719
        port: 8719
        # Get heartbeat client local ip
        clientIp: 127.0.0.1

1.2.sentinel dashboard整合

Sentinel 1.6.3 引入了网关流控控制台的支持,可以直接在 Sentinel 控制台上查看 API Gateway 实时的 route 和自定义 API 分组监控,管理网关规则和 API 分组配置

首先需要下载控制台工程代码,自行修改编译。也可以使用我改造后的工程,开箱即用:sentinel-dashboard-1.8.6,改造后的工程支持多种规则配置管理、规则推送(推送到nacos)

启动前配置nacos地址和命名空间(application.properties)

启动参数配置(IDEA)

-Dserver.port=8081 -Dcsp.sentinel.dashboard.server=localhost:8081 -Dproject.name=sentinel-dashboard

启动后效果

2.push模式规则持久化

push模式流程

(下载sentinel dashboard官方版本时需要自行实现,懒人可直接使用上面我提供的改造后版本)

下面列出核心修改点

2.1.修改nacosConfig类

@Bean
public ConfigService nacosConfigService() throws Exception {
    Properties properties = new Properties();
    //nacos地址
    properties.put(PropertyKeyConst.SERVER_ADDR, nacosAddr);
    //namespace为空即为public
    properties.put(PropertyKeyConst.NAMESPACE, namespace);
    return ConfigFactory.createConfigService(properties);
}

以及对应规则类型的provider和publisher,以GatewayFlowRule举例:

2.2.修改发布规则实现(publisher)

@Component("gatewayFlowRuleNacosPublisher")
public class GatewayFlowRuleNacosPublisher implements DynamicRulePublisher<List<GatewayFlowRuleEntity>> {

    @Autowired
    private ConfigService configService;

    @Autowired
    private Converter<List<GatewayFlowRuleEntity>, String> converter;

    @Override
    public void publish(String app, List<GatewayFlowRuleEntity> rules) throws Exception {
        AssertUtil.notEmpty(app, "app name cannot be empty");
        if (rules == null) {
            return;
        }
        configService.publishConfig(app + NacosConfigUtil.GATEWAY_FLOW_DATA_ID_POSTFIX,
                NacosConfigUtil.GROUP_ID, converter.convert(rules));
    }
}

2.3.修改获取规则实现(provider)

@Component("gatewayFlowRuleNacosProvider")
public class GatewayFlowRuleNacosProvider implements DynamicRuleProvider<List<GatewayFlowRuleEntity>> {
    @Autowired
    private ConfigService configService;

    @Autowired
    private Converter<String, List<GatewayFlowRuleEntity>> converter;

    @Override
    public List<GatewayFlowRuleEntity> getRules(String appName) throws Exception {
        String rules = configService.getConfig(appName + NacosConfigUtil.GATEWAY_FLOW_DATA_ID_POSTFIX,
                NacosConfigUtil.GROUP_ID, 3000);
        if (StringUtil.isEmpty(rules)) {
            return new ArrayList<>();
        }
        return converter.convert(rules);
    }
}

2.4.修改对应接口

(GatewayFlowRuleController中)

引入

@Autowired
@Qualifier("gatewayFlowRuleNacosProvider")
private DynamicRuleProvider<List<GatewayFlowRuleEntity>> ruleProvider;

@Autowired
@Qualifier("gatewayFlowRuleNacosPublisher")
private DynamicRulePublisher<List<GatewayFlowRuleEntity>> rulePublisher;

再修改增删改查方法中的实现,具体细节参考:sentinel-dashboard-1.8.6

3.配置规则,测试限流效果

3.1 启动sentinel dashboard

启动步骤见上面阐述

3.2 配置网关限流规则

3.2.1 配置Route类型规则

针对user服务(为你的网关路由配置中的id)配置了QPS=5,流控方式为快速失败的规则

到nacos后台查看规则详情,已同步到nacos

同样在nacos中修改,dashboard也会同步更新,不再演示。 (规则属性含义参考:限流字段)

3.2.2.配置API分组类型规则

先配置API分组

再配置规则(下拉选择刚才配置的分组,同样设置QPS=5)

3.3 测试限流效果

3.3.1.Route类型限流

设置测试用例 设置循环10次

测试结果5次成功5次失败,符合预期,大功告成!

3.3.2.API分组限流

可以看到测试报告中对/auth/oms/** 的路径匹配到了且限流可以生效

4.扩展

  • 网关流控原理,详见官网

  • 在使用SpringCloud Gateway和SpringCloud Sentinel时,官方不支持针对4xx,5xx响应码做异常统计熔断,可以自行实现,可参考issue1842 issue2537

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

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

相关文章

数据库慢查询优化

数据库慢查询优化 1.分析慢查询原因 分析导致慢查询的原因是数据库性能优化的关键步骤之一。下面是一些常见的方法和工具&#xff0c;可以帮助你确定慢查询的原因&#xff1a; 慢查询日志&#xff1a; 开启慢查询日志&#xff0c;允许数据库记录执行时间超过阈值的查询语句。…

百度ERNIE 3.0——中文情感分析实战

目录 前言一、百度ERNIE 3.0二、使用ERNIE 3.0中文预训练模型进行句子级别的情感分析2-1、环境2-2、数据集加载2-3、加载预训练模型和分词器2-4、基于预训练模型的数据处理2-5、数据训练和评估2-6、模型验证2-7、情感分析结果的预测以及保存 三、自定义个人案例3-1、如何自定义…

数据库语句

文章目录 数据库语句SQL语言分类MySQL中6种常见的约束1.DDL1.1 创建新的数据库1.2 创建新的表1.3 删除指定的数据表 2.DML管理表2.1 插入数据2.2 修改&#xff08;更新数据&#xff09;2.3 在数据表中删除指定的数据 3.DQL查询数据记录4.DCL4.1 修改表名和表结构4.2 扩展表结构…

Node.js详解(四):连接MongoDB

文章目录 一、安装MongoDB访问驱动二、连接数据库三、添加数据四、添加多条数据五、修改数据六、查询数据1、查询单条记录2、查询多条记录 七、删除数据八、完整示例代码1、路由 Api 接口&#xff1a;2、运行结果&#xff1a; MongoDB 对许多平台都提供驱动可以访问数据库&…

前端vue入门(纯代码)31_route-link的repalce属性

如果夜里十二点我还回你消息&#xff0c;那么意味着什么&#xff0c;意味着我是真的很喜欢玩手机。 【29.Vue Router--router-link的replace属性】 <router-link>的replace属性 replace属性的作用是&#xff1a;控制路由跳转时操作浏览器历史记录的模式。【当我们从一个…

城市内涝监测设备-内涝监测终端

随着我国城市化发展迅速、全球极端天气现象频发带来的暴雨天气增多&#xff0c;汛期暴雨引发道路低洼处、立交桥底、隧道、涵洞等城市 内涝时有发生&#xff0c;甚至开启城市看海模式&#xff0c;对交通、电力、通讯等造成了严重的影响和破坏&#xff0c;严重时造成人民生命、财…

放弃使用Merge,开心拥抱Rebase!

1. 引言 大家好&#xff0c;我是比特桃。Git 作为现在最流行的版本管理工具&#xff0c;想必大家在开发过程中都会使用。由于 Git 中很多操作默认是采用 Merge 进行的&#xff0c;并且相对也不容易出错&#xff0c;所以很多人都会使用 Merge 来进行合并代码。但Rebase 作为 Gi…

官宣!菁英实习生计划启动,百度大模型团队诚邀你的加入

大模型风起&#xff0c;人才需求涌 在这个充满变革的时代&#xff0c;我们见证了AI的快速发展。从“阿尔法狗”击败世界围棋冠军&#xff0c;到生成式大模型以势不可挡的浪潮席卷全球&#xff0c;掀起人类社会一场眩晕式变革。新技术、新工具、新的生产力正在改变经济活动各环…

小红书运营推广

大家好&#xff0c;我是权知星球&#xff0c;今天给大家分享一下小红手运营推广的一些经验&#xff0c;希望能给大家运营小红书带来一些帮助。 这篇文章虽然是基于小红书的运营写的&#xff0c;但新媒体的东西都是相通的&#xff0c;相信这篇文章对运营其他媒体的同学也会有所…

抓包工具Fiddler:fiddler的介绍及安装

Fiddler简介 Fiddler是比较好用的web代理调试工具之一&#xff0c;它能记录并检查所有客户端与服务端的HTTP/HTTPS请求&#xff0c;能够设置断点&#xff0c;篡改及伪造Request/Response的数据&#xff0c;修改hosts&#xff0c;限制网速&#xff0c;http请求性能统计&#xff…

MyBatis源码分析_Executor组件及3个火枪手(6)

目录 1. 前提 2. Executor执行器 3. 总结 4. 三个火枪手 5. StatementHandler生成Statement 6. ParameterHandler 参数解析 7. BoundSql的数据结构 8. 总结 1. 前提 在Mybatis源码分析_事务管理器 &#xff08;5&#xff09;_chen_yao_kerr的博客-CSDN博客一文中&…

网关微服务简单配置

导入一下网关的基本依赖 <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>com.alibaba.cloud<…

直播商城系统源码的威力:开启直播购物新时代

随着科技的不断进步和人们对互动性购物体验的追求&#xff0c;直播购物正成为电商行业的热门趋势。直播商城系统源码的威力在这一潮流中愈发显现&#xff0c;为商家和消费者提供了无限的机会和便利。 下面是一个简单的示例&#xff0c;展示了如何利用直播商城系统源码创建一个…

深度强化学习:深度解析 MADDPG

深度强化学习:深度解析 MADDPG 学习强化学习,码代码的能力必须要出众,要快速入门强化学习 搞清楚其中真正的原理,读源码是一个最简单的最直接的方式。最近创建了一系列该类型文章,希望对大家有多帮助。 另外,我会将所有的文章及所做的一些简单项目,放在 1.MADDPG 原理…

JS脚本 - 批量给所有指定标签追加Class属性

JS脚本 - 批量给所有指定标签追加Class属性 前言一. 脚本二. 测试运行 前言 公司里我们有个应用引入了UBT埋点&#xff0c;记录了页面上所有的点击操作以及对应的点击按钮。但是我们看下来发现&#xff0c;我们需要给每个按钮加一个唯一标识做区分&#xff0c;并且这个ID是给U…

选读SQL经典实例笔记07_日期处理(下)

1. 一个季度的开始日期和结束日期 1.1. 以yyyyq格式&#xff08;前面4位是年份&#xff0c;最后1位是季度序号&#xff09;给出了年份和季度序号 1.2. DB2 1.2.1. sql select (q_end-2 month) q_start,(q_end1 month)-1 day q_endfrom (select date(substr(cast(yrq as c…

Linux系统编程(信号处理 sigacation函数和sigqueue函数 )

文章目录 前言一、sigaction二、sigqueue函数三、代码示例总结 前言 本篇文章我们来介绍一下sigacation函数和sigqueue函数。 一、sigaction sigaction 是一个用于设置和检查信号处理程序的函数。它允许我们指定信号的处理方式&#xff0c;包括指定一个函数作为信号处理程序…

AsyncImage, BackgroundMaterials, TextSelection, ButtonStyles 的使用

1. AsyncImage 异步加载图片 1.1 实现 /*case empty -> No image is loaded.case success(Image) -> An image succesfully loaded.case failure(Error) -> An image failed to load with an error.*/ /// iOS 15 开始的 API 新特性示例 /// 异步加载图片 struct As…

Ae 效果:CC Plastic

风格化/CC Plastic Stylize/CC Plastic CC Plastic&#xff08;CC 塑料&#xff09;效果用于创建具有塑料质感的图像或视频效果&#xff0c;它模拟了塑料材质的外观特性&#xff0c;包括光照反射、表面凹凸以及光泽效果等。 ◆ ◆ ◆ 效果属性说明 Surface Bump 表面凹凸 通过…

IoT 场景下 TDengine 与老牌时序数据库怎么选?看看这份TSBS报告

上周一&#xff0c;TDengine 正式发布了 IoT 场景下基于 TSBS 的时序数据库&#xff08;Time Series Database&#xff0c;TSDB&#xff09;性能基准测试报告。该报告模拟虚拟货运公司车队中一组卡车的时序数据&#xff0c;预设了五种卡车规模场景&#xff0c;在相同的 AWS 云环…