3

我已经阅读了这个答案:https ://stackoverflow.com/a/56943771/6463558,它说没有办法使用grpc-node包在相同的地址和端口上运行 gRPC 服务器和 HTTP 服务器。

localhost:3000但是我可以使用包在相同的地址和端口(例如,两者都使用)创建 gRPC 服务器和 HTTP 服务器grpc-go。这是一个例子:https ://github.com/mrdulin/grpc-go-cnode/blob/master/cmd/server/main.go#L79

那么,为什么 grpc-node 和 grpc-go 行为不一致。这有意义吗?

我期望的结果是,无论在grpc中实现什么语言,行为都应该是一致的。所以grpc服务器应该能够与同一个系统进程中Node的标准库http创建的服务器共享同一个端口。

4

2 回答 2

3

这一切都与实施有关。每种语言都有自己的 gRPC 实现。每种语言的实现都存在许多差异,其中一些是由于语言能力,还有一些是由于维护者。每个项目都是不同的项目。

在这种情况下,我们不能说 gRPC 和 HTTP 服务器共享同一个地址。只有 HTTP 服务器在运行。但是,gRPC 服务器的 Golang 实现可以选择通过 HTTP 为 gRPC 提供服务。

打电话

server.ServeHTTP()

代替

server.Serve()

这是可能的,因为在底层,gRPC 服务器构建在 HTTP2 之上

你分享的链接中的这个片段让我说的很清楚

if request.ProtoMajor != 2 {
            mux.ServeHTTP(writer, request)
            return
}

if strings.Contains(request.Header.Get("Content-Type"), "application/grpc") {
                grpcServer.ServeHTTP(writer, request)
                return
}

如果你想在 Node 中做同样的事情,你需要检查 grpc-node 实现,如果有这样的东西可用

于 2020-09-01T22:05:29.897 回答
2

您的示例使用Go 标准库http.NewServeMux()提供的. Node 标准库不提供等效功能,因此您不能以这种方式共享端口。

于 2020-08-31T16:22:39.937 回答