.Net Core的API网关Ocelot的使用(二)[负载,限流,熔断,Header转换]
网关的负载均衡
当下游拥有多个节点的时候,我们可以用DownstreamHostAndPorts来配置
{
"UpstreamPathTemplate": "/Api_A/{controller}/{action}",
"DownstreamPathTemplate": "/api/{controller}/{action}",
"DownstreamScheme": "https",
"LoadBalancer": "LeastConnection",
"UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ],
"DownstreamHostAndPorts": [
{
"Host": "127.0.0.1",
"Port": 5001,
},
{
"Host": "127.00.1",
"Port": 5002,
}
],
}
LoadBalancer是来决定负载的算法
- LeastConnection:将请求发往最空闲的那个服务器
- RoundRobin:轮流转发
- NoLoadBalance:总是发往第一个请求或者是服务发现
限流
限流可以防止上下游服务器因为过载而崩溃,可以使用RateLimitOptions来配置限流
{
"RateLimitOptions": {
"ClientWhitelist": [“127.0.0.1”],
"EnableRateLimiting": true,
"Period": "5s",
"PeriodTimespan": 1,
"Limit": 10
}
}
- ClientWihteList:白名单,不受限流控制。
- EnableRateLimiting:使用启用限流。
- Period:限流控制的时间段 1s, 5m, 1h, 1d。
- PeroidTimeSpan:超过限流限制的次数后,需要等待重置的时间(单位是秒)。
- Limit:在限流控制时间段内最大访问数。
对于除了请求头中ClientId=127.0.0.1的意外所有求情启用限流,5秒该api最多10次,如果达到10次需要从第10次请求闭合后等待一秒进行下一次访问。
超过限流后会返回429状态码,并在在返回头(Response Header)的Retry-After属性中返回等待重置时间。


限流的默认提示,code码,和限制标志都是可以自己配置的
{
"GlobalConfiguration": {
"BaseUrl":"www.baidu.com",
"RateLimitOptions": {
"DisableRateLimitHeaders": false,
"QuotaExceededMessage": "接口限流!",
"HttpStatusCode": 200,
"ClientIdHeader": "ClientId"
}
}

- DisableRateLimitHeaders:是否显示X-Rate-Limit和Retry-After头
- QuotaExceededMessage:提示信息
- HttpStatusCode:状态码
- ClientIdHeader:用来设别客户请求头,默认为ClientId。
- BaseUrl 网关暴露的的地址。
熔断
熔断是在下游服务故障或者请求无响应的时候停止将请求转发到下游服务。
{
"QoSOptions": {
"ExceptionsAllowedBeforeBreaking": 3,
"DurationOfBreak": 20,
"TimeoutValue": 5000
}
}
- ExceptionsAllowedBeforeBreaking:允许多少个异常请求。
- DurationOfBreak:熔断的时间(秒)。
- TimeoutValue:下游请求的处理时间超过多少则将请求设置为超时。
缓存
Ocelot可以对下游请求结果进行缓存,主要是依赖于CacheManager来实现的。
{
"FileCacheOptions": {
"TtlSeconds": 60,
"Region": "key"
}
}
- TtlSeconds:缓存时间(秒)。
- Region:缓存分区名
我们可以调用Ocelot的API来移除某个区下面的缓存 。
请求头的转化
Ocelot允许在请求下游服务之前和之后转换Header.目前Ocelot只支持查找和替换.
如果们需要转发给下游的Header重添加一个key/value
{
"UpstreamHeaderTransform": {
"demo": "xxxxxxx"
}
}
如果们需要在返回给客户端的的Header中添加一个key/value
{
"DownstreamHeaderTransform": {
"demo": "xxxxxxx"
}
}
如果我们需要替换Heaher中某些值
{
//请求
"UpstreamHeaderTransform": {
"demo": "a,b"
},
//响应
"DownstreamHeaderTransform":
{
"demo": "a,b"
}
}
语法是{find},{replace}, 利用b取代a
在Header转换中可以使用占位符
- {BaseUrl} - 这个是Ocelot暴露在外的url. 例如http://localhost:5000/.
- {DownstreamBaseUrl} - 这个是下游服务的基本url 例如http://localhost:5001/. 目前这个只在DownstreamHeaderTransform中起作用.
- {TraceId} - 这个是Butterfly的跟踪id.目前这个也只在DownstreamHeaderTransform中起作用
如果您想将location头返回给客户端,可能需要将location更改为Ocelot的地址而不是下游服务地址。 Ocelot可以使用以下配置实现。
{
"DownstreamHeaderTransform": {
"Location": "{DownstreamBaseUrl},{BaseUrl}"
},
}
给Header中添加下游地址

响应的Header中已经替换成BaseUrl了

总结
简单的配置了Ocelot的负载,限流,熔断,Header转换。具体配置还需要结合业务去搭配。下一次会给Ocelot集成Identity认证,鉴权。
.Net Core的API网关Ocelot的使用(二)[负载,限流,熔断,Header转换]的更多相关文章
- .Net Core使用Ocelot网关(一) -负载,限流,熔断,Header转换
1.什么是API网关 API网关是微服务架构中的唯一入口,它提供一个单独且统一的API入口用于访问内部一个或多个API.它可以具有身份验证,监控,负载均衡,缓存,请求分片与管理,静态响应处理等.API ...
- .NET Core开源API网关 – Ocelot中文文档
Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由.请求聚合.服务发现.认证.鉴权.限流熔断.并内置了负载均衡器与Service Fabric.Butterfly ...
- .Net Core的API网关Ocelot使用 (一)
1.什么是API网关 API网关是微服务架构中的唯一入口,它提供一个单独且统一的API入口用于访问内部一个或多个API.它可以具有身份验证,监控,负载均衡,缓存,请求分片与管理,静态响应处理等.API ...
- 初探.Net Core API 网关Ocelot(一)
一.介绍 Ocelot 是基于.NetCore实现的开源的API网关,支持IdentityServer认证.Ocelot具有路由.请求聚合.服务发现.认证.鉴权.限流熔断等功能,并内置了负载均衡器与S ...
- .net core Ocelot Consul 实现API网关 服务注册 服务发现 负载均衡
大神张善友 分享过一篇 <.NET Core 在腾讯财付通的企业级应用开发实践>里面就是用.net core 和 Ocelot搭建的可扩展的高性能Api网关. Ocelot(http:// ...
- .NET Core 微服务—API网关(Ocelot) 教程 [一]
前言: 最近在关注微服务,在 eShop On Containers 项目中存在一个API网关项目,引起想深入了解下它的兴趣. 一.API网关是什么 API网关是微服务架构中的唯一入口,它提供一个单独 ...
- .NET Core 微服务—API网关(Ocelot) 教程 [二]
上篇文章(.NET Core 微服务—API网关(Ocelot) 教程 [一])介绍了Ocelot 的相关介绍. 接下来就一起来看如何使用,让它运行起来. 环境准备 为了验证Ocelot 网关效果,我 ...
- .NET Core 微服务—API网关(Ocelot) 教程 [三]
前言: 前一篇文章<.NET Core 微服务—API网关(Ocelot) 教程 [二]>已经让Ocelot和目录api(Api.Catalog).订单api(Api.Ordering)通 ...
- .NET Core 微服务—API网关(Ocelot) 教程 [四]
前言: 上一篇 介绍了Ocelot网关和认证服务的结合使用,本篇继续介绍Ocelot相关请求聚合和Ocelot限流 一.请求聚合 Ocelot允许声明聚合路由,这样可以把多个正常的Routes打包并映 ...
随机推荐
- 搞清楚 Python 的迭代器、可迭代对象、生成器
很多伙伴对 Python 的迭代器.可迭代对象.生成器这几个概念有点搞不清楚,我来说说我的理解,希望对需要的朋友有所帮助. 1 迭代器协议 迭代器协议是核心,搞懂了这个,上面的几个概念也就很好理解了. ...
- vue实现tab选项卡切换效果
tab选项卡切换效果: 通过点击事件传入参数,然后通过v-show来进行切换显示 <template> <div class="box"> <div ...
- 2.4g和5g无线使用频率
- Servlet相关学习
Servlet入门解析 概念 运行在服务器端的小程序 servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则 实现servlet接口.复写方法 快速入门 创建web项目 ...
- 全网阅读过20k的Java集合框架常见面试题总结!
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.欢迎 Sta ...
- nyoj 34-韩信点兵(暴力)
34-韩信点兵 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:34 submit:41 题目描述: 相传韩信才智过人,从不直接清点自己军队的人数,只 ...
- jQuery—— 选择器汇总
jQuery里的选择器有3种: 元素选择器,id选择器, 类选择器: $("div") // 选择所有<div>元素 $("#test") // ...
- Python常用模块之os.path
os.path.abspath(path) 输入相对路径,返回绝对路径 Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1 ...
- 力扣(LeetCode)平方数之和 个人题解
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c. 示例1: 输入: 5 输出: True 解释: 1 * 1 + 2 * 2 = 5 示例2: 输入: 3 ...
- Ubuntu 16.04 安装Maven3.3.9
1 下载地址 http://maven.apache.org/download.cgi 2 将下载到的apache-maven-3.3.9-bin.tar.gz文件上传到/temp目录下,然后切换到r ...