乐趣区

zuul集成Sentinel最新的网关流控组件

一、说明

Sentinel 网关流控支持针对不同的路由和自定义的 API 分组进行流控,支持针对请求属性(如 URL 参数,Client IP,Header 等)进行流控。Sentinel 1.6.3 引入了网关流控控制台的支持,用户可以直接在 Sentinel 控制台上查看 API Gateway 实时的 route 和自定义 API 分组监控,管理网关规则和 API 分组配置。

 

二、功能接入

1. 网关添加 sentinel 相关的 jar 依赖

<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-alibaba-sentinel-gateway</artifactId>
</dependency>

 

2. 网关 zuul 的 sentinel 配置

spring:
  # sentinel 动态配置规则
  cloud:
    sentinel:
      zuul:
        enabled: true
        order:
          pre: 2000
          post: 500
          error: -100
      filter:
        enabled: false
      datasource:
        # 限流
        ds1:
          nacos:
            server-addr: ${zlt.nacos.server-addr}
            dataId: ${spring.application.name}-sentinel-gw-flow
            groupId: DEFAULT_GROUP
            rule-type: gw-flow
        # api 分组
        ds2:
          nacos:
            server-addr: ${zlt.nacos.server-addr}
            dataId: ${spring.application.name}-sentinel-gw-api-group
            groupId: DEFAULT_GROUP
            rule-type: gw-api-group

绑定 gw-flow(限流)gw-api-group(api 分组)的规则数据源为 nacos
并指定 nacos 上对应的 dataIdgroupId

 

3. nacos 规则配置

3.1. 限流配置 gw-flow

  • Data ID:api-gateway-sentinel-gw-flow
  • Group:DEFAULT_GROUP
  • 配置内容:

    [
      {
        "resource": "user",
        "count": 0,
        "paramItem": {
          "parseStrategy": 3,
          "fieldName": "name"
        }
      },
      {
        "resource": "uaa_api",
        "count": 0
      }
    ]

    规则 1:所有 user 的请求只要参数带有 name 的都拦截 (qps=0),user 为 zuul 路由配置上的 routeId
    规则 2:api 分组为 uaa_api 的所有请求都拦截(qps=0)

 

3.2. api 分组配置 gw-api-group

  • Data ID:api-gateway-sentinel-gw-api-group
  • Group:DEFAULT_GROUP
  • 配置内容:

    [
      {
        "apiName": "uaa_api",
        "predicateItems": [
          {"pattern": "/user/login"},
          {
            "pattern": "/api-uaa/oauth/**",
            "matchStrategy": 1
          }
        ]
      }
    ]

    上面配置意思为满足规则的 api 都统一分组为 uaa_api
    分组规则 1:精准匹配 /user/login
    分组规则 2:前缀匹配/api-uaa/oauth/**

 

4. 网关 zuul 启动参数

需要在接入端原有启动参数的基础上添加 -Dcsp.sentinel.app.type=1 启动以将您的服务标记为 API Gateway,在接入控制台时您的服务会自动注册为网关类型,然后您即可在控制台配置网关规则和 API 分组,例如:

java -Dcsp.sentinel.app.type=1 -jar zuul-gateway.jar

 

三、sentinel 控制台管理

API 管理 (分组)

网关流控规则

 

四、测试限流 api

1. 测试限流规则 1

所有 user 的请求只要参数带有 name 的都拦截(qps=0)

  • 不加 name 参数,可以访问 api

  • 后面加上 name 参数,请求 被拦截

 

2. 测试限流规则 2

api 分组为 uaa_api 的所有请求 都拦截(qps=0)

  • 前缀匹配/api-uaa/oauth/**

  • 精准匹配/user/login

退出移动版