首页 > 解决方案 > 为什么只有 http 或 gRPC 能够在 go 应用程序中启动?

问题描述

我正在尝试在 Go 应用程序中同时启动 http 和 gRPC 服务。但令我惊讶的是,只有 http 服务器或 gRPC 服务器可以启动。

func main() {
    xxhh.Test1()
    xxhh.Test2()

    app := fiber.New()

    app.Get("/", func(c *fiber.Ctx) error {
        return c.SendString("Hello, World !")
    })

    app.Listen(":3000")

    lis, err := net.Listen("tcp", port)
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer()

    pb.RegisterBookstoreServer(s, &server{})
    if err := s.Serve(lis); err != nil {
        log.Fatalf("failed to start grpc serve: %v", err)
    }

}

而且我还发现,如果我把http部分放在最前面,那么http可以启动而gRPC不能。反之亦然

在此处输入图像描述

标签: gogrpcgrpc-node

解决方案


将第一部分放在 Goroutines 中,如下所示

func main() {
xxhh.Test1()
xxhh.Test2()

app := fiber.New()

app.Get("/", func(c *fiber.Ctx) error {
    return c.SendString("Hello, World !")
})

go func() {
    log.Fatal(app.Listen(":3000"))
}()    

lis, err := net.Listen("tcp", port)
if err != nil {
    log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()

pb.RegisterBookstoreServer(s, &server{})
if err := s.Serve(lis); err != nil {
    log.Fatalf("failed to start grpc serve: %v", err)
}

}

推荐阅读