路由(Routing)

Ocelot主要功能是接收即将发来的请求并转发它们至下游服务。与此同时,以另一个http请求的形式(在将来这可能是任何传输的机制)

Ocelot将一个请求的路由描述为另一个路由ReRoute。为了在Ocelot能运行,你需要在配置中设置ReRoute。

{
"ReRoutes": [
]
}

为了设置ReRoute,你需要在ReRoute的json数组添加如下代码:

{
"DownstreamPathTemplate": "/api/posts/{postId}",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 80,
}
],
"UpstreamPathTemplate": "/posts/{postId}",
"UpstreamHttpMethod": [ "Put", "Delete" ]
}

DownstreamPathTemplate ,Scheme 以及DownstreamHostAndPorts 会使该请求被转发到所示的URL。

DownstreamHostAndPorts 是一个数组,它包含端口号和主机,它代表任何你希望转发请求的下游服务。一般只包含一个实体,但是有时候你可能想要负载均衡多个请求到你的下游服务,Ocelot允许你添加一个或多个实体并指定一个负载均衡。

UpstreamPathTemplate  是一个URL,Ocelot会用它标示给定的请求使用 DownstreamPathTemplate 的值 。最后 UpstreamHttpMethod 是用来让Ocelot能够区分相同URL的请求,它明显需要工作。

你可以指定设置Http方法或者设置一个空的集合任意允许他们。Ocelot允许你为那些变量添加占位符到你的模板中以{something}的形式。DownstreamPathTemplateUpstreamPathTemplate 都需要占位符。如果当请求到达时,Ocelot想企图从UpStream URL中的一个正确的变量值替换占位符。

你也可以像下面一样捕捉所有类型的ReRoute:

{
"DownstreamPathTemplate": "/api/{everything}",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 80,
}
],
"UpstreamPathTemplate": "/{everything}",
"UpstreamHttpMethod": [ "Get", "Post" ]
}

这样将所有的路径+查询字符串结合在一起转发到下游服务在路径/api之后。

当没有任何配置的时候,Ocelot将默认所有的ReRoute是不区分大小写的。为了改变这个,你可以指定每一个ReRoute 按照下面设置。

"ReRouteIsCaseSensitive": true

这就表示Ocelot尝试匹配带着上游的模板的即将到达的上游请求,匹配时区分大小写。这个设置默认是false,如果你想让ReRoute是不区分大小写。

捕捉所有(Catch All)

Ocelot的路由支持在用户指定的那些想要匹配所有的事故的地方捕捉所有类型的路由,如果你要这么设置,那么就得在config里面像下面配置,那么将会直接通过请求代理(它不需要是URL,任何占位符名称都可以工作)。

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

捕捉所有的路由的优先级要比任何其他路由都要低。如果你有一个像下面配置的ReRoute,那么Ocelot将会在捕捉所有路由之前捕捉它。

{
"DownstreamPathTemplate": "/",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [
{
"Host": "10.0.10.1",
"Port": 80,
}
],
"UpstreamPathTemplate": "/",
"UpstreamHttpMethod": [ "Get" ],
"UpstreamHost": "somedomain.com"
}

当主机头(host header)值是somedomain.com,只上面的ReRoute将会被匹配。

如果你在ReRoute上没设置UpstreamHost ,那么任何host header都能匹配它。这基本上是在构建特性时捕捉所有的路由和预服务器现有的功能。这意味着如果你有两个ReRoute,那么他们就与UpStreamHost相同,其中一个为null,另一个是已经设置的。Ocelot会喜欢那个已经被设置好的值。

这个特性是在Issue 216 被要求添加的。

优先级(Priority)

Issue 270 中我最后决定在ocelot.json文件暴露ReRoute优先级。这意味着你可以决定那些想在你的ReRoute中的顺序去匹配UpStream HttpRequest。

为了让这正常工作,需要像下面一样在ocelot.json添加一个属性到ReRoute,下面的0值在这里只是例子值。

{
"Priority": 0
}

0表示最低优先级,Ocelot总是为捕捉所有的路由 /{catch All} 使用0,并且是硬编码的。之后你可以设置任何你所有希望的优先级

比如你可以这样

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

以及

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

在上面的例子中,如果让一个请求/goods/delete 至Ocelot,那么它将匹配 /goods/delete 这个路由(ReRoute)。在以前,Ocelot是会捕捉所有 /goods/{catchAll} 的路由(因为在ReRoute中,它排在第一个)。

动态路由(Dynamic Routing)

这个特性是在 issue 340 被要求加上的。当使用服务发现提供器的时候这个能够动态选择路由,以便你无须提供ReRoute配置。如果你感兴趣的话,可以查看文档 service-discovery

上一篇:Ocelot中文文档-Configuration

Ocelot中文文档-Route的更多相关文章

  1. Ocelot中文文档入门

    入门 Ocelot仅适用于.NET Core,目前是根据netstandard2.0构建的,如果Ocelot适合您,这个文档可能会有用. .NET Core 2.1 安装NuGet包 使用nuget安 ...

  2. Ocelot中文文档-跟踪

    Ocelot使用一个杰出的项目Butterfly 提供了跟踪功能. 为了使用跟踪,请阅读Butterfly的文档. 在Ocelot中如果你想跟踪一个ReRoute,你需要做如下事情: 在Configu ...

  3. Ocelot中文文档-不支持

    Ocelot不支持一下几点... 分块编码 - Ocelot将始终获取body大小并返回Content-Length头. 如果这不适合你的场景,只能表示抱歉! 转发host头 - 您发给Ocelot的 ...

  4. Ocelot中文文档-路由

    Ocelot的主要功能是接管进入的http请求并把它们转发给下游服务.目前是以另一个http请求的形式(将来可能是任何传输机制). Ocelot将路由一个请求到另一个请求描述为ReRoute.为了在O ...

  5. Ocelot中文文档-管理

    Ocelot支持在运行时通过一个认证的Http API修改配置.有两种方式对其验证, 使用Ocelot的内置IdentityServer(仅用于向管理API验证请求)或将管理API验证挂接到您自己的I ...

  6. Ocelot中文文档-Raft(实验功能不能用于生产环境)

    Ocelot最近整合了Rafty,这是我在去年一直研究的Raft的一个实现. 这个项目实验性非常强,所以在我认为它没问题之前,请不要在生产环境中使用Ocelot的这个功能. Raft是一种分布式一致性 ...

  7. Ocelot中文文档-入门

    Ocelot只能用于.NET Core,目前是为netcoreapp2.0构建的,这个文档可能会帮你了解Ocelot是否适合你. .NET Core 2.0 安装NuGet包 使用nuget安装Oce ...

  8. Ocelot中文文档-配置

    这里有一个配置的列子.其中有两个配置块.一个ReRoutes数组和一个GlobalConfiguration.ReRoutes配置块是一些告诉Ocelot如何处理上游请求的对象.Globalconfi ...

  9. Ocelot中文文档-认证

    为了验证ReRoutes并随后使用Ocelot的任何基于声明的功能,如授权或使用令牌中的值修改请求. 用户必须像往常一样在他们的Startup.cs中注册认证服务,但他们给每个注册提供了一个方案(认证 ...

随机推荐

  1. qhfl-3 Course模块

    课程模块,包括免费课程以及专题课程两个,主要是课程的展示,点击课程进入课程详细页面 根据功能设计表结构 为了方便,每张表在数据库中添加了中文名 from django.db import models ...

  2. R语言csv与txt文本读入区分(sep参数)

    R语言csv与txt文本读入区分 R语言用来处理数据很方便,而处理数据的第一步是把数据读入内存空间,平时最常用的文本数据储存格式有两种: 一种是CSV(逗号分隔符文本)另一种是TXT(Tab分隔符或空 ...

  3. 题解 luogu P1144 【最短路计数】

    本蒟蒻也来发一次题解第一篇请见谅 这个题有几个要点 1.无向无权图,建图的时候别忘记建来回的有向边[因此WA掉1次 2.无权嘛,那么边长建成1就好了2333333 3.最短路采用迪杰斯特拉(别忘用堆优 ...

  4. js-运动函数(盒子运动)

    注意move的js包在另一篇文章 <!DOCTYPE html><html> <head> <meta charset="UTF-8"&g ...

  5. C#使用iTextSharp+ZXing.Net+FreeSpire.PDF生成和打印pdf文档

    项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.Net+FreeSpire.PDF三个类库实现了生成pdf.生成条形码和打印pdf功能. 首先在项 ...

  6. cad2012卸载/安装失败/如何彻底卸载清除干净cad2012注册表和文件的方法

    cad2012提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装cad2012失败提示cad2012安装未完成,某些产品无法安装,也有时候想重新安装cad2012 ...

  7. PICE(5):MongoDBStreaming - gRPC -MGO Service

    我在前面提到过MongoDB不支持像SQL般字符式的操作指令,所以我们必须对所有的MongoDB操作指令建立protobuf类型才能支持MongoDB指令的序列化.在对上一篇博文里我们把MongoDB ...

  8. 仿B站项目(4)webpack打包第三方库jQuery

    概述 在项目中不可避免的会用到jquery等第三方库,来看看有什么问题,怎么解决. 遇到的问题 一般情况下,直接require第三方库,比如jquery,然后webpack会自动把第三方库打包进bun ...

  9. Spring.Net实现跨数据库服务层事务管理

    在实际项目中用了Spring.Net框架之后,发现这框架在处理数据库事务上特别强大,声明式的数据库事务解放了一般开发人员对数据库事务操作的复杂处理.尤其是多数据库事务处理上,尤为显得更简便,几个简单的 ...

  10. Ubuntu 18.0.4安装docker

    第一步:如果之前安装过docker,执行下面命令删除 apt-get remove docker docker-engine docker.io 删除后执行sudo apt-get update更新软 ...