最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

Ocelot使用与设置路由Routing

来源:博客园

一、安装Ocelot

在程序包管理器控制台输入以下命令安装Ocelot

Install-Package Ocelot

二、新建两个项目

我们新建两个.Net Core WebAPI项目如下:


(资料图片)

直接就是最初始化的项目,只是我们在ExternalGateway项目中安装Ocelot,并且添加一个ocelot.json文件(也可以添加多个配置文件然后合并),文件内容如下:

{  "GlobalConfiguration": {    "BaseUrl": "https://localhost:5000"  },  "Routes": [    {      "DownstreamPathTemplate": "/{everything}",      "DownstreamScheme": "https",      "DownstreamHostAndPorts": [        {          "Host": "localhost",          "Port": 5001        }      ],      "UpstreamPathTemplate": "/api/{everything}",      "UpstreamHttpMethod": [ "Get", "Post" ]    }  ]}

然后注入Ocelot的服务和配置请求管道

builder.Configuration.SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("ocelot.json", optional: false, reloadOnChange: true);builder.Services.AddOcelot();//......app.UseOcelot().Wait();

然后我们运行两个项目就能通过ExternalGateway项目地址访问uthServer的地址

三、Routing的参数配置说明

1、路由

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

其中DownstreamPathTemplateDownstreamSchemeDownstreamHostAndPorts定义了请求将被转发到的URL。

参数DownstreamHostAndPorts是一个集合定义了请求转到任何下游服务的主机和端口,一般是单个即可,但是如果存在负载均衡到下游服务那就需要填写多个,并进行相关的负载均衡的配置。

参数UpstreamPathTemplate是标识用于给定下游请求的DownstreamPathTemplate对应的URL

参数UpstreamHttpMethod便于区分不同的HTTP的请求到相同的URL,可以设置为空允许全部的请求。

Ocelot中可以以{something}的形式为模板中的变量添加占位符,但是该占位符变量必须同时出现在DownstreamPathTemplateUpstreamPathTemplate的上下游配置中,Ocelot会尝试进行占位符值的替换。

默认请求路径的配置是不区分大小写的,如果需要修改通过以下参数配置:

"RouteIsCaseSensitive": true

2、全部捕获

Ocelot中还支持捕获全部路径的路由,用户可以指定他们想要匹配的所有流量。

像是如下的配置,所有的请求都将被代理。但是占位符{url}的名称不重要,可以使用任何名称。

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

但是全部捕获的优先级是最低的,如果存在其他配置,将会优先于此匹配。

3、优先级

可以通过Priorty参数来这是匹配上游请求路径的优先级,如下配置的情况下请求地址为/goods/delete的时候优先匹配/goods/{catchAll},因为0是最低的优先级,Priorty越大优先级越高。

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

4、上游主机

参数UpstreamHost允许我们设置该路由的上游主机,配置后仅当请求头的主机为我们的配置值,才会匹配该路由配置。如果没有配置UpstreamHost那就是任何主机头都可以。

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

如上述代码仅当主机头为somedomain.com的请求,才会匹配上述路由。如果存在两个相同的路由配置,但是一个设置了UpstreamHost一个没有设置,这样会匹配设置了的路由。

5、查询字符串

Ocelot中允许将查询字符串作为DownstreamPathTemplate的一部分,如下所示上游路径模板中的{unitId}将作为下游路径模板中的查询字符串参数unitId的值。

{    "Routes": [        {            "DownstreamPathTemplate": "/api/subscriptions/{subscriptionId}/updates?unitId={unitId}",            "UpstreamPathTemplate": "/api/units/{subscriptionId}/{unitId}/updates",            "UpstreamHttpMethod": [                "Get"            ],            "DownstreamScheme": "http",            "DownstreamHostAndPorts": [                {                    "Host": "localhost",                    "Port": 50110                }            ]        }    ],    "GlobalConfiguration": {    }}

此外Ocelot还允许将查询字符串放置在UpstreamPathTemplate中,以便将某些查询匹配到对应的服务,如下所示只能匹配查询参数为unitId的请求。

{    "Routes": [        {            "DownstreamPathTemplate": "/api/units/{subscriptionId}/{unitId}/updates",            "UpstreamPathTemplate": "/api/subscriptions/{subscriptionId}/updates?unitId={unitId}",            "UpstreamHttpMethod": [                "Get"            ],            "DownstreamScheme": "http",            "DownstreamHostAndPorts": [                {                    "Host": "localhost",                    "Port": 50110                }            ]        }    ],    "GlobalConfiguration": {    }}

四、聚合路由

关键词: