-
Notifications
You must be signed in to change notification settings - Fork 19
服务限流
服务限流是最常见的一种服务自我保护措施之一,防止流量洪峰打垮服务。gRPC-Java-polaris 内置北极星限流 Interceptor,结合 Polaris 的限流功能帮忙业务快速接入限流能力。
支持的限流场景包括:
- 服务级限流
- 根据 gRPC-Method 限流
- 根据 Request 中的 Metadata 参数细粒度限流
如果您对源码感兴趣,可以查看核心限流 Interceptor 实现类 PolarisRateLimitServerInterceptor
本章节将介绍如何在 gRPC-Java 项目中使用 gRPC-Java-polaris RateLimit 的功能。 完整的 Example 代码请参考:polaris-ratelimit-example
搭建北极星服务请参考 Polaris Getting Started
- Console Address : http://14.116.241.63:8080/
- Username: polaris
- Password: polaris
- Server Address:
grpc://183.47.111.80:8091
<dependency>
<groupId>com.tencent.polaris</groupId>
<artifactId>grpc-java-polaris</artifactId>
<version>${grpc-java-polaris.version}</version>
</dependency>
- 在项目的 resources 文件夹中添加polaris.yaml配置文件中加入以下配置内容
global:
serverConnector:
addresses:
- ${修改为第一步部署的 Polaris 服务地址}:8091
- 在代码中开启限流能力
Server polarisGrpcServer = PolarisGrpcServerBuilder
.forPort(0)
.namespace("default")
.applicationName("RateLimitServerGRPCJava")
// 注入限流的 server 拦截器
.intercept(PolarisHelper.buildRateLimitInterceptor().build())
.build();
您可以在北极星控制台动态配置限流规则。
如果您没有使用 gRPC-java-poaris 的服务注册能力,则需要在控制台手工创建服务信息。如下图所示:
- 点击服务名进入服务主页
- 切换到
服务限流
tab - 创建规则
- 按要求填写规则内容。其中,单机限流可以设置限流效果为快速失败,分布式限流目前仅支持快速失败。
表达式标签,自动解析 Metadata、SystemEnvironment 里的参数
把 Http 请求里的某些字段作为流量标签,并且只针对带有某些标签的请求进行限流。例如 Metadata 有一个 uid 字段,期望只对某些 uid 限流。为了支持这种场景,我们定义了一套标签规则表达式,例如 grpc.header.uid
表示请求 Metadata 里的 uid 字段,如下图所示,表示 uid=1000
的用户。
当前支持的标签规则表达式如下:
- grpc.header.xxx
- 表示请求Metadata的参数
- sys.env.xxx
- 表示系统上下文环境的参数
- 页面创建限流规则时,选择
分布式限流
规则 - 额外部署限流 Server (分布式限流需要依赖额外中心限流集群来协调多节点)
- 客户端默认情况下,无需任何配置,使用默认值即可
如需使用分布式限流,则需要部署限流 Server,并把限流 Server 注册到北极星(限流 Server 部署参考文档),限流客户端通过北极星获取限流 Server 的服务地址。限流 Server 默认服务名为 polaris.limiter
并注册到 Polaris
命名空间下。如自定义限流 Server 服务名,则需要在 resources/polaris.yml
配置限流 Server 服务名,如下所示:
provider:
# 限流配置
rateLimit:
# 限流服务的命名空间
limiterNamespace: Polaris
# 限流服务名,改为自定义服务名
limiterService: polaris.limiter
应用启动成功后,访问应用的 http 接口,测试限流是否生效。如果请求被限流将会返回以下内容:
rate-limit exceeded (server side)
gPRC 的 Status 默认为 Status.UNAVAILABLE
被限流时,可通过
PolarisHelper.buildRateLimitInterceptor().rateLimitCallback(callback).build()
设置Callback的形式自定义响应内容。
至此即已完成限流的接入。