在 Cloud Run 上的 Docker 上转到 gRPC“传输:拨号拨号 tcp 时出错:i/o 超时””

问题描述

我有一个 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 Run 使用以下命令运行它

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

之后我进入了 Cloud Run 应用程序并启用了 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 查看您的 Cloud Run 服务的日志,看看您的服务是否真正被触发。 我可以看到我的服务在收到错误时处理请求。 gRPC 服务调用似乎是 200 OK,但“Envoy”并未将其发送回客户端。

enter image description here