为什么我在Go语言中收到服务器前导之前就收到了连接关闭的消息?

huangapple go评论104阅读模式
英文:

Why am i getting connection connection closed before server preface received in go?

问题

我正在尝试在同一个端口上使用grpc-gateway设置一个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))
	}

	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
}

希望对你有所帮助!

英文:

I am trying to setup a rpc server and a proxy HTTP server over GRPC server on same port using grpc-gateway. Wierdly some times i am getting failed to receive server preface within timeout error randomly. Most of the times it happens on service restarts. It starts working and returns proper response after couple of retries. I am not sure what's happening. Can somebody help me out ? Here is the service startup snippet

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
}

答案1

得分: 2

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

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

Try wrapping your router with h2c.NewHandler so the the http.Serve() call looks as follows:

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

huangapple
  • 本文由 发表于 2021年10月12日 22:10:40
  • 转载请务必保留本文链接:https://go.coder-hub.com/69542087.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定