Ocelot中文文档-路由

原文: Ocelot中文文档-路由

Ocelot的主要功能是接管进入的http请求并把它们转发给下游服务。目前是以另外一个http请求的形式(未来多是任何传输机制)。html

Ocelot将路由一个请求到另外一个请求描述为ReRoute。为了在Ocelot作任何工做,都须要在配置中设置一个ReRoute。git

{
    "ReRoutes": [
    ]
}

为了设置ReRoute,你须要以下所示添加一个ReRoute到ReRoutes的json数组。github

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

DownstreamPathTemplate、DownstreamScheme和DownstreamHostAndPorts 肯定请求的转发。json

DownstreamHostAndPorts是一个数组,包含请求要转发的主机和端口。一般这只包含一个条目,但有时您可能须要将请求负载平衡到您的下游服务,这是Ocelot容许咱们添加多个条目,而后选择一个负载均衡器。api

UpstreamPathTemplate是Ocelot用来标识哪一个DownstreamPathTemplate用于给定的请求URL。 最后,UpstreamHttpMethod的使用,可让Ocelot区分对同一个URL的请求,而且显然这是须要的工做。数组

你能够指定一个Http请求方法列表,或者一个空的列表以容许任务Http请求方法。在Ocelot中,你可使用{something}的方式在模板中添加变量占位符。占位符须要在DownstreamPathTemplate 和UpstreamPathTemplate中都添加。若是是这样,当请求到达时Ocelot将试图使用上游url中的正确的变量值来替换占位符。负载均衡

你也能够想这样使用一个ReRoute处理全部请求:dom

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

这将转发全部请求到下游服务路径/api。post

目前在没有任何配置的请求下,Ocelot将默认全部ReRoutes不区分大小写。 为了改变这种状况,您能够在每一个ReRoute中指定如下设置:编码

"ReRouteIsCaseSensitive": true

这意味着,当Ocelot尝试将上行url与上游模板匹配时将区分大小写。 此设置默认为false,这也是个人建议。所以只有在您但愿ReRoute区分大小写时才用设置它。

捕获全部

Ocelot的路由还支持捕获全部样式的路由,用户能够指定他们想要匹配全部流量。若是你像下面那样设置你的配置,请求将被直接代理(它不必定叫url,任何占位符名称均可以)。

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

该捕获全部的优先级低于其余任何ReRoute。 若是你的配置中还有下面的ReRoute,那么Ocelot会在捕获全部配置以前先匹配它。

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

上游主机

此功能容许您基于上游主机进行ReRoutes。 这是经过查看客户端使用的主机头来工做,而后将其用做识别ReRoute的信息的一部分。

为了使用这个功能,在你的配置中加上以下配置。

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

上面的ReRoute只会匹配主机头是somedomain.com的请求。

若是您没有在ReRoue上设置UpstreamHost,则任何主机头均可以匹配它。 这基本上是一个捕获全部功能并保留构建功能时的现有功能。这意味着若是您有两个相同的ReRoute,其中一个与UpstreamHost是null,另外一个有值。 Ocelot会倾向于设定值的那个。

这个功能在问题 216提出要求。

优先级

问题 270中,我最终决定在ocelot.json中公开ReRoute的优先级。这意味着您能够决定上游HttpRequest与你的ReRoutes的匹配顺序。

为了是其起做用,将如下内容添加到ocelot.json的ReRoute中,0仅仅是一个示例值,将在下面解释。

{
    "Priority": 0
}

0是最低优先级,Ocelot将始终使用0做为/{catchAll}路由条目,而且能够硬编码。以后,你能够自由设置你想要的任何优先级。

例如你能够这样:

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

还能够:

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

在上面的例子中,若是您向Ocelot请求/goods/delete,Ocelot将匹配/goods/delete这个ReRoute。不过在不设置优先级之前它会匹配/goods/{catchAll}(由于这是列表中的第一个ReRoute!)。

相关文章
相关标签/搜索