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
和外部端口代替localhost
:https://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)