Ocelot简易教程(三)之主要特性及路由详解

作者:依乐祝
原文地址:https://www.cnblogs.com/yilezhu/p/9664977.html

上篇《Ocelot简易教程(二)之快速开始2》教大家如何快速跑起来一个ocelot实例项目,也只是简单的对Ocelot进行了配置,这篇文章会给大家详细的介绍一下Ocelot的配置信息。希望能对大家深入使用Ocelot有所帮助。

上篇中也提到了,最简单的Ocelot如下面所示,只有简单的两个节点,一个是ReRoutes,另一个就是GlobalConfiguration关于这两个节点的作用,上篇也已经讲述了,这里再简单的讲下ReRoutes:告诉Ocelot如何处理上游的请求。GlobalConfiguration:顾名思义就是全局配置,此节点的配置允许覆盖ReRoutes里面的配置,你可以在这里进行通用的一些配置信息。

640?wx_fmt=png

下面呢给出ReRoute 的所有的配置信息,当然在实际使用的时候你没有必要全部进行配置,只需要根据你项目的实际需要进行相关的配置就可以了。

640?wx_fmt=png

640?wx_fmt=png

当然上面的配置项我就不一一的进行介绍,因为很多配置相信大家根据意思都能知道个大概了。我只会对比较常用的配置做下介绍。而且在接下来的文章中对对每个节点进行单独的详细的介绍。在介绍之前呢先看Ocelot的几个特性。

Ocelot特性介绍

合并配置文件

这个特性允许用户创建多个配置文件来方便的对大型项目进行配置。试想一下,如果你的项目有几十个路由规则需要配置的话,那么在一个配置文件进行配置应该很痛苦吧,有了这个特性后,你就可以创建多个配置文件。Ocelot会自动合并他们。
在加载配置文件的时候 你可以通过下面的方式来调用AddOcelot()方法来替换直接加载某个配置的写法 如:AddJsonFile(“ocelot.json”)

640?wx_fmt=png

在这种情况下,Ocelot会寻找所有匹配了 (?i)ocelot.([a-zA-Z0-9]*).json 的文件,然后合并他们。如何你要设置GlobalConfiguration 属性,那么你需要建立一个ocelot.global.json 的文件来进行全局的配置。

这里上一个例子吧!可以方便大家的理解。

新建一个ocelot.good.json文件,并加入下面的配置:

640?wx_fmt=png

然后再新建一个ocelot.order.json文件,并加入下面的配置:

640?wx_fmt=png

最后新建一个ocelot.all.json文件,并把上篇文章中的路由拷贝到里面:

640?wx_fmt=png

然后修改下,Program.cs文件中的代码如下:

640?wx_fmt=png

这里最重要的代码就是config.AddOcelot()了。这段代码就会按照上面的规则查找所有符合条件的文件并合并路由。合并后的代码如下:

640?wx_fmt=png

640?wx_fmt=png

Ocelot的合并方式是先对满足格式的文件遍历查找,然后循环加载他们,并提取所有的ReRoutes以及AggregateReRoutes 的数据。如果发现ocelot.global.json ,则添加到GlobalConfiguration 中。然后Ocelto会将合并后的配置保存在ocelot.json的文件中,当Ocelot运行时会加载这个合并后的ocelot.json文件,从而加载了所有的配置。

注意:这里需要注意的是Ocelot在合并的过程中不会对内容进行验证,只有在最终合并的配置进行校验,所以如果发现问题的话,那么你需要检查最终生成的ocelot.json 是否出错了!

在consul中存储配置

这里你首先要做的就是安装Ocelot中提供的Consul的NuGet包,Nuget安装方式:

Install-Package Ocelot.Provider.Consul

然后在注册服务时添加如下内容:Ocelot将会尝试在Consul KV存储并加载配置。

640?wx_fmt=png

当然你还得把下面的配置添加到你的ocelot.json文件中。这里定义Ocelot如何查找Consul根并从Consul中加载并存储配置.

640?wx_fmt=png

变化时重新加载配置文件

Ocelot支持在配置文件发生改变的时候重新加载json配置文件。在加载ocelot.json文件的时候按照下面进行配置,那么当你手动更新ocelot.json文件时,Ocelot将重新加载ocelot.json配置文件。

config.AddJsonFile("ocelot.json",optional:false,reloadOnChange: true);

配置Key

如果你使用Consul进行配置,你可能需要配置Key以便区分多个配置,为了指定Key,你需要在json配置文件中的ServiceDiscoveryProvider部分设置ConfigurationKey属性:

640?wx_fmt=png

在此实例中,Ocelot将会在Consul查找时使用Oceolot_A 作为配置的Key.如果没有设置ConfigurationKey 则Ocelot将使用字符串InternalConfiguration 作为此配置的Key

跟踪重定向和使用CookieContainer

在ReRoute配置中可以使用HttpHandlerOptions来设置HttpHandler行为:

  1. AllowAutoRedirect是一个值,指示请求是否应遵循重定向响应。如果请求应自动遵循来自下游资源的重定向响应,则将其设置为true; 否则是假的。默认值为false。

  2. UseCookieContainer是一个值,指示处理程序是否使用CookieContainer属性存储服务器cookie并在发送请求时使用这些cookie。默认值为false。请注意,如果您使CookieContainer,则Ocelot会为每个下游服务缓存HttpClient。这意味着对该DownstreamService的所有请求将共享相同的cookie。

SSL 错误处理

如果你想忽略SSL 警告/错误,你可以在你的ReRoute 配置中加上如下配置:

"DangerousAcceptAnyServerCertificateValidator": false

当然作者是不建议这样做的,最好的方式是创建你本地以及远程所信任的证书。

Ocelot路由详解

路由

Ocelot的最主要的功能是接收传入的http请求并将其转发到下游服务。

Ocelot使用ReRoute节点描述将一个请求路由到另一个请求。为了让路由在Ocelot中起作用,您需要在配置中设置ReRoute:

640?wx_fmt=png

要配置ReRoute,您需要在ReRoutes json数组中至少添加一个:

640?wx_fmt=png

DownstreamPathTemplate,DownstreamScheme和DownstreamHostAndPorts定义请求将转发到的URL。

DownstreamHostAndPorts是一个集合,用于定义您希望将请求转发到的任何下游服务的主机和端口。通常这只包含一个条目,但有时你希望对下游请求服务进行负载均衡,这个时候你就可以添加多个条目,并配合负载均衡选项进行相关的负载均衡设置。

UpstreamPathTemplate是Ocelot用于标识要用于给定请求的DownstreamPathTemplate对应的URL。使用UpstreamHttpMethod以便Ocelot可以区分具有不同HTTP谓词的请求到相同的URL。您可以设置特定的HTTP方法列表,也可以设置一个空列表以允许所有的。

在Ocelot中,您可以以{something}的形式将变量的占位符添加到模板中。占位符变量需要同时出现在DownstreamPathTemplate和UpstreamPathTemplate属性中。请求时Ocelot将尝试请求时进行替换。

你也可以像下面这样配置,捕获所有的路由:

640?wx_fmt=png

这个配置将会把路径+查询字符串统统转发到下游路由.

注意:默认的ReRouting的配置是不区分大小写的,如果需要修改此配置,可以通过下面进行配置:

"ReRouteIsCaseSensitive": true

这意味着Ocelot将尝试将传入的上游URL与上游模板匹配时,区分大小写。

全部捕获

Ocelot的路由还支持捕获所有样式路由,用户可以指定他们想要匹配所有请求。

如果您设置如下所示的配置,则所有请求都将直接代理。占位符{url}名称不重要,任何名称都可以使用。

640?wx_fmt=png

上面配置的全部捕获的优先级低于任何其他法人ReRoute。如果您的配置中还有下面的ReRoute,那么Ocelot会在全部捕获之前匹配它。

640?wx_fmt=png

上游主机

此功能允许您根据上游主机获得ReRoutes。这通过查看客户端使用的主机头,然后将其用作我们用于识别ReRoute的信息的一部分来工作。

要使用此功能,请在配置中添加以下内容。

640?wx_fmt=png

仅当主机标头值为yilezhu.cn时,才会匹配上面的ReRoute。

如果您没有在ReRoute上设置UpstreamHost,那么任何主机头都将与之匹配。这意味着如果你有两个相同的ReRoutes,除了UpstreamHost,其中一个为null而另一个不为null 那么Ocelot将支持已设置的那个。

优先级

你可以通过ocelot.json文件的ReRoutes节点中的Priorty属性来设置匹配上游HttpRequest的优先级顺序
比如,下面两个路由:

{    "UpstreamPathTemplate": "/goods/{catchAll}""Priority": 0}

以及

{    "UpstreamPathTemplate": "/goods/delete""Priority": 1}

上面两个路由中,如果向Ocelot发出的请求时/goods/delete格式的话,则Ocelot会优先匹配/goods /delete 的路由。

动态路由

作者的想法是在使用服务发现提供程序时启用动态路由,这样您就不必提供ReRoute的配置。我们会在服务发现那一章进行详细的介绍。

查询字符串

Ocelot允许您指定一个查询字符串作为DownstreamPathTemplate的一部分,如下例所示。

640?wx_fmt=png

在此示例中,Ocelot将使用上游路径模板中{unitId}的值,并将其作为名为unitId的查询字符串参数添加到下游请求中!

Ocelot还允许您将查询字符串参数放在UpstreamPathTemplate中,以便您可以将某些查询与某些服务匹配。

640?wx_fmt=png

在此示例中,Ocelot将仅匹配具有匹配的url路径的请求,并且查询字符串以unitId = something开头。您可以在此之后进行其他查询,但必须以匹配参数开头。此外,Ocelot将交换查询字符串中的{unitId}参数,并在下游请求路径中使用它。

源码地址

当然是放上实例中的源码地址了:https://github.com/yilezhu/OcelotDemo


总结

本文主要是对Ocelot的新特性以及路由进行详细的介绍,这些介绍对你使用ocelot会有很大的帮助。下篇文章呢,我会对请求聚合以及服务发现以及动态路由进行记录,敬请期待!同时需要说明一点是,本文大部分内容是翻译自官方文档,当然中间穿插着自己在使用过程中一些理解,希望大家能够喜欢!

相关文章:

  • AspNetCore中使用Ocelot之 IdentityServer4

  • Ocelot-基于.NET Core的开源网关实现

  • .NET Core微服务之基于Ocelot+IdentityServer实现统一验证与授权

  • Swagger如何访问Ocelot中带权限验证的API

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

  • .NET Core微服务之基于Ocelot实现API网关服务

  • .NET Core微服务之基于Ocelot实现API网关服务(续)

  • .NET微服务体系结构中为什么使用Ocelot实现API网关

  • Ocelot简易教程(一)之Ocelot是什么

  • Ocelot简易教程(二)之快速开始1

  • Ocelot简易教程(二)之快速开始2

原文地址: https://www.cnblogs.com/yilezhu/p/9664977.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

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

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

相关文章

P4245-[模板]任意模数多项式乘法

正题 题目链接:https://www.luogu.com.cn/problem/P4245 题目大意 两个多项式,求它们的乘积模ppp。 解题思路 方法好像挺多,我用的是最简单的一种就是,先定一个常数sqqsqqsqq(一般是q\sqrt qq​),把一个…

Poj 3070 Fibonacci

Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26063 Accepted: 17394文章目录Description题意:题解:代码:Poj 3070 FibonacciDescription In the Fibonacci integer sequence, F0 0, F1 1, and Fn Fn − 1 Fn − 2 for…

生成函数化简技巧

一些重要式子 ∑i0∞xi11−x\sum_{i0}^{\infty}x^i\frac{1}{1-x}∑i0∞​xi1−x1​ 推论: 11−ax∑i0∞aixi\frac{1}{1-ax}\sum_{i0}^{\infty}a^ix^i1−ax1​∑i0∞​aixi 11−xk∑i0∞xik\frac{1}{1-x^k}\sum_{i0}^{\infty}x^{ik}1−xk1​∑i0∞​xik 11−cxk∑i0∞…

.NET西安社区 [拥抱开源,又见 .NET] 活动简报

拥抱开源, 又见 .NET」随着 .NET Core的发布和开源,.NET又重新回到了人们的视野。除了开源、跨平台、高性能以及优秀的语言特性,越来越多的第三方开源库也出现在了Github上——包括ML.NET机器学习、Xamarin移动开发平台、基于Actor模型的分布式框架Orlea…

HDU 2504 又见GCD

HDU 2504 文章目录Problem Description题解&#xff1a;代码&#xff1a;Problem Description 有三个正整数a,b,c(0<a,b,c<10^6)&#xff0c;其中c不等于b。若a和c的最大公约数为b&#xff0c;现已知a和b&#xff0c;求满足条件的最小的c。 Input 第一行输入一个n&#x…

【线段树】【LCT】【LCA】树点涂色(luogu 3703)

树点涂色 luogu 3703 题目大意 给出一棵树&#xff0c;每个节点的初始颜色不同&#xff0c;做若干操作&#xff1a; 1.在一个点到根节点路径上染上一种新的颜色 2.查询一条路径上有多少种不同的颜色 3.查询一个点x&#xff0c;使该点到根节点路径的不同颜色种数最多 输入样…

P3515-[POI2011]Lightning Conductor【整体二分,决策单调性】

正题 题目链接:https://www.luogu.com.cn/problem/P3507 题目大意 nnn个数字的一个序列aaa&#xff0c;对于每个位置iii求一个pip_ipi​使得对于任意jjj满足 piai−∣i−j∣≥pjp_ia_i-\sqrt{|i-j|}\geq p_jpi​ai​−∣i−j∣​≥pj​ 解题思路 化简一下发现我们是需要求出m…

关于二项式

组合数 (nm)\dbinom{n}{m}(mn​)&#xff1a;从 nnn 个物品中选出 mmm 个的方案数。 (nm)n!m!(n−m)!nm‾m!\dbinom{n}{m}\dfrac{n!}{m!(n-m)!}\dfrac{n^{\underline{m}}}{m!}(mn​)m!(n−m)!n!​m!nm​​ &#xff08;这个式子只依靠经典的组合意义&#xff0c;所以只在 0≤m≤…

dotnet core高吞吐Http api服务组件FastHttpApi

简介是dotNet core下基于Beetlex实现的一个高度精简化和高吞吐的HTTP API服务开源组件&#xff0c;它并没有完全实现HTTP SERVER的所有功能&#xff0c;而是只实现了在APP和WEB中提供数据服务最常用两个指令GET/SET&#xff0c;满足在应用实现JSON,PROTOBUF和MSGPACK等基于HTTP…

Poj 1284 Primitive Roots

文章目录Description题意&#xff1a;题解&#xff1a;代码&#xff1a;Poj 1284Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6485 Accepted: 3697Description We say that integer x, 0 < x < p, is a primitive root modulo odd prime p if and onl…

P3507-[POI2010]GRA-The Minima Game【dp,博弈论】

正题 题目链接:https://www.luogu.com.cn/problem/P3507 题目大意 nnn个数&#xff0c;没人轮流取若干个并获得取走的数中最小数的权值&#xff0c;两人的目标都是自己的权值−-−对方的权值最大&#xff0c;求先手的权值−-−后手的权值。 解题思路 肯定是从大往小取&#x…

【LCT】【树状数组】Matches Are Not a Child‘s Play(luogu CF1137F)

正题 luogu CF1137F 题目大意 定义一棵树的产出序列为依次删除权值最小的叶子节点的顺序 进行q此操作&#xff1a; 1.把一个点的权值改为当前树中的最大权值1 2.查询一个点在删除序列中的位置 3.给出两个点&#xff0c;查询哪个在删除序列中的位置更前 解题思路 假设已经求出…

[XSY4220] 九万步(结论)

手动构造发现 x6x6x6 时是可行的 -101234567xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

一起开心2020暑假训练第一周

hdu 1576 A/B oj传送 题解&#xff1a; Poj 1061 青蛙的约会 oj传送 题解&#xff1a; hdu 1525 Euclid‘s Game oj传送 题解&#xff1a; Poj 3070 Fibonacci oj传送 题解&#xff1a; HDU 2504 又见GCD oj传送 题解&#xff1a; Poj 1284 Primitive Roots oj传送 …

ASP.NET Core 中的中间件

前言由于是第一次写博客,如果您看到此文章,希望大家抱着找错误、批判的心态来看。 sky!何为中间件?在 ASP.NET Framework 中应该都知道请求管道。可参考&#xff1a;浅谈 ASP.NET 的内部机制 系列&#xff0c;个人感觉超详细。题外话&#xff1a;说到请求管道&#xff0c;就想…

【bfs】重力球(luogu 7473/NOI Online 2021 普及组 T3)

正题 luogu 7473 题目大意 给出一个正方形区域&#xff0c;中间有一些障碍 现在有两个球&#xff0c;每次操作可以使两个球同时向一个方向移动&#xff0c;直到遇到障碍或边界 现在问你让两个球到同一个位置最少要多少步 解题思路 对于每次操作&#xff0c;球只有可能停在障…

CF700E-Cool Slogans【SAM,线段树合并,dp】

正题 题目链接:https://www.luogu.com.cn/problem/CF700E 题目大意 给出一个字符串SSS&#xff0c;求一个最大的kkk使得存在kkk个字符串其中s1s_1s1​是SSS的子串&#xff0c;si1s_{i1}si1​在sis_isi​中出现了至少222次。 解题思路 首先我们需要有两个结论 si1s_{i1}si1​…

[XXSY] 构树(prufer序列,树上连通块DP)

传送门 CayleyCayleyCayley公式&#xff1a;一个完全图有nn−2n^{n-2}nn−2棵无根生成树&#xff08;可用prufer序列证明&#xff09; 扩展CayleyCayleyCayley公式&#xff1a;被确定边分为大小为a1,a2,⋯,ama_1,a_2,\cdots, a_ma1​,a2​,⋯,am​的连通块&#xff0c;则有nm−…

.NET Core中的性能测试工具BenchmarkDotnet

背景介绍之前一篇博客中&#xff0c;我们讲解.NET Core中的CSV解析库&#xff0c;在文章的最后&#xff0c;作者使用了性能基准测试工具BenchmarkDotNet测试了2个不同CSV解析库的性能&#xff0c;本篇我们来详细介绍一下BenchmarkDotNet。原文链接&#xff1a;https://dotnetco…

序列求和

来源&#xff1a;牛客网 文章目录题目描述题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format: %lld题目描述 定义S(n) 12 22 … n2&#xff0c;输出S(n) …