Ocelot API Gateway 错误:无法建立连接,因为目标机器主动拒绝它

Posted

技术标签:

【中文标题】Ocelot API Gateway 错误:无法建立连接,因为目标机器主动拒绝它【英文标题】:Ocelot API Gateway error: No connection could be made because the target machine actively refused it 【发布时间】:2021-11-19 22:36:38 【问题描述】:

我正在尝试使用 Ocelot 作为我的 API 网关来构建一个微服务架构系统。我目前的问题已经有大约 2 周了,并且无法弄清楚为什么会发生,所以我正在向专家求助,希望您能提供帮助:)。

目前的结构如下:我有一个AccountAPI和一个Ocelot API Gateway。我已经根据文档添加了从 API Gateway 到 AccountAPI 的路由。当我运行项目时,我可以直接调用 AccountAPI,它工作正常。但是当我通过 API Gateway 调用时,我得到了这个错误。

Error Code: ConnectionToDownstreamServiceError Message: Error connecting to downstream service, exception: 
System.Net.Http.HttpRequestException: No connection could be made because the target machine actively refused it. 
(localhost:5101)

很明显,它甚至没有到达 AccountAPI 的控制器,所以我什至无法调试 >.>

我无需通过网关即可访问该对象的事实告诉我,这不是网络/防火墙问题(我关闭了所有防火墙只是为了测试,得到了相同的结果)。

这是我的 ocelot.json 文件中的内容(应该将 Ocelot 连接到 AccountAPI)


  "GlobalConfiguration": 
    "BaseUrl": "http://localhost:5111/"
  ,
  "Routes": [
    
      "DownstreamPathTemplate": "/Account/url",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        
          "Host": "localhost",
          "Port": 5101
        
      ],
      "UpstreamPathTemplate": "/MeHealth/Account/url",
      "UpstreamHttpMethod": [ "GET", "POST", "PUT", "DELETE" ],
      "Priority": 1
    
  ]

因此,如果我调用 https:// localhost:5101/Account/1,我会返回正确的对象。但是通过调用https:// localhost:5111/MeHalth/Account/1 我得到了错误。 (我也尝试了http://(对于那些发现该计划的人),我得到了与https相同的结果)。

其他注意事项:这两个都是通过 docker-compose 部署的,配置如下:

services:
    ocelotapigateway:
        environment:
            - ASPNETCORE_ENVIRONMENT=Development
            - ASPNETCORE_URLS=https://+:443;http://+:80
        ports:
            - "5111:443"
        volumes:
            - $APPDATA/Microsoft/UserSecrets:C:\Users\ContainerUser\AppData\Roaming\Microsoft\UserSecrets:ro
            - $APPDATA/ASP.NET/Https:C:\Users\ContainerUser\AppData\Roaming\ASP.NET\Https:ro

    accountapi:
        environment:
            - ASPNETCORE_ENVIRONMENT=Development
            - ASPNETCORE_URLS=https://+:443;http://+:80
        ports:
            - "5101:443"
        volumes:
            - $APPDATA/Microsoft/UserSecrets:C:\Users\ContainerUser\AppData\Roaming\Microsoft\UserSecrets:ro
            - $APPDATA/ASP.NET/Https:C:\Users\ContainerUser\AppData\Roaming\ASP.NET\Https:ro

您可以提供的任何建议或帮助将不胜感激。如果您需要额外的信息,也请告诉我。

【问题讨论】:

【参考方案1】:

问题是您主机上的localhost 与在 docker 容器中运行时的localhost 不同。将 docker 视为具有自己的localhost 的独立“虚拟机”。当您的 api 网关尝试访问 localhost:5101 时,它会失败,因为它不存在于这个“虚拟机”中,它正在您的主机上运行。您在这里有 2 个解决方案:

    使用host.docker.internal 和外部端口代替localhosthttps://host.docker.internal:5101。 在同一个非默认 docker 网络下运行 2 个容器时(运行 docker-compose 时会发生这种情况),它们可以通过服务名称和内部端口相互访问:https://accountapi:443

【讨论】:

以上是关于Ocelot API Gateway 错误:无法建立连接,因为目标机器主动拒绝它的主要内容,如果未能解决你的问题,请参考以下文章

Ocelot api gateway - kubernetes - error: "namespace:serviceservice:managementservice Unable to

在 Ocelot API Gateway 中的特定路由中添加 Authorization Header(Authorization: Bearer access_token)

Ocelot实现API网关服务

Ocelot API 网关仅设置 TimeOut 值抛出错误

微服务-网关GateWay

微服务之:从零搭建ocelot网关和consul集群