【RuoYi-Cloud项目研究】【ruoyi-gateway模块】Spring Gatewaye和Sentinel实现网关流控

文章目录

  • [1. RuoYi 实现了对服务的限流](#1. RuoYi 实现了对服务的限流)
  • [2. 网关与普通服务的限流区别](#2. 网关与普通服务的限流区别)
    • [2.1. 引入的组件有差别](#2.1. 引入的组件有差别)
    • [2.2. 配置文件有差别](#2.2. 配置文件有差别)
  • [3. 注意事项](#3. 注意事项)

备注:

1、RuoYi 网关默认只在 nacos 配置中心的 Sentinel 限流配置中配置了对"服务限流",而没有详细控制到限流的 URL。

2、各个服务虽然引入了 Sentinel 相关组件但是并没有对各个具体服务做具体的 URL 限流配置;

3、如果用户需要对 URL 限流请自行在服务中配置 Sentinel dashboard 连接即可。

本文主要介绍如何用Sentinel控制网关流控,和网关服务与普通服务流控的不同点。

1. RuoYi 实现了对服务的限流

  • 在 pom.xml 引入组件
xml 复制代码
<!-- SpringCloud Alibaba Nacos -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!-- SpringCloud Alibaba Nacos Config -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

<!-- SpringCloud Alibaba Sentinel -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

<!-- SpringCloud Alibaba 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>
  • 配置 bootstrap.yml 文件
yaml 复制代码
spring:
  application:
    name: sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置Nacos地址
    sentinel:
      transport:
        dashboard: localhost:8080 #配置sentinel dashboard地址
        port: 8719
      # 把流控规则nacos配置持久化
      datasource:
        ds1:
          nacos:
            server-addr: 127.0.0.1:8848
            dataId: sentinel-ruoyi-gateway
            groupId: DEFAULT_GROUP
            data-type: json
            # 网关的流控类型才是gw-flow,普通是flow
            rule-type: gw-flow
  • sentinel-ruoyi-gateway 文件的详细内容

在 nacos 的 sentinel-ruoyi-gateway文件中,配置如如下内容,完成了对 4 个微服务的"总体流控"。

yaml 复制代码
[
    {
        "resource": "ruoyi-auth",
        "count": 500,
        "grade": 1,
        "limitApp": "default",
        "strategy": 0,
        "controlBehavior": 0
    },
	{
        "resource": "ruoyi-system",
        "count": 1000,
        "grade": 1,
        "limitApp": "default",
        "strategy": 0,
        "controlBehavior": 0
    },
	{
        "resource": "ruoyi-gen",
        "count": 200,
        "grade": 1,
        "limitApp": "default",
        "strategy": 0,
        "controlBehavior": 0
    },
	{
        "resource": "ruoyi-job",
        "count": 300,
        "grade": 1,
        "limitApp": "default",
        "strategy": 0,
        "controlBehavior": 0
    }
]

2. 网关与普通服务的限流区别

限流是网关的重要职责之一,"对网关限流"跟"服务的URL限流"并不是完全一样,主要体现在以下几个方面。

2.1. 引入的组件有差别

  • 普通需要限流服务引入的组件
xml 复制代码
<!-- SpringCloud Alibaba Nacos -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!-- SpringCloud Alibaba Nacos Config -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

<!-- SpringCloud Alibaba Sentinel -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

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

在pom.xml中添加相关依赖,这里我们使用Nacos作为注册中心,所以需要同时添加Nacos的依赖

nacos-discoverynacos-configalibaba-sentinel3 个组件。

  • 网关需要限流服务引入的组件
xml 复制代码
<!-- SpringCloud Alibaba Nacos -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!-- SpringCloud Alibaba Nacos Config -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

<!-- SpringCloud Alibaba Sentinel -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

<!-- SpringCloud Alibaba 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-gateway组件。

2.2. 配置文件有差别

下面的配置是连接 Sentinel dashboard 控制台,这个配置是一样的。

yaml 复制代码
spring:
  application:
    name: sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置Nacos地址
    sentinel:
      transport:
        dashboard: localhost:8080 #配置sentinel dashboard地址
        port: 8719
  • 普通服务的 nacos 持久化配置
yaml 复制代码
spring:
  cloud:
    sentinel:
      datasource:
        ds1:
          nacos:
            server-addr: localhost:8848
            dataId: ${spring.application.name}-sentinel
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: flow
  • 网关服务的 nacos 持久化配置
yaml 复制代码
spring:
  cloud:
    sentinel:      
      # 把流控规则nacos配置持久化
      datasource:
        ds1:
          nacos:
            server-addr: 127.0.0.1:8848
            dataId: sentinel-ruoyi-gateway
            groupId: DEFAULT_GROUP
            data-type: json
            # 网关的流控类型才是gw-flow,普通是flow
            rule-type: gw-flow

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

3. 注意事项

应该是各个服务管理自己 uri 的流控;网关总体管理各个服务的流控。

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

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

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

相关推荐
IT_102418 分钟前
springboot从零入门之接口测试!
java·开发语言·spring boot·后端·spring·lua
皮皮林5511 小时前
项目终于用上了 Spring 状态机,太优雅了!
spring
迢迢星万里灬2 小时前
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术点解析
java·spring boot·spring·mybatis·spring mvc·面试指南
Hanson Huang4 小时前
【Spring AI 1.0.0】Spring AI 1.0.0框架快速入门(2)——Prompt(提示词)
java·人工智能·spring·spring ai
.生产的驴4 小时前
SpringBoot 服务器监控 监控系统开销 获取服务器系统的信息用户信息 运行信息 保持稳定
服务器·spring boot·分布式·后端·spring·spring cloud·信息可视化
没有烦恼的猫猫6 小时前
有关Spring事务的传播机制
spring·事务
magic 2456 小时前
事务传播行为详解
spring
考虑考虑7 小时前
@MockitoBean注解使用
spring boot·后端·spring
Dkodak7 小时前
Could not initialize Logback logging from classpath:logback-spring.xml
xml·spring·logback
悟能不能悟7 小时前
Logback-spring.xml 配置屏蔽特定路径的日志
xml·java·spring