路由(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. Oracle OMF管理数据文件

    1.什么是OMF? Oracle managed file的缩写,简单的理解,就是oracle自己管理自己的文件,可以是dbf,redolog 等等,具体可以参考官方文档Adiministrator中 ...

  2. Internetworking

    1 Introduction 所谓的InternetWorking就是将很多网络连接起来,那么在这种连接的网络下我们该如何传送封包呢? 2 IP and Routers 1 IP Datagram H ...

  3. 还原是不可能还原的,这辈子都不可能还原(手动笑cry)

    不好意思,我又把原厂避震换回border的绞牙了. 这套台湾绞牙已经陪伴了我第三个年头了,本次主要是调节了桶身高度,让车身升高了一下,现在是前面3指松将近4指.后面2指(以前是前面2指半.后面1指松2 ...

  4. Git入门基础详情教程

    前言 写了一篇文章<一篇文章了解Github和Git教程>还觉得不错,继续写了<为了Github默默付出,我想了解你>,那么继续写Git 基础知识. Git 官网:https: ...

  5. HoloLens开发手记 - 语音输入 Voice input

    语音是HoloLens三大重要输入形式之一.它允许你直接通过语言控制全息图像,而不用借助手势.你只要凝视全息图像然后说出语音命令即可.语音输入是自然的交互方式,它能够很好的改善复杂的交互,因为通过一条 ...

  6. HoloLens开发手记-全息Hologram

    HoloLens使我们可以通过周边世界的光线和声音来创建全息场景和物体,使得它们像真实物体那样.全息场景能够响应你的凝视.手势和语音指令,同时还会和你周边世界的表面交互.借助全息场景,你可以在周边世界 ...

  7. LeetCode--No.011 Container With Most Water

    11. Container With Most Water Total Accepted: 86363 Total Submissions: 244589 Difficulty: Medium Giv ...

  8. Golang Struct 声明和使用

    Golang Struct 声明和使用 Go可以声明自定义的数据类型,组合一个或多个类型,可以包含内置类型和用户自定义的类型,可以像内置类型一样使用struct类型 Struct 声明 具体的语法 t ...

  9. java main()线程是不是最后一个退出的(相比较main中创建的其他多个线程)

    JVM会在所有的非守护线程(用户线程)执行完毕后退出: main线程是用户线程: 仅有main线程一个用户线程执行完毕,不能决定JVM是否退出,也即是说main线程并不一定是最后一个退出的线程. pu ...

  10. Hybrid App 原理解析

    目录 一.现有混合方案 二.Hybrid技术原理 三.Native 通知 H5 (Native 调用 JS) 3.1 Android 调 H5 3.2 iOS 调 H5 四.H5 通知 Native( ...