在Ocelot中,您可以以{something}的形式将变量的占位符添加到模板中。占位符变量需要同时出现在DownstreamPathTemplate和UpstreamPathTemplate属性中。请求时Ocelot将尝试请求时进行替换。
你也可以像下面这样配置,捕获所有的路由:
{ "DownstreamPathTemplate": "/api/{everything}", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 1001, }, { "Host": "localhost", "Port": 1002, } ], "UpstreamPathTemplate": "/{everything}", "UpstreamHttpMethod": [ "Get", "Post" ] }这个配置将会把路径+查询字符串统统转发到下游路由.
注意:默认的ReRouting的配置是不区分大小写的,如果需要修改此配置,可以通过下面进行配置:
"ReRouteIsCaseSensitive": true这意味着Ocelot将尝试将传入的上游URL与上游模板匹配时,区分大小写。
全部捕获Ocelot的路由还支持捕获所有样式路由,用户可以指定他们想要匹配所有请求。
如果您设置如下所示的配置,则所有请求都将直接代理。占位符{url}名称不重要,任何名称都可以使用。
{ "DownstreamPathTemplate": "/{url}", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 1001, } ], "UpstreamPathTemplate": "/{url}", "UpstreamHttpMethod": [ "Get" ] }上面配置的全部捕获的优先级低于任何其他法人ReRoute。如果您的配置中还有下面的ReRoute,那么Ocelot会在全部捕获之前匹配它。
{ "DownstreamPathTemplate": "http://www.likecs.com/", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 1001, } ], "UpstreamPathTemplate": "http://www.likecs.com/", "UpstreamHttpMethod": [ "Get" ] } 上游主机此功能允许您根据上游主机获得ReRoutes。这通过查看客户端使用的主机头,然后将其用作我们用于识别ReRoute的信息的一部分来工作。
要使用此功能,请在配置中添加以下内容。
{ "DownstreamPathTemplate": "http://www.likecs.com/", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 1001, } ], "UpstreamPathTemplate": "http://www.likecs.com/", "UpstreamHttpMethod": [ "Get" ], "UpstreamHost": "yilezhu.cn" }仅当主机标头值为yilezhu.cn时,才会匹配上面的ReRoute。
如果您没有在ReRoute上设置UpstreamHost,那么任何主机头都将与之匹配。这意味着如果你有两个相同的ReRoutes,除了UpstreamHost,其中一个为null而另一个不为null 那么Ocelot将支持已设置的那个。
优先级你可以通过ocelot.json文件的ReRoutes节点中的Priorty属性来设置匹配上游HttpRequest的优先级顺序
比如,下面两个路由:
以及
{ "UpstreamPathTemplate": "/goods/delete" "Priority": 1 }上面两个路由中,如果向Ocelot发出的请求时/goods/delete格式的话,则Ocelot会优先匹配/goods /delete 的路由。
动态路由作者的想法是在使用服务发现提供程序时启用动态路由,这样您就不必提供ReRoute的配置。我们会在服务发现那一章进行详细的介绍。
查询字符串Ocelot允许您指定一个查询字符串作为DownstreamPathTemplate的一部分,如下例所示。
{ "ReRoutes": [ { "DownstreamPathTemplate": "/api/subscriptions/{subscriptionId}/updates?unitId={unitId}", "UpstreamPathTemplate": "/api/units/{subscriptionId}/{unitId}/updates", "UpstreamHttpMethod": [ "Get" ], "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 50110 } ] } ], "GlobalConfiguration": { } }在此示例中,Ocelot将使用上游路径模板中{unitId}的值,并将其作为名为unitId的查询字符串参数添加到下游请求中!
Ocelot还允许您将查询字符串参数放在UpstreamPathTemplate中,以便您可以将某些查询与某些服务匹配。
{ "ReRoutes": [ { "DownstreamPathTemplate": "/api/units/{subscriptionId}/{unitId}/updates", "UpstreamPathTemplate": "/api/subscriptions/{subscriptionId}/updates?unitId={unitId}", "UpstreamHttpMethod": [ "Get" ], "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 50110 } ] } ], "GlobalConfiguration": { } }在此示例中,Ocelot将仅匹配具有匹配的url路径的请求,并且查询字符串以unitId = something开头。您可以在此之后进行其他查询,但必须以匹配参数开头。此外,Ocelot将交换查询字符串中的{unitId}参数,并在下游请求路径中使用它。
源码地址当然是放上实例中的源码地址了:https://github.com/yilezhu/OcelotDemo
Ocelot简易教程目录Ocelot简易教程(一)之Ocelot是什么
Ocelot简易教程(二)之快速开始1
Ocelot简易教程(二)之快速开始2
Ocelot简易教程(三)之主要特性及路由详解
总结