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


    备注:

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

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

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

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

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

    • 在 pom.xml 引入组件
    
    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    dependency>
    
    
    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
    dependency>
    
    
    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
    dependency>
    
    
    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-alibaba-sentinel-gatewayartifactId>
    dependency>
    
    
    <dependency>
        <groupId>com.alibaba.cspgroupId>
        <artifactId>sentinel-datasource-nacosartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 配置 bootstrap.yml 文件
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • sentinel-ruoyi-gateway 文件的详细内容

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

    [
        {
            "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
        }
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

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

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

    2.1. 引入的组件有差别

    • 普通需要限流服务引入的组件
    
    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    dependency>
    
    
    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
    dependency>
    
    
    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
    dependency>
    
    
    <dependency>
        <groupId>com.alibaba.cspgroupId>
        <artifactId>sentinel-datasource-nacosartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

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

    nacos-discoverynacos-configalibaba-sentinel3 个组件。

    • 网关需要限流服务引入的组件
    
    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    dependency>
    
    
    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
    dependency>
    
    
    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
    dependency>
    
    
    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-alibaba-sentinel-gatewayartifactId>
    dependency>
    
    
    <dependency>
        <groupId>com.alibaba.cspgroupId>
        <artifactId>sentinel-datasource-nacosartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    比普通服务的限流多了一个 sentinel-gateway组件。

    2.2. 配置文件有差别

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

    spring:
      application:
        name: sentinel-service
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848 #配置Nacos地址
        sentinel:
          transport:
            dashboard: localhost:8080 #配置sentinel dashboard地址
            port: 8719
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 普通服务的 nacos 持久化配置
    spring:
      cloud:
        sentinel:
          datasource:
            ds1:
              nacos:
                server-addr: localhost:8848
                dataId: ${spring.application.name}-sentinel
                groupId: DEFAULT_GROUP
                data-type: json
                rule-type: flow
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 网关服务的 nacos 持久化配置
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    注意点:通过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

  • 相关阅读:
    PCL 生成空间三角形面点云
    web前端框架设计第六课-样式绑定
    jmeter下载安装教程
    多角度分析!解决Android手机无法连接Wi-Fi的方法指南!
    web安全(初识)
    高客单价产品做直播难吗?如何呈现高客单价产品的直播场景?
    Hudi学习二:Hudi基本概念
    git下载其他项目到本地
    为什么MySQL默认的隔离级别是RR而大厂使用的是RC?
    离线安装腾讯x5内核(附安装包下载地址)
  • 原文地址:https://blog.csdn.net/yuchangyuan5237/article/details/133699228