.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 的ConfigureServicesConfigure中配置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的认证鉴权。服务发现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312705.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【STM32】STM32学习笔记-TIM定时中断(13)

00. 目录 文章目录 00. 目录01. TIM简介02. 定时器类型03. 基本定时器04. 通用定时器05. 高级定时器06. 定时中断基本结构07. 预分频器时序08. 计数器时序09. 计数器无预装时序10. 计数器有预装时序11. RCC时钟树12. 附录 01. TIM简介 TIM(Timer)定时器…

你知道怎么使用DebugView查看调试信息吗?

简介 DebugView是sysinternals工具集中的一款用来查看调试信息的工具。不管你是内核开发人员还是应用程序开发人员,都会用到这款神器。先简单看看DebugView可以干什么吧。可以查看应用程序输出的调试信息。可以查看驱动程序输出的调试信息。可以查看本地机器的调试信…

使用ASP.NET Core 3.x 构建 RESTful API - 3.3.3 ProblemDetails

当ASP.NET Core 大约在 2.1 版本的时候,它引入了 ProblemDetails。ProblemDetails是基于 RFC7807 这个规范,目的是让 HTTP 响应可以携带错误的详细信息,而不是只返回一个错误的状态码。 在 ASP.NET Core 2.2的时候,如果Controller…

(译)An introduction to Kubernetes

原文:https://www.jeremyjordan.me/kubernetes/(博客园团队推荐的)这篇博客文章将对Kubernetes进行介绍,以便您了解该工具背后的动机,含义以及使用方式。在后续文章中,我将讨论如何使用更具体的&#xff08…

WeihanLi.Npoi 支持 ShadowProperty 了

WeihanLi.Npoi 支持 ShadowProperty 了Intro在 EF 里有个 ShadowProperty (阴影属性/影子属性)的概念,你可以通过 FluentAPI 的方式来定义一个不在 .NET model 里定义的属性,只能通过 EF 里的 ChangeTracker 来操作这种属性。在导出 Excel 的时候&#x…

RNN循环神经网络概述

RNN与普通神经网络的区别:能够更好的处理序列的信息 RNN结构图 如图所示,St的值不仅取决于输入X的值,还取决于St-1的值。同时,St-1的值还取决于St-2的值,因此S1,S2,…,St-1的值都与St的值直接或间接相关,…

Dapr 运用

前置条件DockerWin10Dapr 部署本文将采用本地部署的方式。安装 Dapr CLI打开 Windows PowerShell 或 cmd ,运行以下命令以安装 Dapr CLI,并添加安装路径到系统环境变量中。powershell -Command "iwr -useb https://raw.githubusercontent.com/dapr/…

微软将中止支持 .NET Core 2.2,建议开发者升级至 .NET Core 3.1

Current 版本 .NET Core 2.2 将在 12 月 23 日结束生命周期,开发者应更新到长期支持版本 .NET Core 3.1。.NET Core 2.2 于 2018 年 12 月 4 日发布,作为一个非 LTS 版本(“Current”),它只在下一个版本发布后的三个月内受支持。.NET Core 3.…

使用.NET Core创建Windows服务 - 使用.NET Core工作器方式

原文:Creating Windows Services In .NET Core – Part 3 – The “.NET Core Worker” Way作者:Dotnet Core Tutorials译者:Lamond Lu译文:使用.NET Core创建Windows服务 - 使用.NET Core工作器方式使用.NET Core创建Windows服务…

【译】Visual Studio 2019 中 WPF UWP 的 XAML 开发工具新特性

原文 | Dmitry翻译 | 郑子铭自Visual Studio 2019推出以来,我们为使用WPF或UWP桌面应用程序的XAML开发人员发布了许多新功能。在本周的 Visual Studio 2019 版本 16.4 和 16.5 Preview 1中,我们希望借此机会回顾一下全年的新变化。如果您错过了我们以前的…

我在外包公司做增删改查有前途么?

作者:邹溪源,长沙资深互联网从业者,架构师社区特邀嘉宾!起因这是我无意中在筛选简历时,看到一位朋友发布的求职说明中,明确指出,外包勿扰,并给出了他做出这个决定的理由:…

[译]C#8.0中一个使接口更加灵活的新特性-默认接口实现

9月份的时候,微软宣布正式发布C#8.0,作为.NET Core 3.0发行版的一部分。C#8.0的新特性之一就是默认接口实现。在本文中,我们将一起来聊聊默认接口实现。众所周知,对现有应用程序的接口进行更改是一项很危险的操作。如果这个接口又…

鲲鹏来了,在EulerOS试用.NETCore-3.1

在EulerOS试用.NETCore-3.1前言EulerOS其实出来有一段时间了,一直在关注,单是仅仅也只是停留在观望的阶段,目前还没有接入的打算;正好看到园子里的兄弟分享了华为云免费试用的活动后,难捺激动的心情,我马上…

如何在ASP.NET Core 中快速构建PDF文档

比如我们需要ASP.NET Core 中需要通过PDF来进行某些简单的报表开发,随着这并不难,但还是会手忙脚乱的去搜索一些资料,那么恭喜您,这篇帖子会帮助到您,我们就不会再去浪费一些宝贵的时间。在本文中我们将要使用DinkToPD…

在VS2019发布独立程序与单一执行程序

背景随着.NET Core 3.1 LTS的发布,.NET Core 3.1 进入了3年的支持周期,在这期间使用.NET 的人数肯定会发生一个质的飞跃。01目标本次主要集中在使用.NET Core 3.1 WPF程序发布一个独立的单一执行程序。首先,新建一个wpf项目,名称为…

C#异步编程看这篇就够了

随着.NET Core的流行,相信你现在的代码中或多或少的会用到async以及await吧!毕竟已成标配。那么我们为什么要用async以及await呢?其实这是微软团队为我们提供的一个语法糖,让我们不用996就可以轻松的编写异步代码,并无…

2019 AI Bootcamp·Guangzhou 参会日记

2019年的全球AI训练营在北京、上海、广州、杭州、宁波五个地方同时举办!12月14日,微软全球AI Bootcamp活动再次驾临广州,本次会议结合 ML.NET 和基于 SciSharp 社区介绍最新的基于 .NET Core 人工智能技术,还有云端人工智能解决方…

AI Boot Camp 分享之 ML.NET 机器学习指南

今天在中国七城联动,全球134场的AI BootCamp胜利落幕,广州由卢建晖老师组织,我参与分享了一个主题《ML.NET 机器学习指南和Azure Kinect .NET SDK概要》,活动虽然只有短短的2天时间的宣传,报名70人,到场40多…

使用 Ocelot 匹配路由的方法匹配路由

使用 Ocelot 匹配路由的方法匹配路由Intro之前我们在 Ocelot 网关的基础上自定义了一个认证授权的 Ocelot 中间件,根据请求的路径和 Method 进行匹配,找到对应的权限配置,并判断是否可以拥有访问资源的角色,如果没有则返回 401/40…

【.NET Core 3.1】 策略授权中获取权限数据

▼更多精彩推荐,上午11点到达▼随着项目关注度渐渐升高,目前已经1.2k个star,我的内心反而更加的惶恐了起来,最近也是很有强迫症,只要有小伙伴反馈项目的问题,就很着急,哪怕一丁点的问题&#xf…