Gateway网关如何整合Sentinel实现服务限流

433 阅读3分钟

我正在参与掘金创作者训练营第6期,点击了解活动详情

在微服务项目中,网关一般用作服务的路由以及转发,同时也可以整合Sentinel做服务的限流降级、熔断等功能

环境:

  • Nacos
  • Gateway
  • Sentinel
  • SpringBoot

pom

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

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
</dependency>

yml

spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost     # nacos注册地址
      config:
        server-addr: localhost     # 远程配置地址
    sentinel:
      transport:
        dashboard: localhost:8080       # sentinel注册地址
      # 直接建立心跳
      eager: true
      scg:
        # 限流后的响应配置
        fallback:
          content-type: application/json
          # 模式 response、redirect
          mode: response
          # 响应状态码
          response-status: 440
          # 响应信息
          response-body: 限流中
    gateway:
      # spring cloud gateway 路由配置方式
      discovery:
        locator:
          enabled: true                 #   表明gateway开启服务注册和发现的功能
          lower-case-service-id: true   #   将请求路径上的服务名配置为小写
          route-id-prefix: order   # 配置routeId的前缀,最终为 route-id-注册服务名

配置完成之后直接启动项目 在启动项目之前需要先启动Sentinel,可以直接去官网下载Sentinel的启动控制台,一个jar包 直接启动即可,默认的端口是8080,可以自行配置成与本地不冲突的端口。

微信截图_20220905232734.png

规则配置 微信截图_20220905232853.png sentinel参数

  • 资源名:服务名
  • 阙值类型:每秒访问量QPS或者线程数
  • 单机阙值:就是具体访问量
  • 是否集群这个需要单独再去配置

如果想要更直观的去测试这个话,建议去下载一个jmeter,可以设置一定的访问量和线程数去测试限流,sentinel默认是懒加载需要先请求一次接口才能在控制台显示服务信息,不过也可以在配置里面关闭这个eager: true

如果只是在sentinel上面去配置的话,当Sentinel重启之后这些配置就会丢失,所以就有了下一步,把配置整合至nacos,实现动态读取和配置持久化。

#sentinel数据源配置(从哪里获取限流规则)
datasource: #整合nacos,下发配置
  flow:
    nacos:
      server-addr: localhost:8848
      namespace: test
      dataId: gateway-flow-sentinel-test
      groupId: test
      data-type: json
      rule-type: flow
      username: nacos
      password: nacos
  #降级类型配置
  degrade:
    nacos:
      server-addr: localhost:8848
      namespace: test
      dataId: gateway-degrade-sentinel-test
      groupId: test
      data-type: json
      rule-type: degrade
      username: nacos
      password: nacos

把上述配置添加至nacos后需要给限流和降级单独建立一个配置文件,因为我定义的是json类型 所以我的配置文件建立的时候就需要是json的格式

微信截图_20220905234230.png

微信截图_20220905234144.png

配置完成之后重启服务,这时就会在sentinel控制台看到自己的配置已经读取到了,同时在 nacos上修改之后也会在sentinel上实时的去刷新。

题外话:其实在网关上面可以单独去配置限流,这个使用的是令牌桶限流,不过是针对具体的访问路径以及或者方法,依据网关的路由匹配针对每个服务路由时做限流,下次有机会在更