在 ASP.NET Core 8 的 dockerize 项目中使用 gRPC 客户端后连接被拒绝

问题描述 投票:0回答:1

我正在使用 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 服务,但都失败了。

提前致谢

asp.net-core grpc connection-refused
1个回答
0
投票

在 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

© www.soinside.com 2019 - 2024. All rights reserved.