介绍关键的gRPC概念,概述gRPC架构和RPC生命周期。
不熟悉gRPC?请先阅读《gRPC简介》。关于特定语言的细节,请参见您所选择的语言的快速入门、教程和参考文档。
纵观全局
服务定义
像许多RPC系统一样,gRPC也是围绕着定义服务的理念,指定可以远程调用的方法及其参数和返回类型。默认情况下,gRPC使用协议缓冲区作为接口定义语言(IDL)来描述服务接口和有效载荷消息的结构。如果需要的话,也可以使用其他的替代品。
service HelloService { rpc SayHello (HelloRequest) returns (HelloResponse); } message HelloRequest { string greeting = 1; } message HelloResponse { string reply = 1; }
gRPC让你定义四种服务方法。
单一的RPC,客户端向服务器发送一个请求,并得到一个响应,就像普通的函数调用一样。
rpc SayHello(HelloRequest) 返回(HelloResponse)。
服务器流式RPC,客户端向服务器发送一个请求,并得到一个流来读回一连串的消息。客户端从返回的流中读取信息,直到没有更多的信息。gRPC保证在单个RPC调用中的信息排序。
rpc LotsOfReplies(HelloRequest) 返回(stream HelloResponse)。
客户端流式RPC,客户端写了一连串的消息并将它们发送到服务器,同样使用一个提供的流。一旦客户端完成了消息的写入,它就等待服务器读取这些消息并返回其响应。gRPC再次保证了单个RPC调用中的消息排序。
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);
双向流RPC,双方都使用读写流发送一连串的消息。这两个流独立运行,因此客户和服务器可以按照他们喜欢的顺序进行读写:例如,服务器可以等待收到所有客户的消息,然后再写它的响应,或者它可以交替地读一个消息然后写一个消息,或者其他一些读和写的组合。每个流中的消息的顺序被保留下来。
rpc BidiHello(stream HelloRequest) 返回(stream HelloResponse)。
你会在下面的RPC生命周期部分了解更多关于不同类型的RPC。
使用API
从.proto文件中的服务定义开始,gRPC提供了生成客户端和服务器端代码的协议缓冲区编译器插件。gRPC用户通常在客户端调用这些API,并在服务器端实现相应的API。
在服务器端,服务器实现服务所声明的方法,并运行gRPC服务器来处理客户端调用。gRPC基础设施对传入的请求进行解码,执行服务方法,并对服务响应进行编码。
在客户端,客户端有一个被称为存根的本地对象(对于某些语言,首选术语是客户端),它实现的方法与服务相同。然后,客户端就可以在本地对象上调用这些方法,将调用的参数包装在适当的协议缓冲区消息类型中--gRPC在向服务器发送请求并返回服务器的协议缓冲区响应后查看。
同步与异步
同步的RPC调用,在服务器的响应到达之前,是最接近于RPC所期望的过程调用的抽象的。另一方面,网络本身就是异步的,在许多情况下,能够在不阻塞当前线程的情况下启动RPC是非常有用的。
大多数语言中的gRPC编程API都有同步和异步两种类型。你可以在每种语言的教程和参考文档中找到更多信息(完整的参考文档即将推出)。
标签:生命周期,架构,grpc,gRPC,RPC,调用,服务器,HelloRequest,客户端 From: https://www.cnblogs.com/ben-zhou/p/16742173.html