sli*_*wp2 7 grpc grpc-node grpc-go
我读过这个答案:/sf/answers/3986064001/,它说无法使用grpc-nodepackage.json 在相同的地址和端口运行 gRPC 服务器和 HTTP 服务器。
但我可以使用 package.json 在相同的地址和端口(例如都使用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创建的服务器共享相同的端口。
小智 8
一切都与实施有关。每种语言都有自己的 gRPC 实现。每种语言的实现都有很多差异,有些是由于语言能力造成的,但也有些是由于维护者造成的。每个项目都是一个不同的项目。
在这种情况下,我们不能真正说 gRPC 和 HTTP 服务器共享相同的地址。只有 HTTP 服务器正在运行。但是,gRPC 服务器的 Golang 实现可以选择通过 HTTP 提供 gRPC 服务。
呼唤
server.ServeHTTP()
Run Code Online (Sandbox Code Playgroud)
代替
server.Serve()
Run Code Online (Sandbox Code Playgroud)
这是可能的,因为在底层,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
}
Run Code Online (Sandbox Code Playgroud)
如果你想在 Node 中做同样的事情,你需要检查 grpc-node 实现是否有这样的东西可用