Ocelot支持上游的请求限制,以便您的下游服务不会过载。 此功能是由GitHub上的@geffzhang添加! 非常感谢。
好了,为了让Route
获得流量限制,你需要添加下面的json
到Route
中。
"RateLimitOptions": {
"ClientWhitelist": [],
"EnableRateLimiting": true,
"Period": "1s",
"PeriodTimespan": 1,
"Limit": 1
}
ClientWhitelist
- 是一个包含客户端白名单列表的数组。这意味着在白名单里的客户端不受流量限制的影响。
EnableRateLimiting
- 该值指定流量限制是否开启。
Period
- 该值指定时间段,例如1s,5m,1h,1d等。
PeriodTimespan
- 该值指定我们可以在一定的秒数后重试。
Limit
- 该值指定一个客户端可以在定义的时间段(Period)内允许的最大请求数。
您还可以在ocelot.json
的GlobalConfiguration
部分中设置以下内容
"RateLimitOptions": {
"DisableRateLimitHeaders": false,
"QuotaExceededMessage": "Customize Tips!",
"HttpStatusCode": 999,
"ClientIdHeader" : "Test"
}
DisableRateLimitHeaders
- 该值指定是否禁用X-Rate-Limit和Rety-After头。
QuotaExceededMessage
- 该值指定超出限制时返回的消息。
HttpStatusCode
- 该值指定超出限制时返回的HTTP状态代码。
ClientIdHeader
- 允许您指定应该用于标识客户端的头。 默认是“ClientId”
Caching
目前Ocelot使用CacheManager
项目提供了一些非常基本的缓存。这是一个了不起的项目,它解决了很多缓存问题。 我会推荐这个软件包来做Ocelot
缓存。
下面的示例演示如何将CacheManager
添加到Ocelot
,以便可以进行输出缓存。
首先添加以下NuGet包。
Install-Package Ocelot.Cache.CacheManager
这将使您可以访问Ocelot缓存管理器扩展方法。
第二件事,您需要对ConfigureServices
执行以下操作。
s.AddOcelot()
.AddCacheManager(x =>
{
x.WithDictionaryHandle();
})
最后,为了在Route
配置中的路由上使用缓存,请添加此设置。
"FileCacheOptions": { "TtlSeconds": 15, "Region": "somename" }
在此示例中,ttl seconds
设置为15,这意味着缓存将在15秒后过期。
如果在此处查看示例,则可以看到如何设置缓存管理器,然后将其传递到Ocelot AddCacheManager
配置方法中。 您可以使用CacheManager
程序包支持的任何设置,然后直接传入。
无论如何,Ocelot
当前支持在下游服务的URL上进行缓存,并以秒为单位设置TTL
以使缓存过期。 您还可以通过调用Ocelot的管理API
清除Region
的缓存。
您自己的缓存
如果您想添加自己的缓存方法,请实现以下接口并将其注册到DI中,例如
services.AddSingleton<IOcelotCache<CachedResponse>, MyCache>()
IOcelotCache<CachedResponse>
这是用于输出缓存.
IOcelotCache<FileConfiguration>
如果您要远程调用某些内容以获取配置(例如Consul
),则用于缓存文件配置。
请深入研究Ocelot源代码以查找更多信息。 如果有人要实现Redis
,memcache
等,我将不胜感激。
Quality of Service
目前Ocelot支持一种QoS
功能。 如果您希望在请求向下游服务时使用断路,则可以在Route
中进行设置。 这个功能使用了一个名为Polly的.NET库,这个库很棒,在这里可以找到它。
如果要使用管理API,您需要做的第一件事就是引入相关的NuGet软件包。
Install-Package Ocelot.Provider.Polly
然后在你的ConfigureServices
方法中
public virtual void ConfigureServices(IServiceCollection services)
{
services
.AddOcelot()
.AddPolly();
}
添加如下配置块到一个Route配置中。
"QoSOptions": {
"ExceptionsAllowedBeforeBreaking":3,
"DurationOfBreak":5,
"TimeoutValue":5000
}
为了实现这个规则,你必须设置一个大于0
的数字给ExceptionsAllowedBeforeBreaking
。DurationOfBreak
是断路器跳闸后保持断开的时间。TimeoutValue
表示如果请求超过5秒钟,它将自动超时。
你可以单独设置TimeoutValue
选项,而不设置ExceptionsAllowedBeforeBreaking
和DurationOfBreak
。
"QoSOptions": {
"TimeoutValue":5000
}
单独设置另外两个选项其中之一是没有意义的,因为他们两个相互影响。
如果您不添加QoS
部分,QoS
将不会被使用,但Ocelot
默认将所有下游请求的超时时间设置为90秒。 如果有人需要这个90秒是可配置,请提出问题。