go - 为什么只有 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不能。反之亦然
解决方案
将第一部分放在 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)
}
}
推荐阅读
- haskell - 玫瑰树的单子
- python - 如何将 LDS 传感器的数据写入 csv 文件?
- flutter - 颤动如何在屏幕上进行分页
- excel - 根据 Excel 中包含开始日期的单元格制作自动格式化时间线
- ios - 如何在 SwiftUI 列表中保持相等的行距?
- java - Java - 仅使用一个注释验证多个字段
- mysql - 在没有CASE的SQL中嵌套NULLIF(将列的值分配给null if(条件A)或(条件B))
- iframe - Apache superset iFrame 集成具有 CORS,无法正常工作
- python - rpi-rf_send 脚本 + python raspberry pi 中的硬编码射频代码
- go - 尝试“获取”geos 包时出错