ASP.NET Core 8 Docker化项目中gRPC客户端调用连接拒绝问题
解决gRPC服务调用"Connection refused"问题
核心问题分析
出现Connection refused错误的核心原因是Basket.API调用gRPC服务时使用了错误的端口。Docker容器内部,Discount.Grpc服务监听的是8080端口(ASP.NET Core 8镜像默认端口),但客户端配置仅指定了服务名http://discount.grpc,默认会尝试连接80端口,而该端口未被监听,导致连接失败。
解决方案步骤
1. 修正gRPC客户端调用地址
更新docker-compose.override.yml中Basket.API的环境变量,添加容器内部的监听端口8080:
basket.api: container_name: basket.api environment: - ASPNETCORE_ENVIRONMENT=Development - "GrpcSettings:DiscountUrl=http://discount.grpc:8080" # 补充容器内部监听端口 ports: - "8001:8080" discount.grpc: container_name: discount.grpc environment: - ASPNETCORE_ENVIRONMENT=Development - "DatabaseSettings:ConnectionString=Server=discountdb;Port=5432;Database=DiscountDb;User Id=admin;Password=***;" ports: - "8003:8080"
2. 修正Discount.Grpc Dockerfile的EXPOSE声明
Dockerfile中EXPOSE的端口应与容器内部服务实际监听的端口一致(8080),避免混淆:
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base USER app WORKDIR /app EXPOSE 8080 # 从8003改为容器内部实际监听的8080端口 FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src COPY ["Services/Discount/Discount.Grpc/Discount.Grpc.csproj", "Services/Discount/Discount.Grpc/"] RUN dotnet restore "./Services/Discount/Discount.Grpc/./Discount.Grpc.csproj" COPY . . WORKDIR "/src/Services/Discount/Discount.Grpc" RUN dotnet build "./Discount.Grpc.csproj" -c $BUILD_CONFIGURATION -o /app/build FROM build AS publish ARG BUILD_CONFIGURATION=Release RUN dotnet publish "./Discount.Grpc.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "Discount.Grpc.dll"]
3. 验证服务状态与连通性
查看Discount.Grpc启动日志:
docker logs discount.grpc确认日志中包含
Now listening on: http://[::]:8080类信息,说明服务已正确绑定到8080端口。测试容器间网络连通性:
进入Basket.API容器,尝试访问Discount.Grpc服务:docker exec -it basket.api curl http://discount.grpc:8080若返回gRPC的405 Method Not Allowed页面(正常现象,gRPC需HTTP/2协议调用),则说明网络连通正常。
4. 重启容器生效
修改配置后,重启所有容器使设置生效:
docker-compose -f .\docker-compose.yml -f .\docker-compose.override.yml down docker-compose -f .\docker-compose.yml -f .\docker-compose.override.yml up --build
额外检查点
- 确认Discount.Grpc的
appsettings.json中Kestrel配置正确启用HTTP/2:{ "Kestrel": { "EndpointDefaults": { "Protocols": "Http2" } } } - Docker Compose默认会为所有服务创建并加入同一个网络,无需额外配置,确保两个服务未被隔离到不同网络。
内容的提问来源于stack exchange,提问作者Mohammad Ghafoori
相关产品推荐
相关产品推荐

