首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我在收到go中的服务器前言之前就关闭了连接?

为什么我在收到go中的服务器前言之前就关闭了连接?
EN

Stack Overflow用户
提问于 2021-10-12 14:10:41
回答 1查看 2.3K关注 0票数 -1

我正在尝试使用grpc-gateway在同一端口上通过GRPC服务器设置一个远程过程调用服务器和代理HTTP服务器。奇怪的是,有时我会随机得到failed to receive server preface within timeout错误。大多数情况下,它发生在服务重新启动时。它开始工作,并在几次重试后返回正确的响应。我不知道发生了什么。有人能帮帮我吗?以下是服务启动代码片段

代码语言:javascript
运行
复制
func makeHttpServer(conn *grpc.ClientConn) *runtime.ServeMux {
    router := runtime.NewServeMux()

    if err := services.RegisterHealthServiceHandler(context.Background(), router, conn); err != nil {
        log.Logger.Error("Failed to register gateway", zap.Error(err))
    nricher
    if err := services.RegisterConstraintsServiceHandler(context.Background(), router, conn); err != nil {
        log.Logger.Error("Failed to register gateway", zap.Error(err))
    }
    return router
}

func makeGrpcServer(address string) (*grpc.ClientConn, *grpc.Server) {

    grpcServer := grpc.NewServer()
    services.RegisterHealthServiceServer(grpcServer, health.Svc{})
    services.RegisterABCServer(grpcServer, ABC.Svc{})
    conn, err := grpc.DialContext(
        context.Background(),
        address,
        grpc.WithInsecure(),
    )
    if err != nil {
        log.Logger.Error("Failed to dial server", zap.Error(err))
    }

    return conn, grpcServer
}

func httpGrpcRouter(grpcServer *grpc.Server, httpHandler *runtime.ServeMux, listener net.Listener) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        if r.ProtoMajor == 2 {
            grpcServer.Serve(listener)
        } else {
            httpHandler.ServeHTTP(w, r)
        }
    })
}

func Start() error {
    conf := config.Get()
    address := fmt.Sprintf("%s:%d", conf.ServerHost, conf.ServerPort)

    listener, err := net.Listen("tcp", address)
    if err != nil {
        log.Logger.Fatal("failed to listen: %v", zap.Error(err))
    }
    conn, grpcServer := makeGrpcServer(address)
    router := makeHttpServer(conn)

    log.Logger.Info("Starting server on address : " + address)
    err = http.Serve(listener, httpGrpcRouter(grpcServer, router, listener))
    return err
}
EN

回答 1

Stack Overflow用户

发布于 2021-11-18 13:02:05

尝试使用h2c.NewHandler包装您的路由器,使http.Serve()调用看起来如下所示:

代码语言:javascript
运行
复制
err = http.Serve(listener, h2c.NewHandler(
        httpGrpcRouter(grpcServer, router, listener),
        &http2.Server{})
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69542087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档