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

这篇具有很好参考价值的文章主要介绍了只需三步实现Gateway结合Sentinel实现无侵入网关限流,注意避坑!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:本文基于您已有基础的可运行的微服务系统,使用了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)

gateway sentinel,java,网关,编程

启动参数配置(IDEA)

gateway sentinel,java,网关,编程

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

gateway sentinel,java,网关,编程

启动后效果

gateway sentinel,java,网关,编程

2.push模式规则持久化

push模式流程

gateway sentinel,java,网关,编程

(下载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,流控方式为快速失败的规则

gateway sentinel,java,网关,编程

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

gateway sentinel,java,网关,编程

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

3.2.2.配置API分组类型规则

先配置API分组

gateway sentinel,java,网关,编程

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

gateway sentinel,java,网关,编程

3.3 测试限流效果

3.3.1.Route类型限流

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

gateway sentinel,java,网关,编程

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

gateway sentinel,java,网关,编程

3.3.2.API分组限流

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

gateway sentinel,java,网关,编程

4.扩展

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

gateway sentinel,java,网关,编程文章来源地址https://www.toymoban.com/news/detail-714239.html

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

到了这里,关于只需三步实现Gateway结合Sentinel实现无侵入网关限流,注意避坑!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringCloud之Gateway整合Sentinel服务降级和限流

    1.下载Sentinel.jar可以图形界面配置限流和降级规则 地址:可能需要翻墙 下载jar文件 2.引入maven依赖 3.写个自动注入Resource的过滤器类(可以不写注解直接使用) 4.写配置文件 application.properties 5.cmd命令行启动jar文件访问localhost:18080页面,自己设置QPS java -jar -server.port=18080 sentinel-dash

    2024年02月07日
    浏览(42)
  • SpringCloud Alibaba Sentinel 与 SpringCloud Gateway 的限流有什么差别?(三种限流算法原理分析)

    目录 一、Sentinel 与 Gateway 的限流有什么差别? 1.1、前置知识 - 四种常见的限流算法 1.1.1、Tips 1.1.2、计数器算法 1)固定窗口计数器算法 2)滑动窗口计数器算法 1.1.3、令牌桶算法 1.1.4、漏桶算法 1.2、解决问题 1.1.1、Tips 限流, 就是指对服务器请求量做限制,避免因为突发的

    2024年01月25日
    浏览(46)
  • 只需三步,完美卸载Docker

    背景:因为网络安全问题,Docker存在重大安全漏洞,安全组要求卸载Docker,下面就分享卸载额步骤。 1,删除docker所在目录 rm -rf /etc/docker rm -rf /run/docker rm -rf /var/lib/dockershim rm -rf /var/lib/docker 2,Kill掉Docker进程 ps -ef|grep docker kill -9 pid 3,卸载docker相关包 查看相关包 yum list inst

    2024年02月02日
    浏览(31)
  • Spring Alibaba Sentinel实现集群限流demo

    1.什么是单机限流? 小伙伴们或许遇到过下图这样的限流配置 又或者是这样的Nacos动态配置限流规则:  以上这些是什么限流?没错,就是单机限流,那么单机限流有什么弊端呢? 假设我们集群部署3台机器(NodeA/NodeB/NodeC),在某时刻,同时有25个请求进来,假设NodeA收到1

    2024年02月15日
    浏览(43)
  • 【SpringCloud Alibaba】(六)使用 Sentinel 实现服务限流与容错

    今天,我们就使用 Sentinel 实现接口的限流,并使用 Feign 整合 Sentinel 实现服务容错的功能,让我们体验下微服务使用了服务容错功能的效果。 因为内容仅仅围绕着 SpringCloud Alibaba技术栈展开,所以,这里我们使用的服务容错组件是阿里开源的 Sentinel。 当然,能够实现服务容错

    2024年02月14日
    浏览(46)
  • java agent 实战 监控Elasticsearch(只需依赖一个jar 完全无侵入式)解决jar启动问题

    agent是什么大家应该很熟悉了,今天我们来实战下,效果就是为项目所有elasticsearch请求方法增加耗时告警! 学会Java Agent你能做什么? 自动添加getter/setter方法的工具lombok就使用了这一技术 btrace、Arthas和housemd等动态诊断工具也是用了instrument技术 Intellij idea 的 HotSwap、Jrebel 等也

    2024年02月16日
    浏览(38)
  • 只需三步,教你搭建一个进销存管理系统!

    如果你常常面临: 进销存软件功能不全、功能冗余、价格昂贵,性价比不高的情况—— 可以考虑使用【零代码搭建】了! 在简道云可以根据自身需求快速搭建出进销存管理系统。相比较其他标准进销存软件,用简道云搭建进销存具备以下优势: 功能灵活: 可以对进销存模

    2024年02月06日
    浏览(75)
  • (只需三步)如何用chatgpt自动生成思维导图

    目录 chatgpt是可以生成思维导图的!只需三步,非常简单!         第一步:打开chatgpt,告诉它主题         第二步,完善思维导图         第三步:查看思维导图的效果  先给大家看看生成效果: 上图就是由chatgpt生成的思维导图, 是不是很清晰好看哈哈哈 接下

    2024年02月05日
    浏览(49)
  • 只需三步,本地打造自己的AI个人专属知识库

    本文会手把手教你如何部署本地大模型以及搭建个人知识库,使用到的工具和软件有 Ollama Open WebUI Docker AnythingLLM 本文主要分享三点 如何用Ollama在本地运行大模型 使用现代Web UI和本地大模型\\\"聊天\\\" 如何打造完全本地化的知识库:Local RAG 读完本文,你会学习到 如何使用最好用

    2024年04月27日
    浏览(38)
  • 聊一聊服务治理三板斧:限流、熔断、降级和go-sentinel的实现

    我们知道,对于一个项目之初,我们不可能上来就按几千的并发去配置,为什么?两个方面,第一个是成本高。第二个是维护难度大。即便是天猫淘宝这种,也是采用的动态扩容的方式来应对双十一。那么一个项目如何应对突然的高并发,我们有哪些常用的措施和处理呢?我

    2024年01月19日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包