【问题标题】:Running grpc and http servers simultaneously同时运行 grpc 和 http 服务器
【发布时间】:2020-06-16 17:42:03
【问题描述】:

我正在将现有的 http 应用程序迁移到基于 GRPC 的应用程序。一段时间以来,grpc 和 http 都将在同一个 go 文件中的不同端口上运行,我会将现有的 http 服务器部分移动到 goroutine 中。这就是它的样子。

    main() {
        //Move existing server  into a goroutine
        go func() {
             s.server, err = chttp.NewHTTPSServer("443", s.certPath, s.keyPath, s.Router, s.options)
            if err != nil {
                log.Fatalf("server: error creating HTTP server - %v\n", err)
            }

            if err := s.server.Serve(); err != http.ErrServerClosed {
                log.Fatalf("server: run error - %v\n", err)
            }
        }

        // Add new grpc server
        lis, err := net.Listen("tcp", ":8433")
        if err != nil {
            log.Fatalf("failed to listen: %v", err)
        }
        a := grpc.NewServer()
        pb.RegisterNewServer(a, &test.GrpcServer{})
        if err := a.Serve(lis); err != nil {
            log.Fatalf("failed to serve: %v", err)
        }

    }

这是否会导致任何问题,grpc、http 服务器可以从同一个程序同时运行吗?我不确定这是否会导致一些我不知道的问题。

【问题讨论】:

  • 在同一个二进制文件中运行两台服务器就可以了。确保如果一个人死了,另一个人也应该死。 log.Fatal 应该注意这一点。
  • 我没有这样做。但是我目前维护的服务的前所有者正是这样做的。还没有遇到任何与此相关的问题,已经一年半了。 :P

标签: go grpc grpc-go


【解决方案1】:

是的,从同一个二进制文件运行 gRPC 和 HTTP 服务器是完全可以的,只要端口不同。

当然,如果这两个服务器做不同的事情,最好分开。

如果您想为两台服务器做同样的事情,使用https://github.com/grpc-ecosystem/grpc-gateway 是一种常见的做法。它会读取您的 protobuf 定义并生成一个反向代理服务器以将 HTTP API 转换为 gRPC。

【讨论】:

  • 嗯,一直想问:REST 是以名词为中心,而 RPC 是以动词为中心,人们必须将一个翻译成另一个,这看起来很荒谬,不是吗?您知道一家在生产中使用 grpc 网关的严肃公司吗?
  • 我认为这并不荒谬。即使您在系统中仅创建 REST API,您也需要将其映射到作为动词的函数,对吗?我目前公司 (deliveryhero.com/brands) 的几个团队正在使用 grpc 网关。我还在我以前的公司中使用过它,我的 API 需要通过 gRPC 被另一个后端和一个通过 REST 的 Web 前端使用。
猜你喜欢
  • 1970-01-01
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2022-11-02
  • 2020-02-02
  • 2021-12-11
  • 1970-01-01
相关资源
最近更新 更多