Skip to content

服务限流

liaochuntao edited this page Jun 15, 2022 · 2 revisions

模块简介

服务限流是最常见的一种服务自我保护措施之一,防止流量洪峰打垮服务。gRPC-Java-polaris 内置北极星限流 Interceptor,结合 Polaris 的限流功能帮忙业务快速接入限流能力。

支持的限流场景包括:

  1. 服务级限流
  2. 根据 gRPC-Method 限流
  3. 根据 Request 中的 Metadata 参数细粒度限流

如果您对源码感兴趣,可以查看核心限流 Interceptor 实现类 PolarisRateLimitServerInterceptor

快速入门

本章节将介绍如何在 gRPC-Java 项目中使用 gRPC-Java-polaris RateLimit 的功能。 完整的 Example 代码请参考:polaris-ratelimit-example

第一步:引入 Polaris 服务端

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

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

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

第二步:引入 gRPC-Java-polaris

<dependency>
    <groupId>com.tencent.polaris</groupId>
    <artifactId>grpc-java-polaris</artifactId>
    <version>${grpc-java-polaris.version}</version>
</dependency>

第三步: 添加 polaris.yaml 配置文件 & 增加限流的 Interceptor

  1. 在项目的 resources 文件夹中添加polaris.yaml配置文件中加入以下配置内容
global:
  serverConnector:
    addresses:
      - ${修改为第一步部署的 Polaris 服务地址}:8091
  1. 在代码中开启限流能力
Server polarisGrpcServer = PolarisGrpcServerBuilder
                .forPort(0)
                .namespace("default")
                .applicationName("RateLimitServerGRPCJava")
                // 注入限流的 server 拦截器
                .intercept(PolarisHelper.buildRateLimitInterceptor().build())
                .build();

第四步:配置限流规则

您可以在北极星控制台动态配置限流规则。

4.1 创建服务

如果您没有使用 gRPC-java-poaris 的服务注册能力,则需要在控制台手工创建服务信息。如下图所示: image

4.2 创建限流规则

  1. 点击服务名进入服务主页
  2. 切换到 服务限流 tab
  3. 创建规则
  4. 按要求填写规则内容。其中,单机限流可以设置限流效果为快速失败,分布式限流目前仅支持快速失败。

image

表达式标签,自动解析 Metadata、SystemEnvironment 里的参数

把 Http 请求里的某些字段作为流量标签,并且只针对带有某些标签的请求进行限流。例如 Metadata 有一个 uid 字段,期望只对某些 uid 限流。为了支持这种场景,我们定义了一套标签规则表达式,例如 grpc.header.uid 表示请求 Metadata 里的 uid 字段,如下图所示,表示 uid=1000 的用户。

image

当前支持的标签规则表达式如下:

  • grpc.header.xxx
    • 表示请求Metadata的参数
  • sys.env.xxx
    • 表示系统上下文环境的参数

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 接口,测试限流是否生效。如果请求被限流将会返回以下内容:

rate-limit exceeded (server side)

gPRC 的 Status 默认为 Status.UNAVAILABLE

被限流时,可通过 PolarisHelper.buildRateLimitInterceptor().rateLimitCallback(callback).build() 设置Callback的形式自定义响应内容。

至此即已完成限流的接入。