为什么只有 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不能。 反之亦然

enter image description here

解决方法

将第一部分放入 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)
}

}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...