Ocelot - .Net Core开源网关

作者:markjiang7m2
原文地址:http://letyouknow.net/ocelot/ocelot-tutorial-1.html
源码地址:https://gitee.com/Sevenm2/OcelotDemo

今天要给大家介绍的Ocelot是一个基于 .net core的开源WebAPI服务网关项目,它的功能非常强大,包括了路由、请求聚合、服务发现、认证鉴权、限流、负载均衡等功能。而这些功能都可以直接通过修改json配置文件即可使用,非常方便。Ocelot是系统中对外暴露的一个请求入口,所有外部接口都必须通过这个网关才能向下游API发出请求,就如地铁中的安检系统,所有人都必须经过安检才能乘坐地铁。

  • Ocelot官网:http://threemammals.com/ocelot
  • 说明文档:https://ocelot.readthedocs.io/en/latest/
  • Github:https://github.com/ThreeMammals/Ocelot

我将通过具体案例对Ocelot的功能进行一一展开说明,而本文中涉及案例的完整代码都可以从我的代码仓库进行下载。

  • 仓库地址:https://gitee.com/Sevenm2/OcelotDemo

搭建Ocelot项目

通过VS2017新建一个基于 .net core WebAPI项目,然后通过nuget直接搜索Ocelot或者使用以下命令行添加Ocelot的引用。

Install-Package Ocelot

在项目的根目录添加一个.json配置文件,文件名自定义,此案例为Ocelot.json.添加配置如下:

{"ReRoutes": [],"GlobalConfiguration": {}
}

可以看到在我们的配置文件中包含两个配置项,ReRoutes是一个数组,将会包含服务器的路由配置,GlobalConfiguration则是一个全局配置项。我会在下文中通过各种案例详细说明配置项中的具体内容以及如何使用,因此,在这里暂时不展开说明。
将该配置文件添加到 .net core configuration中
Program.cs

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>WebHost.CreateDefaultBuilder(args).ConfigureAppConfiguration((hostingContext, builder) => {builder.AddJsonFile("Ocelot.json");}).UseStartup<Startup>();

因为 .net core支持当配置文件被修改后会重新加载,所以如果我们需要支持重新加载,可修改为:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>WebHost.CreateDefaultBuilder(args).ConfigureAppConfiguration((hostingContext, builder) => {builder.AddJsonFile("Ocelot.json", optional: false, reloadOnChange: true);}).UseStartup<Startup>();

将Ocelot作为中间件注册,需要添加两个命名空间
Startup.cs

using Ocelot.DependencyInjection;
using Ocelot.Middleware;
public void ConfigureServices(IServiceCollection services)
{services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);services.AddOcelot();
}public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseMvc();app.UseOcelot().Wait();
}

至此,我们的Ocelot就已经搭建完成了。下面我们通过具体案例来说明如何修改配置进行相关功能的使用。

配置参数介绍

我们先来认识一下到底包含哪些参数,以及这些参数的含义。前面我们有介绍到,配置文件中包含两个配置项:ReRoutes和GlobalConfiguration。
我们先来看GlobalConfiguration,它是一个全局配置项,通常我们都要在这个配置项中添加一个属性BaseUrl,BaseUrl就是Ocelot服务对外暴露的Url。

"GlobalConfiguration": {"BaseUrl": "http://localhost:4727"
}

ReRoutes是一个数组,其中的每一个元素代表了一个路由,而一个路由所包含的所有可配置参数如下:

{"DownstreamPathTemplate": "/","UpstreamPathTemplate": "/","UpstreamHttpMethod": ["Get"],"AddHeadersToRequest": {},"AddClaimsToRequest": {},"RouteClaimsRequirement": {},"AddQueriesToRequest": {},"RequestIdKey": "","FileCacheOptions": {"TtlSeconds": 0,"Region": ""},"ReRouteIsCaseSensitive": false,"ServiceName": "","DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "localhost","Port": 8001,}],"QoSOptions": {"ExceptionsAllowedBeforeBreaking": 0,"DurationOfBreak": 0,"TimeoutValue": 0},"LoadBalancer": "","RateLimitOptions": {"ClientWhitelist": [],"EnableRateLimiting": false,"Period": "","PeriodTimespan": 0,"Limit": 0},"AuthenticationOptions": {"AuthenticationProviderKey": "","AllowedScopes": []},"HttpHandlerOptions": {"AllowAutoRedirect": true,"UseCookieContainer": true,"UseTracing": true},"UseServiceDiscovery": false
}
  • Downstream 下游服务配置
  • UpStream 上游服务配置
  • Aggregates 服务聚合配置
  • ServiceName, LoadBalancer, UseServiceDiscovery 服务发现配置
  • AuthenticationOptions 服务认证配置
  • RouteClaimsRequirement Claims 鉴权配置
  • RateLimitOptions 限流配置
  • FileCacheOptions 缓存配置
  • QosOptions 服务质量与熔断配置
  • DownstreamHeaderTransform 头信息转发配置

当然,我们在实际使用过程中不需要设置所有的参数,只需要根据实际需要进行配置即可。

案例一 路由

路由是Ocelot最基本的功能。Ocelot接收到来自上游服务的请求,经过验证后,将请求转发到下游服务,因此,我们首先要配置路由当中上下游服务参数。

{"DownstreamPathTemplate": "/api/ocelot/{Id}","DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "localhost","Port": 8001,}],"UpstreamPathTemplate": "/ocelot/{Id}","UpstreamHttpMethod": ["Get"]
}
  • DownstreamPathTemplate 下游请求Url模板,{}中的内容代表动态参数
  • DownstreamScheme 下游服务http scheme
  • DownstreamHostAndPorts 下游服务的地址,如果使用LoadBalancer的话这里可以填多项
  • UpstreamPathTemplate 上游也就是用户输入的请求Url模板
  • UpstreamHttpMethod 上游请求http方法,可使用数组

因此,当上游服务向地址http://localhost:4727/ocelot/5发出请求时,Ocelot会将请求转发到下游服务http://localhost:8001/api/ocelot/5
本案例提供了下游服务Demo - OcelotDownAPI,将OcelotDownAPI发布到IIS端口即可使用。下游服务在接收到请求后返回一个字符串用于表明自己的身份。

[HttpGet("{id}")]
public async Task<IActionResult> Get(int id)
{var result = await Task.Run(() =>{return $"This is from {HttpContext.Request.Host.Value}, path: {HttpContext.Request.Path}";});return Ok(result);
}

测试结果:

如果希望Ocelot能够转发所有的请求,则可以配置如下:

{"DownstreamPathTemplate": "/{url}","DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "localhost","Port": 8001,}],"UpstreamPathTemplate": "/{url}","UpstreamHttpMethod": ["Get"]
}

这样就能将所有Get请求转发到下游服务。不过这样配置的优先级是最低的,一旦匹配到其它路由模板,会优先选择。

如果希望Ocelot只转发来自某个特定上游服务Host的请求,则可以配置如下:

{"DownstreamPathTemplate": "/{url}","DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "localhost","Port": 8001,}],"UpstreamPathTemplate": "/{url}","UpstreamHttpMethod": ["Get"],"UpstreamHost": "localhost:4023"
}

这样Ocelot就只会转发来自localhost:4023的请求。需要注意的是,如果路由配置中包含两个除UpstreamHost以外都相同的路由,即其中一个带有UpstreamHost,而另外一个没有,则Ocelot会优先选择带有UpstreamHost的路由。

设置路由的优先级。我们可以定义ReRoutes路由数组中响应的优先级。0是最低的优先级,数字越大,优先级越高。

[
{"UpstreamPathTemplate": "/ocelot/{Id}""Priority": 0
},
{"UpstreamPathTemplate": "/ocelot/10""Priority": 1
},
]

总结

本文主要介绍了Ocelot的功能,并通过简单的案例讲述如何构建Ocelot网关以及对Ocelot的基本应用。由于Ocelot功能非常的强大,如果将所有的案例都放到同一篇文章中会导致篇幅过长,不便于阅读,因此,我将会针对Ocelot功能写成系列文章,希望大家继续捧场。

参考文献
本文在编写过程中引用或参考了以下文章中的部分内容,如有侵权,请联系修改或删除。
https://www.cnblogs.com/jesse2013/p/net-core-apigateway-ocelot-docs.html

转载于:https://www.cnblogs.com/letyouknowdotnet/p/10964484.html

Ocelot(一)- .Net Core开源网关相关推荐

  1. .NET Core开源API网关 – Ocelot中文文档

    Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由.请求聚合.服务发现.认证.鉴权.限流熔断.并内置了负载均衡器与Service Fabric.Butterfly ...

  2. 【Blog.Core开源】网关自定义认证鉴权与传参

    书接上文,上回咱们说到了<[Blog.Core开源]网关统一集成下游服务文档>,已经将多个下游服务统一集成到了网关里,并且也把接口文档Swagger给集成了,那今天就说一下认证和鉴权相关的 ...

  3. Ocelot.JwtAuthorize:一个基于网关的Jwt验证包

    Ocelot作为基于.net core的API网关,有一个功能是统一验证,它的作用是把没有访问权限的请求挡在API网关外面,而不是到达API网关事端的API时才去验证:之前我有一篇博文Ocelot统一 ...

  4. .net core在网关中统一配置Swagger

    最近在做微服务的时候,由于我们是采用前后端分离来开发的,提供给前端的直接是Swagger,如果Swagger分布在各个API中,前端查看Swagger的时候非常不便,因此,我们试着将Swagger集中 ...

  5. 积极拥抱.NET Core开源社区

    潘正磊在上海的Tech Summit 2018 大会上给我们的.NET Core以及开源情况带来了最新信息. .Net Core 开源后取得了更加快速的发展,目前越活跃用户高达400万人,每月新增开发 ...

  6. 首届.NET Core开源峰会

    首届.NET Core开源峰会 代号:dnc 2018 亮点:去中心化.社区驱动 开源峰会 时间:2018年5月20日 周日 地点:在线峰会.远程参与 形式:每个主题5分钟-15分钟闪电演讲 演讲方式 ...

  7. ASP.NET Core开源Web应用程序框架ABP

    "作为面向服务架构(SOA)的一个变体,微服务是一种将应用程序分解成松散耦合服务的新型架构风格. 通过细粒度的服务和轻量级的协议,微服务提供了更多的模块化,使应用程序更容易理解,开发,测试, ...

  8. 首届.NET Core开源峰会 2018年5月20日

    首届.NET Core开源峰会2018 代号:dnc 2018 亮点:去中心化.社区驱动 开源峰会 时间:2018年5月20日 周日 地点:在线峰会.远程参与.全球直播 形式:每个主题5分钟-15分钟 ...

  9. 一个基于.Net Core 开源的物联网基础平台

    在智慧工厂领域,智慧城市领域,都需要对设备进行监控.比如工厂需要对周围环境温度.湿度.气压.电压,灯的开关进行监控.这时候就需要物联网平台来进行管理. 在智慧工厂领域,宝马集团通过英伟达的Omnive ...

最新文章

  1. 利用BeanUtils在对象间复制属性
  2. TOMCAT 高并发配置
  3. python【数据结构与算法】表达式(前缀中缀后缀表达式)与Two fork tree
  4. 【机器视觉】 read_measure算子
  5. 研发和人力资源发展模式对比研究
  6. mooc作业怎么上传附件_怎么以最低价格入门hifi音响?
  7. [MicroPython]stm32f407控制DS18B20检测温度
  8. 武汉计算机应用中职学校,武汉市中职学校计算机应用基础课程抽考.Doc
  9. 高新园区到大连计算机学校,教育局 | 高新园区2018指标分配表及大连各区指标到校表(附:现行大连指标名额分配方案)...
  10. 发布文章自动上传图片并生成水印
  11. NoSQL 数据库的使用场景
  12. gg修改器偏移量修改_GG修改器偏移是怎么弄 | 手游网游页游攻略大全
  13. Ubuntu20安装向日葵
  14. (原创)用红黄蓝RYB色相环(伊登色相环)代替RGB(RGI/RGV)色相环
  15. TR069协议与商业应用6——TR069动态库开发
  16. 台达PLC编程软件PMSoft和WPLSoft爆出11个0Day 没有CVE没有补丁
  17. 我的世界学园都市java_我的世界学园都市地图整合包
  18. EntityFramework安装失败
  19. python数据类型与数据结构--内置数据类型
  20. 数学建模与数据分析中的时间序列分析

热门文章

  1. Java、Android静态代理与动态代理
  2. Android 10.0系统启动之init进程-[Android取经之路]
  3. unity天空盒渐变_「是日美好事物」野兽派带来“金色眼泪”治愈新香,LV耳机印上蓝色天空...
  4. ElasticSearch知识汇总
  5. Android 之问题集锦
  6. Flutter开发之布局-3-center(17)
  7. 均衡发展计算机教室材料,义务教育均衡发展材料.pdf
  8. Hbuilder Android证书申请
  9. exist not exist 分析
  10. python(十七)