导读
限流能力是服务自我爱护最重要的能力之一,市面上服务限流的组件也十分多。Spring Cloud Tencent 限流能力最大的特定是齐全无侵入,对常见的限流场景做了比拟好的反对。例如表达式标签主动从 Request 里提取参数等。
Github 地址: Spring Cloud Tencent
模块简介
服务限流是最常见的一种服务自我保护措施之一,避免流量洪峰打垮服务。Spring Cloud Tencent Rate Limit 模块内置了针对 Spring Web 和 Spring WebFlux 场景的限流 Filter,联合 Polaris 的限流性能帮忙业务疾速接入限流能力。
反对的限流场景包含:
- 服务级限流
- 依据 path 限流
- 依据 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 依赖
- 参考 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>
-
引入 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 的配置文件
-
在您的 bootstrap.yml 配置文件中退出以下配置内容
spring: application: name: ${application.name} cloud: polaris: address: grpc://${批改为第一步部署的 Polaris 服务地址}:8091 namespace: default
第四步:配置限流规定
您能够在北极星控制台动静配置限流规定。
4.1 创立服务
如果您没有应用 Spring Cloud Tencent Discovery 能力,则须要在控制台手工创立服务信息。如下图所示:
4.2 创立限流规定
- 点击服务名进入服务主页
- 切换到
服务限流
tab - 创立规定
- 按要求填写规定内容。其中,单机限流能够设置限流成果为疾速失败或者匀速排队(匀速排队限流可点击此处理解详情),分布式限流目前仅反对疾速失败。
表达式标签,主动解析 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 应用分布式限流
- 页面创立限流规定时,抉择
分布式限流
规定 - 额定部署限流 Server(分布式限流须要依赖额定核心限流集群来协调多节点)
- 客户端默认状况下,无需任何配置,应用默认值即可
如需应用分布式限流,则须要部署限流 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 | 否 | 匀速排队限流最大排队工夫 |