豹猫速率限制
Ocelot Rate Limiting
我最近一直在使用 Ocelot 构建一个 API 网关。速率限制是否基于请求者客户端 ID?因为有人要求我在这样的架构中构建一个 api 网关
并且所有请求都将具有相同的 ID,因为它们是通过代理传递的。
但是,我可以使用 header 令牌识别不同的请求客户端。所以我的问题是:我可以限制客户端使用 header 令牌而不是请求 ID 发出的请求的数量吗?提前致谢。
您可以使用 Ocelot 作为基于 ClientId 的速率限制器。
"RateLimitOptions": {
"DisableRateLimitHeaders": false,
"QuotaExceededMessage": "Customize Tips!",
"HttpStatusCode": 999,
"ClientIdHeader" : "MY-CLIENT-ID"
}
Ocelot's rate limiting 文档中的最后一行指的是:
ClientIdHeader - Allows you to specifiy the header that should be used to identify clients. By default it is “ClientId”
您也可以实现自己的中间件并使用 Ocelots 速率限制。所以您可以阅读其他 Headers 并获得您的自定义 client-id:
看看Ocelot默认提供的限速中间件:ClientRateLimitMiddleware.cs
public virtual ClientRequestIdentity SetIdentity(HttpContext httpContext, RateLimitOptions option)
{
var clientId = "client";
if (httpContext.Request.Headers.Keys.Contains(option.ClientIdHeader))
{
clientId = httpContext.Request.Headers[option.ClientIdHeader].First();
}
return new ClientRequestIdentity(
clientId,
httpContext.Request.Path.ToString().ToLowerInvariant(),
httpContext.Request.Method.ToLowerInvariant()
);
}
我最近一直在使用 Ocelot 构建一个 API 网关。速率限制是否基于请求者客户端 ID?因为有人要求我在这样的架构中构建一个 api 网关
并且所有请求都将具有相同的 ID,因为它们是通过代理传递的。 但是,我可以使用 header 令牌识别不同的请求客户端。所以我的问题是:我可以限制客户端使用 header 令牌而不是请求 ID 发出的请求的数量吗?提前致谢。
您可以使用 Ocelot 作为基于 ClientId 的速率限制器。
"RateLimitOptions": {
"DisableRateLimitHeaders": false,
"QuotaExceededMessage": "Customize Tips!",
"HttpStatusCode": 999,
"ClientIdHeader" : "MY-CLIENT-ID"
}
Ocelot's rate limiting 文档中的最后一行指的是:
ClientIdHeader - Allows you to specifiy the header that should be used to identify clients. By default it is “ClientId”
您也可以实现自己的中间件并使用 Ocelots 速率限制。所以您可以阅读其他 Headers 并获得您的自定义 client-id:
看看Ocelot默认提供的限速中间件:ClientRateLimitMiddleware.cs
public virtual ClientRequestIdentity SetIdentity(HttpContext httpContext, RateLimitOptions option)
{
var clientId = "client";
if (httpContext.Request.Headers.Keys.Contains(option.ClientIdHeader))
{
clientId = httpContext.Request.Headers[option.ClientIdHeader].First();
}
return new ClientRequestIdentity(
clientId,
httpContext.Request.Path.ToString().ToLowerInvariant(),
httpContext.Request.Method.ToLowerInvariant()
);
}