

AWS 大型机现代化服务（托管运行时环境体验）不再向新客户开放。有关类似于 AWS 大型机现代化服务（托管运行时环境体验）的功能，请浏览 AWS 大型机现代化服务（自我管理体验）。现有客户可以继续正常使用该服务。有关更多信息，请参阅[AWS 大型机现代化可用性变更](https://docs.aws.amazon.com/m2/latest/userguide/mainframe-modernization-availability-change.html)。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 为大型机运行时 AWS 转换配置速率限制
<a name="ba-runtime-rate-limiting"></a>

AWS 大型机运行时转换包括内置的速率限制功能，可保护 gapwalk 应用程序免受过多请求和潜在滥用的侵害。速率限制系统使用 Token Bucket 算法来提供突发容量和持续速率限制。

**Topics**
+ [速率限制概述](#ba-runtime-rate-limiting-overview)
+ [配置属性](#ba-runtime-rate-limiting-config)
+ [启用速率限制](#ba-runtime-rate-limiting-enable)
+ [客户识别](#ba-runtime-rate-limiting-client-id)
+ [速率限制标题](#ba-runtime-rate-limiting-headers)
+ [内存管理](#ba-runtime-rate-limiting-memory)

## 速率限制概述
<a name="ba-runtime-rate-limiting-overview"></a>

速率限制系统提供以下功能：

**代币桶算法**  
+ 允许突发流量，最高可达配置的突发容量
+ 根据每分钟的请求量以稳定的速度充值代币
+ 在不阻塞合法流量峰值的情况下提供流畅的速率限制

**客户识别**  
+ 通过 IP 地址识别客户端，支持代理服务器
+ 支架 X-Forwarded-For和 X-Real-IP标题
+ 处理负载均衡器和反向代理方案

**自动内存管理**  
+ 自动清理过期的速率限制存储桶
+ 可配置的清理间隔和过期时间
+ 防止长时间运行的应用程序出现内存泄漏

**HTTP 集成**  
+ 超过限制时返回 HTTP 429（请求过多）
+ 在响应中包含标准速率限制标题
+ 为客户提供重试后信息

## 配置属性
<a name="ba-runtime-rate-limiting-config"></a>

在`application-main.yaml`文件中配置速率限制：

```
gapwalk:
  ratelimiting:
    enabled: true                                        # Enable/disable rate limiting
    requestsPerMinute: 1000                              # Sustained rate limit per minute
    burstCapacity: 1500                                  # Maximum burst requests allowed
    includeHeaders: true                                 # Include X-RateLimit-* headers
    cleanupIntervalMinutes: 5                            # Cleanup interval for expired buckets
    bucketExpiryHours: 1                                 # Hours after which unused buckets expire
    errorMessage: "Too many requests. Try again later."  # Custom error message
    whitelistIps: ""                                     # Comma-separated IPs to bypass limiting
    perEndpointLimiting: false                           # Apply limits per endpoint (not implemented)
```

### 房产描述
<a name="ba-runtime-rate-limiting-config-properties"></a>

**已启用**  
用于启用或禁用速率限制功能的主开关。默认值：`false`

**requestsPerMinute**  
持续速率限制每分钟允许的请求数。这代表代币充值率。默认值：`1000`

**爆发容量**  
在应用速率限制之前，突发中允许的最大请求数。应高于`requestsPerMinute`以允许流量激增。默认值：`1500`

**包含标题**  
是否在 HTTP 响应中包含标准速率限制标头 (`X-RateLimit-Limit``X-RateLimit-Remaining`,,`X-RateLimit-Reset`)。默认值：`true`

**cleanupIntervalMinutes**  
自动清理过期速率限制存储桶之间的间隔（以分钟为单位）。有助于防止内存泄漏。默认值：`5`

**bucketExpiryHours**  
以小时为单位的时间，在此之后未使用的速率限制存储桶被视为已过期且有资格进行清理。默认值：`1`

**errorMessage**  
超过速率限制时，JSON 响应中返回的自定义错误消息。默认值：`"Too many requests. Try again later."`

**WhitelisTi**  
以逗号分隔的 IP 地址列表，这些地址完全绕过速率限制。对运行状况检查或可信系统很有用。默认值：`empty`

**perEndpointLimiting**  
是否对每个端点应用单独的速率限制，而不是仅对每个客户端应用速率限制。目前尚未实施。默认值：`false`

## 启用速率限制
<a name="ba-runtime-rate-limiting-enable"></a>

要使用默认设置启用速率限制，请执行以下操作：

```
gapwalk:
  ratelimiting:
    enabled: true
```

## 客户识别
<a name="ba-runtime-rate-limiting-client-id"></a>

速率限制系统使用以下优先级顺序识别客户端：

1. **X-Forwarded-For 标头**（如果用逗号分隔，则第一个 IP）

1. **X-Real-IP 标题**

1. 来自 HTTP 请求的@@ **远程地址**

这样可以确保在应用程序落后时正确识别客户端：
+ 负载均衡器
+ 反向代理
+ CDNs
+ API 网关

### 客户识别示例
<a name="ba-runtime-rate-limiting-client-id-example"></a>

```
# Direct connection
Client IP: 192.168.1.100

# Behind load balancer with X-Forwarded-For
X-Forwarded-For: 203.0.113.45, 192.168.1.100
Client IP: 203.0.113.45 (first IP used)

# Behind reverse proxy with X-Real-IP
X-Real-IP: 203.0.113.45
Client IP: 203.0.113.45
```

## 速率限制标题
<a name="ba-runtime-rate-limiting-headers"></a>

启用后`includeHeaders`，以下标头将添加到 HTTP 响应中：

**X-RateLimit-极限**  
客户端的速率限制上限（每分钟请求数）

**X-RateLimit-剩余**  
当前速率限制窗口中剩余的请求数

**X-RateLimit-重置**  
速率限制窗口重置的时间（Unix 时间戳）

### 响应标头示例
<a name="ba-runtime-rate-limiting-headers-example"></a>

```
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 847
X-RateLimit-Reset: 1640995200
```

### 超出速率限制的响应
<a name="ba-runtime-rate-limiting-headers-exceeded"></a>

当超过速率限制时，系统会返回：

**HTTP 状态**  
429 请求过多

**Content-Type**  
application/json

**Retry-After**  
重试前等待的秒数

```
{
  "error": "Rate limit exceeded",
  "message": "Too many requests. Try again later.",
  "retryAfter": 60,
  "timestamp": 1640995140000
}
```

## 内存管理
<a name="ba-runtime-rate-limiting-memory"></a>

速率限制系统会自动管理内存，以防止长时间运行的应用程序出现泄漏：

**自动清理**  
+ 每`cleanupIntervalMinutes`分钟运行一次
+ 移除长达数小时未使用的`bucketExpiryHours`存储桶
+ 记录清理活动以供监视

**内存效率**  
+ 使用并发数据结构确保线程安全
+ 延迟创建存储桶（仅在需要时创建）
+ 高效的代币桶实现

### 监视清理活动
<a name="ba-runtime-rate-limiting-memory-monitoring"></a>

检查日志中是否有清理消息：

```
INFO  RateLimitingService - Cleaned up 15 expired rate limiting buckets
```