【发布时间】:2021-04-05 23:52:43
【问题描述】:
我是一名新的 Go 开发人员,我正在尝试构建一个同时具有 gRPC 服务器和 Gin HTTP 服务器的项目。这是我的代码大致的样子:
package main
import (
"log"
"net"
"github.com/gin-gonic/gin"
"google.golang.org/grpc"
)
func main() {
startGRPCServer()
startHTTPServer()
}
func startGRPCServer() {
listener, err := net.Listen("tcp", ":9000")
if err != nil {
log.Fatalf("could not attach listener to port: %v", err)
}
s := grpc.NewServer()
if err := s.Serve(listener); err != nil {
log.Fatalf("could not start grpc server: %v", err)
}
}
func startHTTPServer() {
g := gin.Default()
if err := g.Run(":8000"); err != nil {
log.Fatalf("could not start http server: %v", err)
}
}
当我运行上面的代码时,只有 gRPC 服务器启动。 startHTTPServer() 函数甚至没有被调用。当我切换调用顺序时(将startHTTPServer() 移动到startGRPCServer() 上方),startGRPCServer() 函数永远不会被调用。为什么会这样?我该如何解决这个问题,以便调用两个函数并运行两个服务器?
【问题讨论】:
-
您可以启动任意数量的服务器,但是您的两个
start*函数都处于阻塞状态,因此您需要在单独的 goroutine 中运行它们(并防止main提前返回,通常是通过等待类似SIGTERM) 的信号。 -
将
startGRPCServer()更改为go startGRPCServer()并保持其余部分不变。