微服务gRPC学习笔记(五)| 青训营笔记

170 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天

服务定义

有了这些东西以后,我们就可以在远程服务器通过gRPC框架直接调用我们想要的服务器,然后就可以完成我们的目标。 gRPC 默认使用 protocol buffers 作为接口定义语言,来描述服务接口和有效载荷消息结构。如果有需要的话,可以使用其他替代方案。 在gRPC中,服务定义是您定义您的RPC API的方式。服务定义文件中的每一项都描述了一个可以远程调用的方法,它接受的参数,返回的结果以及错误信息。您可以使用任何支持Protocol Buffers的语言编写服务定义文件,然后使用gRPC生成代码来生成客户端和服务器端代码。

在定义服务时,您可以使用多种类型的请求/响应方式,包括单个请求单响应、服务器流、客户端流和双向流。这些不同的方式可以满足不同的应用需求,例如单个请求单响应适用于查询操作,而服务器流适用于传送大量数据。

gRPC还支持异步请求,这意味着您的应用程序可以在不等待答复的情况下发送请求。它还支持多种认

service HelloService {
  rpc SayHello (HelloRequest) returns (HelloResponse);
}

message HelloRequest {
  required string greeting = 1;
}

message HelloResponse {
  required string reply = 1;
}

gRPC 允许你定义四类服务方法:

  • 单项 RPC,即客户端发送一个请求给服务端,从服务端获取一个应答,就像一次普通的函数调用。
rpc SayHello(HelloRequest) returns (HelloResponse){
}
  • 服务端流式 RPC,即客户端发送一个请求给服务端,可获取一个数据流用来读取一系列消息。客户端从返回的数据流里一直读取直到没有更多消息为止。
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse){
}
  • 客户端流式 RPC,即客户端用提供的一个数据流写入并发送一系列消息给服务端。一旦客户端完成消息写入,就等待服务端读取这些消息并返回应答。
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse) {
}
  • 双向流式 RPC,即两边都可以分别通过一个读写数据流来发送一系列消息。这两个数据流操作是相互独立的,所以客户端和服务端能按其希望的任意顺序读写,例如:服务端可以在写应答前等待所有的客户端消息,或者它可以先读一个消息再写一个消息,或者是读写相结合的其他方式。每个数据流里消息的顺序会被保持。
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse){
}

我们将在下面 RPC 生命周期章节里看到各类 RPC 的技术细节。