SpringCloud Gateway整合sentinel+nacos

解决:如何通过在网关配置sentinel,可以针对不同的服务实现不同的限流规则(粗粒度),同时针对服务中的个别接口单独做限流处理。最后把配置sentinel配置信息放到nacos,实现持久化的动态配置。

1、添加依赖。修改pom.xml

<dependencies>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
  </dependency>
  <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
  </dependency>
  <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  </dependency>
  <dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
  </dependency>
  <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  </dependency>
  <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  </dependency>
</dependencies>

2、修改application.yml

server:
  port: 4000
spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
#          - id: order-route
#            uri: lb://cloud-consumer-order
#            predicates:
#              - Path=/api/order/**
#              - After=2021-02-28T18:22:13.426+08:00[Asia/Shanghai]   #该时间后网关才会对该order请求进行转发
          - id: user-route
            uri: lb://cloud-provider-user
            predicates:
              - Path=/api/user/**
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848
    sentinel:
      transport:
        port: 8719
        dashboard: localhost:8080
      datasource:
#        dsl.file:     #通过本地文件方式。基于服务级别的配置
#            file: classpath:gw-flow.json
#            ruleType: gw-flow
#        ds2.file:	    #通过本地文件方式。细粒度对指定api进行配置
#            file: classpath:gw-api-group.json
#            ruleType: gw-api-group
         ds1:		
          nacos:			#通过nacos实现动态配置
            server-addr: localhost:8848
            data-id: gw-flow
            group-id: JXF_GROUP
            data-type: json
            rule-type: gw-flow  #gw-flow网关流控规则。用于定义服务或者自定义api组 的具体流控规则
         ds2:
          nacos:
            server-addr: localhost:8848
            data-id: gw-api-group
            group-id: JXF_GROUP
            data-type: json
            rule-type: gw-api-group	#对上面服务中个别接口做单独指定流控规则,那么就可以使用自定义api组。先声明 一个一个的资源,每个资源可以匹配多个接口,每个资源对应一个appName,appName就是资源。注:gw-api-group只是声明一个个的资源,不参与指定具体的网关流控规则。网关流控规则是由rule-type: gw-flow 来指定。

management:
  endpoints:
    web:
      exposure:
        include: "*"

3.1、本地文件配置sentinel方式(可选,不推荐)。(不够灵活,上面被注释掉的dsl.file方式)

在这里插入图片描述
注1:参数看不懂没关系,这里知道啥意思就行了,继续往下看。后面教你怎么弄。

注2:下面的json文件为了让大家看得懂,我添加了#符号来代表注释。而josn文件是不允许你添加注释的,如果你拷贝了json文件中的内容,记得把#以及后面的注释给去掉。

gw-api-group.json(自定义网关api组的方式)
这里只定义资源,不做具体的网关限流配置

[
  {
    "apiName": "myCustomApiFlow",  #资源名称
    "predicateItems": [
      {  
        "pattern": "/api/user/gw/group/exactMacth"   #默认是精确匹配方式
      },
      {
        "pattern": "/api/user/gw/group/fuzzy/**",
        "matchStrategy": 1   #模糊匹配方式
      }

    ]
  }
]

gw-flow.json
这里做网关限流配置。配置的目标对象可以是某个服务(粗粒度),也可以是我们上边编写的自定义网关api组(资源)。

[
  {
    "resource": "user-route",  #这里有两种选择。第一种是基于整个服务来处理,用application.yml中定义的route-id名称来表示。第二种是针对 自定义网关组,用appName的值来代表。
    "resourceMode": 0,  #0是网关限流模式 ,1是自定义网关api组的方式
    "count": 5, 	#只能执行5"intervalSec": 10  #周期是10s。结合上面就是每10s只能执行5},
  {
    "resource": "myCustomApiFlow", #和上面文件中apiName的名字要对应上
    "resourceMode": 1,	#1是自定义网关api组的方式
    "count": 1, 	#只能执行1"intervalSec": 10  #即10s内只能只能执行1次。
  }
]

所以结合上面的意思就是:
localhost:4000/api/user开头的请求 所在的服务 10s内只能处理5个请求。
但是个别请求比较特殊,localhost:4000/api/user/gw/group/exactMacth 和 /api/user/gw/group/fuzzy开头的请求10s内最多只能处理请求1次。

注意:上面的10s只能处理5个请求,是对于服务来说。不是每个接口10s只能处理5个请求。
例1、10s内,localhost:4000/api/user/1执行了3次,那么localhost:4000/api/user/2就只能执行2次,执行第三次的时候就会出现限流了,因为3+3=6>5了

例2、10s内访问localhost:4000/api/user/gw/group/fuzzy 1次,再次访问的时候就会出现限流,此时再去执行localhost:4000/api/user/1,那么最多只能执行5-1=4次。5是指服务10s只能执行5次,1是指 已经被/api/user/gw/group/fuzzy执行掉的一次。所以该服务最多只能处理4个请求

3.2 nocos动态配置sentinel方式(灵活,推荐)

在naocs管理界面新增两个文件
在这里插入图片描述
内容分别为:
在这里插入图片描述
在这里插入图片描述

4、初步测试

先测试user-route
在这里插入图片描述
效果:
在这里插入图片描述
在这里插入图片描述
测试 api组限流 myCustomApiFlow
(10s内最多只能执行1次)
在这里插入图片描述

在这里插入图片描述
效果:
精确匹配测试
在这里插入图片描述
在这里插入图片描述
模糊匹配测试
在这里插入图片描述
在这里插入图片描述

这样就结束了???不不不,还记得我们最开始说的吗,通过sentinel-dashboard界面进行配置。所以你也就不用在担心 例如上面json文件中的resource、resourceMode、count等字段信息是什么,不会怎么办的问题,我们继续往下看。

5、结合Sentinal-dashboard界面来配置限流规则

在网关配置接口,可以方便我们查看gateway配置的sentinel信息

package com.jxf.controller;

import com.alibaba.csp.sentinel.adapter.gateway.common.api.GatewayApiDefinitionManager;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayRuleManager;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SentinelController {

  /**
   * route 维度。这样就可以看到我们的配置信息
   * @return
   */
  @GetMapping("/gw-flow")
  public Object GetGatewayFlowConfig(){
    return GatewayRuleManager.getRules();
  }

  /**
   * 用户自定义的 API 定义分组。这样就可以看到我们的配置信息
   * @return
   */
  @GetMapping("/gw-api-group")
  public Object GetGatewayApiGroupConfig(){
    return GatewayApiDefinitionManager.getApiDefinitions();
  }
}

访问网关限流接口,查看配置信息
在这里插入图片描述
访问 自定义api组 接口,查看配置信息
在这里插入图片描述

启动你的sentinal-dashboard,通过http://localhost:8080/打开你的sentinal-bashboard界面,然后随便访问一下http://localhost:4000/gw-flow。因为你需要初次访问后,sentinel-dashboard才会显示该服务的配置信息。

可以看到界面已经加载我们的gateway服务了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
点开查看,具体配置也是一一对应的
在这里插入图片描述
在这里插入图片描述

重点来了:

我修改和新增一些配置数据
在这里插入图片描述
在这里插入图片描述
测试效果:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
然后点击保存,这样就大功告成。
此时我们把网关服务重启一下。看gateway-dashboard能不能正确读取到naocs中定义的 网关限流 配置信息
在这里插入图片描述
在这里插入图片描述

还记得我上面说的吗,需要初次访问该访问的接口后,sentinel-bashboard才会加载该服务的配置信息
我们随便访问一下:http://localhost:4000/gw-flow
在这里插入图片描述
然后再刷新sentinel-dashboard界面
在这里插入图片描述
当然,效果也是没有问题的。访问http://localhost:4000/api/user/gw/group/fuzzy,会发现第一二次,可以正常访问,10s内的第三次,就出现限流提示了!!这里就不在演示了。

同理,我们也可以新增或修改 api组信息,步骤和上面的差不多,这里再演示一下,就当再次巩固一下。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
说明一切OK
最后只需拷贝 网关api组信息,粘贴到nacos中就行了
在这里插入图片描述
在这里插入图片描述
最后点击保存即可。

  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,以下是基于 Spring Cloud+Spring Boot+Nacos+Dubbo+mybatis plus+RocketMQ+Sentinel+Seata+mysql 的项目手脚架的搭建步骤: 1. 创建 Spring Boot 项目 使用 Spring Initializr 创建一个 Spring Boot 项目,选择需要的依赖,包括 Spring Web、Spring Cloud Discovery、Dubbo Starter、Mybatis Plus Starter、RocketMQ Starter、Sentinel Starter、Seata Starter、MySQL Driver 等。 2. 配置 Nacos 注册中心和配置中心 在 application.properties 文件中添加以下配置: ``` spring.cloud.nacos.discovery.server-addr=localhost:8848 spring.cloud.nacos.config.server-addr=localhost:8848 spring.cloud.nacos.config.namespace= spring.cloud.nacos.config.group=DEFAULT_GROUP spring.cloud.nacos.config.prefix=${spring.application.name} spring.cloud.nacos.config.file-extension=properties ``` 其中,server-addr 为 Nacos 的地址,namespace 为命名空间,group 为配置组,prefix 为配置文件前缀,file-extension 为配置文件后缀。 3. 配置 Dubbo 服务提供者和消费者 在 application.properties 文件中添加以下配置: ``` # Dubbo Provider spring.dubbo.application.name=${spring.application.name} spring.dubbo.registry.address=nacos://${spring.cloud.nacos.discovery.server-addr} spring.dubbo.scan=tech.chitosh.oceanus.service # Dubbo Consumer spring.dubbo.consumer.check=false spring.dubbo.consumer.registry=nacos://${spring.cloud.nacos.discovery.server-addr} spring.dubbo.consumer.timeout=5000 ``` 其中,application.name 为应用名称,scan 为扫描的 Dubbo 服务接口包名,check 为是否启用 Dubbo 健康检查,timeout 为 Dubbo 超时时间。 4. 配置 Mybatis Plus 和 MySQL 在 application.properties 文件中添加以下配置: ``` # Mybatis Plus mybatis-plus.mapper-locations=classpath:mapper/*.xml mybatis-plus.configuration.map-underscore-to-camel-case=true mybatis-plus.configuration.cache-enabled=true # MySQL spring.datasource.url=jdbc:mysql://localhost:3306/oceanus?useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ``` 其中,mapper-locations 为 Mybatis Plus 的 Mapper.xml 文件路径,map-underscore-to-camel-case 为下划线转驼峰的配置,url 为 MySQL 的连接字符串,username 和 password 为数据库用户名和密码。 5. 配置 RocketMQ 在 application.properties 文件中添加以下配置: ``` # RocketMQ rocketmq.name-server=localhost:9876 rocketmq.producer.group=oceanus rocketmq.consumer.group=oceanus ``` 其中,name-server 为 RocketMQ 的地址,producer.group 为生产者组,consumer.group 为消费者组。 6. 配置 Sentinel 在 application.properties 文件中添加以下配置: ``` # Sentinel spring.cloud.sentinel.transport.dashboard=localhost:8080 spring.cloud.sentinel.transport.port=8719 spring.cloud.sentinel.datasource.ds.nacos.server-addr=localhost:8848 spring.cloud.sentinel.datasource.ds.nacos.data-id=${spring.cloud.nacos.config.prefix}-sentinel spring.cloud.sentinel.datasource.ds.nacos.group=SENTINEL_GROUP ``` 其中,transport.dashboard 为 Sentinel 控制台地址,transport.port 为 Sentinel 所用的端口,datasource.ds.nacos.server-addr 为 Nacos 的地址,data-id 为 Sentinel 数据源的名称,group 为 Sentinel 数据源所在的组。 7. 配置 Seata 在 application.properties 文件中添加以下配置: ``` # Seata spring.cloud.alibaba.seata.tx-service-group=my_test_tx_group spring.cloud.alibaba.seata.enable-auto-data-source-proxy=true spring.cloud.alibaba.seata.config.type=nacos spring.cloud.alibaba.seata.config.nacos.server-addr=localhost:8848 spring.cloud.alibaba.seata.config.nacos.namespace= spring.cloud.alibaba.seata.config.nacos.group=SEATA_GROUP ``` 其中,tx-service-group 为 Seata 分布式事务组名称,enable-auto-data-source-proxy 为是否启用 Seata 数据源代理,config.type 为 Seata 配置类型,config.nacos.server-addr 为 Nacos 的地址,config.nacos.namespace 为命名空间,config.nacos.group 为 Seata 配置所在的组。 8. 编写代码 按照业务需求编写 Dubbo 服务接口和实现、Mybatis Plus DAO 层、RocketMQ 生产者和消费者、Sentinel 熔断降级规则等代码。 以上就是基于 Spring Cloud+Spring Boot+Nacos+Dubbo+mybatis plus+RocketMQ+Sentinel+Seata+mysql 的项目手脚架的搭建步骤,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值