gpt4 book ai didi

go - 为什么我在收到服务器序言之前关闭连接?

转载 作者:行者123 更新时间:2023-12-05 04:43:44 25 4
gpt4 key购买 nike

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

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
}

最佳答案

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

err = http.Serve(listener, h2c.NewHandler(
httpGrpcRouter(grpcServer, router, listener),
&http2.Server{})
)

关于go - 为什么我在收到服务器序言之前关闭连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69542087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com