我正在使用 ASP.NET Core 8 和
gRpc
。在包含 gRpc 客户端的 Basket.API
项目中,我正在调用 gRpc 方法之一,即 GetDiscountAsync
:
public async Task<CouponModel> GetDiscount(string productName)
{
var discountRequest = new GetDiscountRequest { ProductName = productName };
return await _discountProtoService.GetDiscountAsync(discountRequest);
}
gRpc 服务器原型文件位于
Discount.Grpc
项目中,如下所示:
syntax = "proto3";
service DiscountProtoService {
rpc GetDiscount (GetDiscountRequest) returns (CouponModel);
}
message GetDiscountRequest {
string productName = 1;
}
问题是当我在篮子项目中调用
GetDiscountAsync
方法时,出现错误:“连接被拒绝”。
Grpc.Core.RpcException: Status(StatusCode="Unavailable", Detail="Error connecting to subchannel.", DebugException="System.Net.Sockets.SocketException (111): Connection refused
at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)
at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)
removed for clarity...
这是我的
docker-compose.override.yml
文件的内容
basket.api:
container_name: basket.api
environment:
- ASPNETCORE_ENVIRONMENT=Development
- "GrpcSettings:DiscountUrl=http://discount.grpc"
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"
discount.grpc docker 文件内部
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
USER app
WORKDIR /app
EXPOSE 8003
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"]
gRPC 应用程序设置
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http2"
}
}
}
我使用以下命令来创建应用程序容器:
docker-compose -f .\docker-compose.yml -f .\docker-compose.override.yml up
我尝试了几种不同的方式来访问折扣 gRpc 服务,但都失败了。
提前致谢
在 Basket.API 内部,我更改了 gRPC 客户端设置,它按预期工作。
Basket.API 内部应用程序设置
“Grpc设置”:{ “DiscountUrl”:“http://host.docker.internal:8003” },
Baskpet.API 的 Programs.cs 内部
builder.Services.AddGrpcClient<DiscountProtoService.DiscountProtoServiceClient>
(o => o.Address = new Uri(builder.Configuration["GrpcSettings:DiscountUrl"]
?? throw new Exception("Configration Not found")));
我必须注意,gRPC 服务器项目的端口是 8003,我没有使用 localhost,而是使用了
host.docker.internal
。