.Net Core使用Ocelot网关(一) -负载,限流,熔断,Header转换
1.什么是API网关
API网关是微服务架构中的唯一入口,它提供一个单独且统一的API入口用于访问内部一个或多个API。它可以具有身份验证,监控,负载均衡,缓存,请求分片与管理,静态响应处理等。API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。通常,网关也是提供REST/HTTP的访问API。服务端通过API-GW注册和管理服务。
Ocelot介绍
Ocelot是用.net Core实现的一款开源的网关,Ocelot其实就是一组按照顺序排列的.net core中间件。它接受到请求之后用request builder构建一个HttpRequestMessage对象并发送到下游服务,当下游请求返回到Ocelot管道时再由一个中间件将HttpRequestMessage映射到HttpResponse上返回客户端。
使用Ocelot傻瓜式转发
新建三个项目webApi项目,分别命名为ApiGateway,Api_A,Api_B

设置Api_A端口为5001,Api_B端口为5002,ApiGateway为5000
为ApiGateway项目安装Ocelot,在Nuget中搜索Ocelot或者直接使用Install-Package Ocelot进行安装。最新版本为13.8.x支持core3.0。
在ApiGateway新建一个configuration.json配置文件。
{
"ReRoutes": [
{
//上游Api请求格式
"UpstreamPathTemplate": "/Api_A/{controller}/{action}",
//网关转发到下游格式
"DownstreamPathTemplate": "/api/{controller}/{action}",
//上下游支持请求方法
"UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ],
"DownstreamScheme": "http",
//下游服务配置
"DownstreamHostAndPorts": [
{
//下游地址
"Host": "localhost",
//下游端口号
"Port": 5001
}
]
},
{
"UpstreamPathTemplate": "/Api_B/{controller}/{action}",
"DownstreamPathTemplate": "/api/{controller}/{action}",
"UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ],
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 5002
}
]
}
]
}
在Startup.cs 的ConfigureServices和Configure中配置Ocelot
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddOcelot(new ConfigurationBuilder()
.AddJsonFile("configuration.json")
.Build());
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseOcelot();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();
}
分别为Api_A,和Api_B分别添加一个print接口。
[HttpGet("print")]
public string Print()
{
return "Api_A";
}
[HttpGet("print")]
public string Print()
{
return "Api_B";
}
测试网关
启动三个项目,使用postman来调用网关
访问Api_A服务

访问Api_B服务

可以看到网关通过接受到的请求的Url后通过我们的配置自动转发到了我们想要访问的服务。
网关的负载均衡
当下游拥有多个节点的时候,我们可以用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了

总结
简单的实现了通过网关来访问api接口。ocelot功能远不止这些,之后会实现与IdentityServer的认证鉴权。服务发现。
.Net Core使用Ocelot网关(一) -负载,限流,熔断,Header转换的更多相关文章
- .Net Core的API网关Ocelot的使用(二)[负载,限流,熔断,Header转换]
网关的负载均衡 当下游拥有多个节点的时候,我们可以用DownstreamHostAndPorts来配置 { "UpstreamPathTemplate": "/Api_A ...
- .Net微服务实践(四)[网关]:Ocelot限流熔断、缓存以及负载均衡
目录 限流 熔断 缓存 Header转化 HTTP方法转换 负载均衡 注入/重写中间件 后台管理 最后 在上篇.Net微服务实践(三)[网关]:Ocelot配置路由和请求聚合中我们介绍了Ocelot的 ...
- .net core使用ocelot---第四篇 限流熔断
简介 .net core使用ocelot---第一篇 简单使用 .net core使用ocelot---第二篇 身份验证 .net core使用ocelot---第三篇 日志记录 前几篇文章我们陆续介 ...
- Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Ocelot+Polly缓存、限流、熔断、降级
相关文章 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Consul服务注册,服务发现 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-网 ...
- ASP.NET Core中使用漏桶算法限流
漏桶算法是限流的四大主流算法之一,其应用场景各种资料中介绍的不多,一般都是说应用在网络流量控制中.这里举两个例子: 1.目前家庭上网都会限制一个固定的带宽,比如100M.200M等,一栋楼有很多的用户 ...
- Hystrix介绍以及服务的降级限流熔断
(dubbo熔断,Hystrix问的少) 无论是缓存层还是存储层都会有出错的概率,可以将它们视同为资源.作为并发量较大的系统,假如有一个资源不可用,可能会造成线程全部 hang (挂起)在这个资源上, ...
- springBoot整合Sentinel实现降级限流熔断
由于hystrix的停止更新,以及阿里Sentinel在历年双十一的贡献.项目中使用了Sentinel,今天我们来讲讲Sentinel的入门教程,本文使用1.6.3版本进行讲解 本文通过Sentine ...
- DBPack 限流熔断功能发布说明
上周我们发布了 v0.4.0 版本,增加了限流熔断功能,现对这两个功能做如下说明. 限流 DBPack 限流熔断功能通过 filter 实现.要设置限流规则,首先要定义 RateLimitFilter ...
- .Net Core使用Ocelot网关(二) -鉴权认证
前言 上一章已经简单的介绍了ocelot的使用了,但是网关暴露的接口如果什么人都能访问的话安全性就太低啦.所以我们需要去鉴权和认证.这里我们使用identityServer4给我们的网关来鉴权认证. ...
随机推荐
- 模拟示例raid 5(5块磁盘 3块做raid 2块做备份 ) raid 10(5块磁盘) 修改版
RAID5:需要至少三块(含)硬盘,兼顾存储性能.数据安全和储存成本. RAID10:需要至少四块(含)硬盘,兼具速度和安全性,但成本很高. raid 10(5块磁盘) 1.添加硬盘设备(添加5块) ...
- OTA升级详解(三)
君子知夫不全不粹之不足以为美也, 故诵数以贯之, 思索以通之, 为其人以处之, 除其害者以持养之: 出自荀子<劝学篇> 终于OTA的升级过程的详解来了,之前的两篇文章OTA升级详解(一)与 ...
- ARP通信
ARP:地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议 简单介绍ARP通信过程: 1.发送端在与接收端进行数据通信转发时的过程: 发送端与接收端进行数据通信之前,需要先知道对端的MAC ...
- DNS服务反向解析及过程中一些小问题解决
在此需要了解一下,反向解析的作用是根据IP地址查找到对应的主机名(域名),在区域文件(named.rfc1912.zones)中默认已存在一些注释内容与区域信息,可不需要删除上面实验及默认区域信息,直 ...
- MySQL每个分类的前几条记录
MySQL 获取所有分类和每个分类的前几条记录 比如有文章表 Article(Id,Category,InsertDate) 现在要用SQL找出每种类型中时间最新的前N个数据组成的集合 SELECT ...
- PHP Laravel-包含你自己的帮助函数
你可能想创建一个在应用的任何地方都可以访问的函数,这个教程将帮你实现
- PHP 在 Laravel 中动态隐藏 API 字段
我最近在 Laravel Brasil 社区看到一个问题,结果比看起来更有趣.想象一下你有一个 UsersResource 用下面的实现: <?php namespace App\Http\Re ...
- scrapy介绍及使用
scrapy的流程 其流程可以描述如下: 调度器把requests-->引擎-->下载中间件--->下载器 下载器发送请求,获取响应---->下载中间件---->引擎-- ...
- Java内存模型与volatile关键字
Java内存模型与volatile关键字 一).并发程序开发 并行程序的开发要涉及多线程.多任务间的协作和数据共享问题. 常用的并发控制:内部锁.重入锁.读写锁.信号量. 二).线程的特点 线程的特点 ...
- 微信二维码添加logo
生成带参数的二维码 为了满足用户渠道推广分析和用户帐号绑定等场景的需要,公众平台提供了生成带参数二维码的接口.使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送. 目前有 ...