我有一个 .Net Core 3.1 WebAPI 作为 Docker 容器运行 + Eureka 服务器也作为 Docker 运行。当我从 Visual Studio 运行 API 时,它会成功注册到 Eureka Docker 实例,我可以在 Eureka 控制台中看到该服务。但是,一旦我对 API 进行 dockerize 并运行它,我就会收到如下连接错误:
fail: Steeltoe.Discovery.Eureka.Transport.EurekaHttpClient[0]
productsapi_1 | RegisterAsync Failed
productsapi_1 | System.Net.Http.HttpRequestException: Connection refused
productsapi_1 | ---> System.Net.Sockets.SocketException (111): Connection refused
productsapi_1 | at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
productsapi_1 | --- End of inner exception stack trace ---
productsapi_1 | at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
......
productsapi_1 | at Steeltoe.Discovery.Eureka.Transport.EurekaHttpClient.RegisterAsync(InstanceInfo info)
productsapi_1 | fail: Steeltoe.Discovery.Eureka.DiscoveryClient[0]
productsapi_1 | Register Failed
productsapi_1 | System.Net.Http.HttpRequestException: Connection refused
productsapi_1 | ---> System.Net.Sockets.SocketException (111): Connection refused
productsapi_1 | at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
productsapi_1 | --- End of inner exception stack trace ---
productsapi_1 | at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
.....
productsapi_1 | at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
productsapi_1 | at System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean
disposeCts)
productsapi_1 | at Steeltoe.Discovery.Eureka.Transport.EurekaHttpClient.RegisterAsync(InstanceInfo info)
productsapi_1 | at Steeltoe.Discovery.Eureka.DiscoveryClient.RegisterAsync()
productsapi_1 | info: Steeltoe.Discovery.Eureka.DiscoveryClient[0]
productsapi_1 | Registartion fail. HeartBeat not start
productsapi_1 | fail: Steeltoe.Discovery.Eureka.Transport.EurekaHttpClient[0]
productsapi_1 | DoGetApplicationsAsync Failed
productsapi_1 | System.Net.Http.HttpRequestException: Connection refused
productsapi_1 | ---> System.Net.Sockets.SocketException (111): Connection refused
.....
这是在运行docker -compose up 之后。Eureaka 和 API 容器都已启动,但服务似乎没有注册。这就是我的 WebAPI 的样子:
启动.cs
public void ConfigureServices(IServiceCollection services)
{
.....
services.AddDbContext<ApplicationDbContext>(o => o.UseMySql(Configuration.GetConnectionString("mysqlconnection")));
services.AddDiscoveryClient(Configuration);
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
.....
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
app.UseDiscoveryClient();
}
码头工人撰写
version: '3.4'
services:
productsapi:
build: .
ports:
- "5050:5000"
depends_on:
- eurekaserver
eurekaserver:
image: steeltoeoss/eureka-server:latest
ports:
- '8761:8761'
应用设置.json
{
...
"AllowedHosts": "*",
...
"eureka": {
"client": {
"shouldRegisterWithEureka": true,
"serviceUrl": "http://eurekaserver:8761/eureka",
"ValidateCertificates": false
},
"instance": {
"appName": "ProductService",
"port": "5050",
"hostName": "localhost"
}
}
}
我错过了什么?