如何在GRPC中处理请求?

时间:2018-04-02 15:00:21

标签: go grpc

让我们说我给定的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
    }
}

处理程序的同一个实例是否处理来自同一客户端的多个请求?还有不同的客户呢?是处理来自多个客户端的请求的处理程序的相同实例吗?

1 个答案:

答案 0 :(得分:0)

对不起,我很难理解您提供的代码。似乎Process是您正在为其编写服务处理程序的RPC调用。但那么handler类型是什么。函数newHandler()也用作方法。此外,我也没有看到包装服务处理程序的必要性。

我们如何从gRPC的github获取一元RPC的官方example

如果查看here,则会定义一个处理SayHello RPC的gRPC服务处理程序。

多个客户端可以对此RPC进行多次调用,所有这些调用都将在单独的goroutine中运行。现在,人们可能希望在这些调用之间共享一些信息是可以理解的。这可以通过使用更多逻辑扩充服务处理程序type server struct来实现,例如具有互斥锁的数据结构。

希望这能回答一些问题。

最佳