【问题标题】:Why can't I start two servers in the same Go project?为什么我不能在同一个 Go 项目中启动两个服务器?
【发布时间】: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() 并保持其余部分不变。

标签: go go-gin grpc-go


【解决方案1】:

startGRPCServer 函数会阻止运行 grpc 服务器。在 goroutine 中运行 GRPC 服务器,以便 startGRPCServer 返回。

func startGRPCServer() {
    listener, err := net.Listen("tcp", ":9000")
    if err != nil {
        log.Fatalf("could not attach listener to port: %v", err)
    }

    s := grpc.NewServer()
    go func() {
        if err := s.Serve(listener); err != nil {
            log.Fatalf("could not start grpc server: %v", err)
        }
    }()
}

【讨论】:

  • 谢谢!如果我在 goroutine 中运行 gRPC 服务器,是否需要担心任何性能问题?
  • 一个额外的 goroutine 不会产生任何性能问题。
猜你喜欢
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
  • 2015-12-26
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多