乐趣区

关于java:教程系列三Spring-Cloud-Tencent-接入限流中心

导读

限流能力是服务自我爱护最重要的能力之一,市面上服务限流的组件也十分多。Spring Cloud Tencent 限流能力最大的特定是齐全无侵入,对常见的限流场景做了比拟好的反对。例如表达式标签主动从 Request 里提取参数等。

Github 地址: Spring Cloud Tencent

模块简介

服务限流是最常见的一种服务自我保护措施之一,避免流量洪峰打垮服务。Spring Cloud Tencent Rate Limit 模块内置了针对 Spring Web 和 Spring WebFlux 场景的限流 Filter,联合 Polaris 的限流性能帮忙业务疾速接入限流能力。
反对的限流场景包含:

  1. 服务级限流
  2. 依据 path 限流
  3. 依据 Request 中的 QueryParam、Header 等参数细粒度限流

如果您对源码感兴趣,能够查看外围限流 Filter 实现类 RateLimitFilter

疾速入门

本章节将介绍如何在 Spring Cloud 我的项目中应用 Spring Cloud Tencent RateLimit 的性能。
残缺的 Example 代码请参考:polaris-ratelimit-example

第一步:引入 Polaris 服务端

形式一:搭建本地北极星服务

搭建北极星服务请参考 Polaris Getting Started

形式二:应用北极星开源提供的体验环境

  • Console Address : http://14.116.241.63:8080/

    • Username: polaris
    • Password: polaris
  • Server Address: grpc://183.47.111.80:8091

    形式三:应用腾讯云北极星服务

    腾讯云提供了免运维的北极星云服务,基于云服务能够疾速开明生产级高可用北极星集群 理解更多

    第二步:引入 Spring Cloud Tencent Rate Limit 依赖

  1. 参考 Spring Cloud Tencent 版本治理 文档获取最新的版本号,引入 Spring Cloud Tencent Bom,例如:
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.tencent.cloud</groupId>
            <artifactId>spring-cloud-tencent-dependencies</artifactId>
            <version>1.5.0-Hoxton.SR9</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
  1. 引入 Spring Cloud Tencent Rate Limit Starter

    <dependency>
     <groupId>com.tencent.cloud</groupId>
     <artifactId>spring-cloud-starter-tencent-polaris-ratelimit</artifactId>
    </dependency>

    第三步:减少 Spring Cloud Tencent Rate Limit Starter 的配置文件

  2. 在您的 bootstrap.yml 配置文件中退出以下配置内容

    spring:
      application:
     name: ${application.name}
      cloud:
     polaris:
       address: grpc://${批改为第一步部署的 Polaris 服务地址}:8091
       namespace: default

    第四步:配置限流规定

    您能够在北极星控制台动静配置限流规定。

    4.1 创立服务

    如果您没有应用 Spring Cloud Tencent Discovery 能力,则须要在控制台手工创立服务信息。如下图所示:

    4.2 创立限流规定

  3. 点击服务名进入服务主页
  4. 切换到 服务限流 tab
  5. 创立规定
  6. 按要求填写规定内容。其中,单机限流能够设置限流成果为疾速失败或者匀速排队(匀速排队限流可点击此处理解详情),分布式限流目前仅反对疾速失败。


表达式标签,主动解析 Query、Header、Cookie 里的参数
把 Http 申请里的某些字段作为流量标签,并且只针对带有某些标签的申请进行限流。例如 Query Param 有一个 uid 字段,冀望只对某些 uid 限流。为了反对这种场景,咱们定义了一套标签规定表达式,例如 ${http.query.uid} 示意申请 Query Param 里的 uid 字段,如下图所示,示意 uid=1000 的用户。


以后反对的标签规定表达式如下:

  • ${http.query.xxx}

    • 示意查问申请的参数
  • ${http.header.xxx}

    • 示意申请头里的参数
  • ${http.cookie.xxx}

    • 示意 cookie 里的参数
  • ${http.method}

    • 示意申请的办法,GET、POST、PUT 等
  • ${http.uri}

    • 示意申请的 Path,留神 / 结尾,例如:/user

对 Path 中带有参数的申请限流
依照 Restful 标准,Path 中常常带有申请参数,例如以下 GET 申请 /users/{userId}/orders 表白的含意是获取特定用户的订单列表。通过正则表达式即可实现这类接口的限流 /users/.*/orders,如下图所示:

4.2.1 应用分布式限流
  1. 页面创立限流规定时,抉择 分布式限流 规定
  2. 额定部署限流 Server(分布式限流须要依赖额定核心限流集群来协调多节点)
  3. 客户端默认状况下,无需任何配置,应用默认值即可

如需应用分布式限流,则须要部署限流 Server,并把限流 Server 注册到北极星(限流 Server 部署参考文档),限流客户端通过北极星获取限流 Server 的服务地址。限流 Server 默认服务名为 polaris.limiter 并注册到 Polaris 命名空间下。如自定义限流 Server 服务名,则须要在 resources/polaris.yml 配置限流 Server 服务名,如下所示:

provider:
  # 限流配置
  rateLimit:
    # 限流服务的命名空间
    limiterNamespace: Polaris
    # 限流服务名,改为自定义服务名
    limiterService: polaris.limiter

第五步:启动利用

利用启动胜利后,拜访利用的 http 接口,测试限流是否失效。如果申请被限流将会返回以下内容:

The request is deny by rate limit because the throttling threshold is reached

HttpCode 默认为 429

被限流时,可通过 spring.cloud.polaris.ratelimit.rejectRequestTips 自定义响应内容,具体参考配置列表。

至此即已实现限流的接入。

配置列表

配置项 Key 默认值 是否必填 配置项阐明
spring.cloud.polaris.ratelimit.enabled true 是否开启服务限流
spring.cloud.polaris.ratelimit.rejectRequestTips 自定义拒绝请求响应的文本内容
spring.cloud.polaris.ratelimit.rejectRequestTipsFilePath 自定义拒绝请求响应内容的文件地址,罕用于返回 html 文件内容等。目前仅反对 classpath 下的文件,放在 resources 目录。
spring.cloud.polaris.ratelimit.rejectHttpCode 429(Too Many Request) 自定义拒绝请求响应的 Http 状态码
spring.cloud.polaris.ratelimit.maxQueuingTime 1000 匀速排队限流最大排队工夫
退出移动版