首页 > 解决方案 > ASP.NET Core Web Api 将某些请求路由到在其他端口上运行的微服务

问题描述

我创建了一个 SPA,它必须与后端的各种微服务进行通信。出于部署和延迟的原因,我们必须确保前端只与一个端点通信,然后在内部路由到其他微服务。

我怎样才能使它与 ASP.NET Core 一起工作?我查看了Ocelot,它提供了非常相似的东西,但正如我在文档中看到的那样,我必须配置 IP 地址/主机名,在该 IP 地址/主机名下,将从客户端访问后端,我不知道这些信息,因为这将在之后确定部署(并且对于每台机器都可能不同,因为该服务将在各种边缘设备上运行)。

这是否可以使用一个简单的路由中间件来实现,该中间件在 url 中查找某个路径(例如 /api/otherservice),向负责的微服务(例如http://localhost:1234/api/otherservice)发送一个 http 请求并返回给来电者的信息?

我正在使用 ASP.NET Core 2.1。

更新:我设法让 ocelot 运行以将所需的路由应用到下游微服务。但是,我使用 Ocelot 的服务本身提供了路由(为 Web 应用程序前端和其他一些后端 api 路由提供服务)。有谁知道我如何告诉 Ocelot 回退到它正在运行的服务中声明的路由,如果有一条不包含在 ocelot.json 中的路由(或者相反,告诉 ASP.NET Core 只使用用于路由 id 的 ocelot 无法自行解析)。

更新 2:这是我的 ocelot 配置,它会导致无限循环:

{
  "ReRoutes": [
    {
      "DownstreamPathTemplate": "/api/tool/{url}",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 5200
        }
      ],
      "UpstreamPathTemplate": "/api/tool/{url}",
      "UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ]
    },
    {
      "DownstreamPathTemplate": "/{everything}",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 5100
        }
      ],
      "UpstreamPathTemplate": "/{everything}",
      "Priority": 0
    }
  ]
}

省略第二个 (catchAll) - 路由成功路由到工具路由,但无法提供包含 Ocelot 中间件的 ASP.NET Core 服务提供的路由。

标签: asp.net-coreroutingasp.net-core-webapiapi-gatewayocelot

解决方案


也许您想要全部重新路由?由于这种类型的重新路由具有最低优先级,因此只有在所有先前具有较高优先级的重新路由都失败时才会这样做:

https://ocelot.readthedocs.io/en/latest/features/routing.html#catch-all

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

如果您不想要这种默认行为,您可以查看 priority 属性:

https://ocelot.readthedocs.io/en/latest/features/routing.html#priority

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

推荐阅读