服务器上的GRPC服务可以用不同的语言实现吗?

TDN*_*TDN 5 language-agnostic api cross-language grpc

据我所知,任何支持 GRPC 的语言都可以生成 GRPC 客户端。但是,同一个proto文件可以用不同的语言来实现服务器上的服务吗?

例如,我有这个原型文件:

service Greeter {
  rpc SayHello (Request) returns (Reply) {}
}

service Goodbye {
  rpc SayGoodBye(Request) returns (Reply) {}
}

message Request {
  string name = 1;
}

message Reply {
  string message = 1;
}
Run Code Online (Sandbox Code Playgroud)

Greeter 和 Goodbye 2 个服务可以用不同的语言实现吗,例如:

  • 迎宾员:Golang
  • 再见:Java

当我将这 2 个服务分成 2 个不同的原始文件时,情况会怎样?

如果可以用不同的语言来完成,这是一个很好的做法吗?我能想到的用例是当团队的所有成员不能使用同一种语言工作时,比如很难招募新的 Golang 开发人员,而团队需要招募一些 Java 开发人员来继续该项目。

lui*_*los 4

原型文件是通用合约,可以由共享同一合约的许多不同应用程序/服务使用。常见的做法是为不同语言构建同一组原始文件,并由使用这些语言的应用程序使用,而不失通用性。

所以,是的,Greeter 可以用 Golang 实现,Goodbye 可以用 Java 实现,只要它们正确实现了必要的 gRPC 接口。

您可以将服务分离到不同的原始文件中,但这取决于它们的相关程度。如果您要提供一组可以很好地组合在一起的特定功能,那么最好将其放在同一个原型文件中。在这种情况下,请使用您的最佳判断,就像您决定将一组 Python 类放置在同一模块中时所使用的方法一样。

对于关于在不同语言上使用服务是否是好/坏实践的最后一个问题,请记住,gRPC 允许基于相同原型合约的多种语言完全允许协议满足不同的要求。例如,您可以拥有一个 Python 客户端,它是一个非常用户友好的 Python API,它通过 gRPC 与旨在利用 C++ 性能的 C++ 服务器进行通信。只要您从原型合约中正确实现服务,您就可以根据应用程序的要求自由使用您想要的语言。