教程系列(三):Spring Cloud Tencent 接入限流中心

简介: 限流能力是服务自我保护最重要的能力之一,市面上服务限流的组件也非常多。Spring Cloud Tencent 限流能力最大的特定是完全无侵入,对常见的限流场景做了比较好的支持。例如表达式标签自动从 Request 里提取参数等。

导读

限流能力是服务自我保护最重要的能力之一,市面上服务限流的组件也非常多。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

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

  • 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>2. 引入 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 的配置文件

  1. 在您的 bootstrap.yml 配置文件中加入以下配置内容
spring:
  application:
    name: ${application.name}
  cloud:
    polaris:
      address: grpc://${修改为第一步部署的 Polaris 服务地址}:8091
      namespace: default


第四步:配置限流规则

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

4.1 创建服务

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

4.2 创建限流规则

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


表达式标签,自动解析 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

匀速排队限流最大排队时间

目录
相关文章
|
21天前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
51 2
|
2月前
|
XML JavaScript Java
Spring Retry 教程
Spring Retry 是 Spring 提供的用于处理方法重试的库,通过 AOP 提供声明式重试机制,不侵入业务逻辑代码。主要步骤包括:添加依赖、启用重试机制、设置重试策略(如异常类型、重试次数、延迟策略等),并可定义重试失败后的回调方法。适用于因瞬时故障导致的操作失败场景。
Spring Retry 教程
|
1月前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
详细介绍实现Java Spring Boot FCM推送教程
90 0
|
3月前
|
Java 数据库连接 Spring
一文讲明 Spring 的使用 【全网超详细教程】
这篇文章是一份全面的Spring框架使用教程,涵盖了从基础的项目搭建、IOC和AOP概念的介绍,到Spring的依赖注入、动态代理、事务处理等高级主题,并通过代码示例和配置文件展示了如何在实际项目中应用Spring框架的各种功能。
一文讲明 Spring 的使用 【全网超详细教程】
|
3月前
|
算法 Java UED
你的Spring Boot应用是否足够健壮?揭秘限流功能的实现秘诀
【8月更文挑战第29天】限流是保障服务稳定性的关键策略,通过限制单位时间内的请求数量防止服务过载。本文基于理论介绍,结合Spring Boot应用实例,展示了使用`@RateLimiter`注解和集成`Resilience4j`库实现限流的方法。无论采用哪种方式,都能有效控制请求速率,增强应用的健壮性和用户体验。通过这些示例,读者可以灵活选择适合自身需求的限流方案。
97 2
|
3月前
|
算法 NoSQL Java
spring cloud的限流算法有哪些?
【8月更文挑战第18天】spring cloud的限流算法有哪些?
86 3
|
3月前
|
SQL Java 数据库连接
Spring Boot联手MyBatis,打造开发利器:从入门到精通,实战教程带你飞越编程高峰!
【8月更文挑战第29天】Spring Boot与MyBatis分别是Java快速开发和持久层框架的优秀代表。本文通过整合Spring Boot与MyBatis,展示了如何在项目中添加相关依赖、配置数据源及MyBatis,并通过实战示例介绍了实体类、Mapper接口及Controller的创建过程。通过本文,你将学会如何利用这两款工具提高开发效率,实现数据的增删查改等复杂操作,为实际项目开发提供有力支持。
167 0
|
3月前
|
Java 关系型数据库 MySQL
|
Dubbo Java 应用服务中间件
深入了解Spring Cloud Alibaba Dubbo
在现代分布式系统开发中,构建高性能、可伸缩性和弹性的微服务架构变得越来越重要。Spring Cloud Alibaba Dubbo(简称Dubbo)是一个开源的分布式服务框架,可以帮助开发者构建强大的微服务架构,具备负载均衡、服务治理、远程调用等强大功能。本文将深入介绍Spring Cloud Alibaba Dubbo,帮助你理解它的核心概念、工作原理以及如何在你的项目中使用它。
|
Kubernetes Java 微服务
Spring Boot 单体应用一键升级成 Spring Cloud Alibaba(1)
Spring Boot 单体应用一键升级成 Spring Cloud Alibaba(1)
135 0
Spring Boot 单体应用一键升级成 Spring Cloud Alibaba(1)