假设我给定的 GRPC 端点具有以下实现
type HandlerFunc func(ctx context.Context, in *pb.Request) (*pb.Response, error)
func newHandler() HandlerFunc {
func (s *Server) Process(ctx context.Context, in *pb.Request) (*pb.Response, error) {
//do processing
}
}
type Server struct {
Handler handler
}
func new() (s *Server) {
return &Server{
handler: handlers.newHandler()
}
}
func (s *Server) Process(ctx context.Context, in *pb.Request) (*pb.Response, error) {
return s.handler
}
现在假设多个客户端尝试调用 Process 端点。它们是都调用同一个服务器实例的同一个 Process 函数,还是调用不同服务器实例的 Process 函数?
也是在
中定义的处理程序func newHandler() HandlerFunc {
func (s *Server) Process(ctx context.Context, in *pb.Request) (*pb.Response, error) {
//do processing
}
}
处理程序的同一个实例是否处理来自同一个客户端的多个请求?还有不同的客户呢?处理程序的同一个实例是否处理来自多个客户端的请求?
最佳答案
很抱歉,我很难理解您提供的代码。似乎 Process
是您正在为其编写服务处理程序的 RPC 调用。但是 handler
类型是什么。函数 newHandler()
也用作方法。此外,我也没有看到包装服务处理程序的需要。
我们走官方怎么样example来自 gRPC 的 github 的一元 RPC。
如果你看here ,定义了一个 gRPC 服务处理程序,它处理 SayHello
RPC。
多个客户端可以多次调用此 RPC,所有调用都将在单独的 goroutine 中运行。现在,人们可能想要在这些调用之间共享一些信息是可以理解的。这可以通过使用更多逻辑扩充您的服务处理程序 type server struct
来实现,例如带有互斥锁的数据结构。
希望这能回答一些问题。
最佳 马克
关于go - GRPC 中的请求是如何处理的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49613649/