在云端 Docker 运行 "transport: Error while dialing dial tcp : i/o timeout" 上使用 gRPC"

Go gRPC on Docker on Cloud Run "transport: Error while dialing dial tcp : i/o timeout""

我有一个 gRPC 服务器


type Server struct {
    name         string
    host         string
    port         string
    dbUser       string
    dbPassword   string
    dbURL        string
    dbParameters string
}

func main() {

    /*Start of config*/
    server := Server{
        "User service",
        "",
        os.Getenv("PORT"),
        "",
        "",
        "",
        "",
    }
    /*End of config*/

    log.Printf("Starting: %s RPCServer\n", server.name)
    lis, err := net.Listen("tcp", server.host+":"+server.port)
    if err != nil {
        log.Fatalf("Failed to liste: %v\n", err)
    }
    defer func() {
        err = lis.Close()
        if err != nil {
            log.Fatalf("Failed to close listener: %v\n", err)
        }
    }()
    gRPCServer := grpc.NewServer()
    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()

    reg := codecs.Register(bson.NewRegistryBuilder()).Build()
    mongoURI := options.Client().ApplyURI(
        "mongodb+srv://" + server.dbUser + ":" + server.dbPassword + "@" + server.dbURL + server.dbParameters,
    )

    mongoClient, err := mongo.NewClient(mongoURI, &options.ClientOptions{
        Registry: reg,
    })
    if err != nil {
        log.Fatalf("unable to create new mongo clinet: %s\n", err)
    }
    err = mongoClient.Connect(ctx)
    if err != nil {
        log.Fatalf("unable to connect to db: %s\n", err)
    }

    /*Start of registering service*/
    authService, err := AuthService.NewAuthService()
    if err != nil {
        log.Fatalf("unable to create server: %s\n", err)
    }
    s := UserService.NewServer(authService, mongoClient)
    UserService.RegisterUserServiceServer(gRPCServer, &s)
    /*End of registering service*/

    go func() {
        if err := gRPCServer.Serve(lis); err != nil {
            log.Printf("Failed to serve: %v\n", err)
        }
    }()
    log.Printf("server successfully started on port: %s\n\n", server.port)
    c := make(chan os.Signal)
    signal.Notify(c, os.Interrupt)
    <-c
    log.Printf("\nstopping server...\n")
    gRPCServer.Stop()
    err = lis.Close()
    if err != nil {
        log.Fatalf("failed to close listner: %s\n", err)
    }
    err = mongoClient.Disconnect(ctx)
    if err != nil {
        log.Fatalf("failed to disconnect from mongodb: %s\n", err)
    }
    log.Printf("successfully closed server\n")
}

我的 Dockerfile 是

FROM golang:alpine AS build-env
WORKDIR /app
ADD . /app
RUN cd /app && go build Main/server.go

FROM alpine
RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/*
WORKDIR /app
COPY --from=build-env /app/server /app
COPY --from=build-env /app/Config/* /app
ENV GOOGLE_APPLICATION_CREDENTIALS=cred.json

EXPOSE 50051
CMD ["./server"]

我在 Google Container Registry 上放置了 docker 图像,并尝试使用 Cloud 运行 运行 它使用以下命令

gcloud run deploy grpc-server-streaming\
          --project=project-id\
          --platform=managed\
          --region=asia-south1\
          --image=image-tag\
          --allow-unauthenticated

之后我进入云 运行 应用程序并启用 HTTP/2 连接。但我仍然无法连接到该服务。我收到以下错误

2021/04/21 17:04:36 rpc error: code = Unavailable desc = upstream connect error or disconnect/reset before headers. reset reason: connection termination

我已经被困在这两天了,不知道该怎么做。

我的 ASPNet 托管 gRPC 服务也发生了同样的情况。它在上周五 (2021-04-30) 工作,但在周一 (2021-05-03) 我开始收到此错误消息。 和你一样,我这几天一直在寻找答案。感谢@menghanl 的 Envoy 指点,我会打开那罐蠕虫。

@Chandraaditya 查看您的云 运行 服务日志,看看您的服务是否真的被触发了。 我可以看到我的服务在收到错误时正在处理请求。 gRPC 服务调用似乎是 200 OK,但“Envoy”并未将其发送回客户端。