豹猫速率限制

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()
            );
    }