.NET Core开源API网关 – Ocelot中文文档 (3)

当下游服务有多个结点的时候,我们可以在DownstreamHostAndPorts中进行配置。

{ "DownstreamPathTemplate": "/api/posts/{postId}", "DownstreamScheme": "https", "DownstreamHostAndPorts": [ { "Host": "10.0.1.10", "Port": 5000, }, { "Host": "10.0.1.11", "Port": 5000, } ], "UpstreamPathTemplate": "/posts/{postId}", "LoadBalancer": "LeastConnection", "UpstreamHttpMethod": [ "Put", "Delete" ] }

LoadBalancer将决定负载均衡的算法

LeastConnection – 将请求发往最空闲的那个服务器

RoundRobin – 轮流发送

NoLoadBalance – 总是发往第一个请求或者是服务发现

在负载均衡这里,我们还可以和Consul结合来使用服务发现,我们将在后面的小节中进行详述。

请求聚合

即将多个API请求结果合并为一个返回。要实现请求聚合我们需要给其它参与的路由起一个Key。

{ "ReRoutes": [ { "DownstreamPathTemplate": "http://www.likecs.com/", "UpstreamPathTemplate": "/laura", "UpstreamHttpMethod": [ "Get" ], "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 51881 } ], "Key": "Laura" }, { "DownstreamPathTemplate": "http://www.likecs.com/", "UpstreamPathTemplate": "/tom", "UpstreamHttpMethod": [ "Get" ], "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 51882 } ], "Key": "Tom" } ], "Aggregates": [ { "ReRouteKeys": [ "Tom", "Laura" ], "UpstreamPathTemplate": "http://www.likecs.com/" } ] }

当我们请求/的时候,会将/tom和/laura两个结果合并到一个response返回

{"Tom":{"Age": 19},"Laura":{"Age": 25}}

需要注意的是:

聚合服务目前只支持返回json

目前只支持Get方式请求下游服务

任何下游的response header并会被丢弃

如果下游服务返回404,聚合服务只是这个key的value为空,它不会返回404

有一些其它的功能会在将来实现

下游服务很慢的处理

做一些像 GraphQL的处理对下游服务返回结果进行处理

404的处理

限流

对请求进行限流可以防止下游服务器因为访问过载而崩溃,这个功能就是我们的张善友张队进添加进去的。非常优雅的实现,我们只需要在路由下加一些简单的配置即可以完成。

"RateLimitOptions": { "ClientWhitelist": [], "EnableRateLimiting": true, "Period": "1s", "PeriodTimespan": 1, "Limit": 1 }

ClientWihteList 白名单

EnableRateLimiting 是否启用限流

Period 统计时间段:1s, 5m, 1h, 1d

PeroidTimeSpan 多少秒之后客户端可以重试

Limit 在统计时间段内允许的最大请求数量

在 GlobalConfiguration下我们还可以进行以下配置

"RateLimitOptions": { "DisableRateLimitHeaders": false, "QuotaExceededMessage": "Customize Tips!", "HttpStatusCode": 999, "ClientIdHeader" : "Test" }

Http头  X-Rate-Limit 和 Retry-After 是否禁用

QuotaExceedMessage 当请求过载被截断时返回的消息

HttpStatusCode 当请求过载被截断时返回的http status

ClientIdHeader 用来识别客户端的请求头,默认是 ClientId

服务质量与熔断

熔断的意思是停止将请求转发到下游服务。当下游服务已经出现故障的时候再请求也是功而返,并且增加下游服务器和API网关的负担。这个功能是用的Pollly来实现的,我们只需要为路由做一些简单配置即可

"QoSOptions": { "ExceptionsAllowedBeforeBreaking":3, "DurationOfBreak":5, "TimeoutValue":5000 }

ExceptionsAllowedBeforeBreaking 允许多少个异常请求

DurationOfBreak 熔断的时间,单位为秒

TimeoutValue 如果下游请求的处理时间超过多少则自如将请求设置为超时

缓存

Ocelot可以对下游请求结果进行缓存 ,目前缓存的功能还不是很强大。它主要是依赖于CacheManager 来实现的,我们只需要在路由下添加以下配置即可

"FileCacheOptions": { "TtlSeconds": 15, "Region": "somename" }

Region是对缓存进行的一个分区,我们可以调用Ocelot的 administration API来移除某个区下面的缓存 。

认证

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyyyzy.html