考虑Go gRPC代码库中的示例:
func main() {
// Set up a connection to the server.
conn, err := grpc.Dial(address, grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewGreeterClient(conn)
// Contact the server and print out its response.
name := defaultName
if len(os.Args) > 1 {
name = os.Args[1]
}
r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: name})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.Message)
}
当从其他服务使用gRPC服务时,连接范围(conn
)应该是什么?我认为它应该与消费者服务处理的请求的范围有亲缘关系,但我还没有找到任何关于此的文档。我应该在这里使用连接池吗?
E.G。
答案 0 :(得分:3)
根据经验,应该在客户端应用程序的生命周期中重用gRPC客户端连接,因为它们可以安全地并发使用。此外,gRPC的一个关键特性是来自远程程序调用的快速响应,如果您必须在收到的每个请求上重新连接,这将无法实现。
尽管如此,强烈建议使用某种gRPC负载平衡以及这些持久连接。否则,很多负载可能会在一些长期存在的grpc客户端 - 服务器连接上结束。负载平衡选项包括: