@@ -5,7 +5,8 @@ permalink: /manuscripts/microservice/grpc.html
55
66# gRPC
77
8- ** gRPC 是一种可扩展、松耦合且类型安全的解决方案,与传统的基于 REST/HTTP 的通信相比,它实现了更高效的进程间通信。允许你像本地方法调用一样调用、调试分布式应用程序**
8+ ** gRPC 是一种可扩展、松耦合且类型安全的解决方案,与传统的基于 REST/HTTP 的通信相比,它实现了更高效的进程间通信。允许你像本地方法调用一样调用、调试分布式应用程序
9+ **
910
1011gRPC 是一个现代开源高性能远程过程调用 (RPC) 框架,可以在任何环境中运行。它可以通过对负载平衡、跟踪、健康检查和身份验证的可插拔支持,
1112有效地连接数据中心内和跨数据中心的服务,基于Protobuf序列化协议开发,且支持众多开发语言。
@@ -54,15 +55,17 @@ rpc SayHello(HelloRequest) returns (HelloResponse);
5455
5556- 服务器流式 RPC
5657
57- 其中客户端向服务器发送请求并获取流以读取一系列消息。客户端从返回的流中读取,直到没有更多消息为止。** gRPC 保证单个 RPC 调用中的消息排序**
58+ 其中客户端向服务器发送请求并获取流以读取一系列消息。客户端从返回的流中读取,直到没有更多消息为止。** gRPC 保证单个 RPC
59+ 调用中的消息排序**
5860
5961``` protobuf
6062rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);
6163```
6264
6365- 客户端流式 RPC
6466
65- 其中客户端写入一系列消息并将它们发送到服务器,再次使用提供的流。客户端完成消息写入后,它会等待服务器读取消息并返回响应。gRPC 再次保证单个 RPC 调用中的消息排序。
67+ 其中客户端写入一系列消息并将它们发送到服务器,再次使用提供的流。客户端完成消息写入后,它会等待服务器读取消息并返回响应。gRPC
68+ 再次保证单个 RPC 调用中的消息排序。
6669
6770``` protobuf
6871rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);
@@ -78,15 +81,17 @@ rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);
7881
7982### 使用 API
8083
81- 从文件中的服务定义开始` .proto ` ,gRPC 提供生成客户端和服务器端代码的协议缓冲区编译器插件。gRPC 用户通常在客户端调用这些 API,并在服务器端实现相应的 API。
84+ 从文件中的服务定义开始` .proto ` ,gRPC 提供生成客户端和服务器端代码的协议缓冲区编译器插件。gRPC 用户通常在客户端调用这些
85+ API,并在服务器端实现相应的 API。
8286
8387- 在服务器端,服务器实现服务声明的方法,并运行一个 gRPC 服务器来处理客户端调用。gRPC 基础结构解码传入请求、执行服务方法并对服务响应进行编码。
84- 在客户端,客户端有一个称为存根(对于某些语言,首选术语是客户端)的本地对象,它实现与服务相同的方法。
88+ 在客户端,客户端有一个称为存根(对于某些语言,首选术语是客户端)的本地对象,它实现与服务相同的方法。
8589- 客户端然后可以在本地对象上调用这些方法,这些方法将调用的参数包装在适当的协议缓冲区消息类型中,将请求发送到服务器,并返回服务器的协议缓冲区响应。
8690
8791### 同步与异步
8892
89- 在响应从服务器到达之前阻塞的同步 RPC 调用最接近于 RPC 所追求的过程调用的抽象。** 另一方面,网络本质上是异步的,在许多情况下,能够在不阻塞当前线程的情况下启动 RPC 是很有用的** 。
93+ 在响应从服务器到达之前阻塞的同步 RPC 调用最接近于 RPC 所追求的过程调用的抽象。** 另一方面,网络本质上是异步的,在许多情况下,能够在不阻塞当前线程的情况下启动
94+ RPC 是很有用的** 。
9095
9196## RPC 生命周期
9297
@@ -101,7 +106,8 @@ rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);
101106
102107### 服务器流式 RPC
103108
104- 服务器流式 RPC 类似于一元 RPC,不同之处在于服务器返回消息流以响应客户端的请求。发送完所有消息后,服务器的状态详细信息(状态代码和可选的状态消息)和可选的尾随元数据将发送到客户端。这样就完成了服务器端的处理。客户端在收到服务器的所有消息后完成。
109+ 服务器流式 RPC 类似于一元
110+ RPC,不同之处在于服务器返回消息流以响应客户端的请求。发送完所有消息后,服务器的状态详细信息(状态代码和可选的状态消息)和可选的尾随元数据将发送到客户端。这样就完成了服务器端的处理。客户端在收到服务器的所有消息后完成。
105111
106112### 客户端流式 RPC
107113
@@ -140,17 +146,21 @@ rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);
140146
141147优点:
142148
143- - ** 实现的进程间通信方式高效。** gRPC 不使用 JSON 或 XML 等文本格式,而是使用基于二进制协议的protocol buffer与 gRPC 服务、客户端进行通信。此外,gRPC 是在 HTTP/2 之上实现的protocol buffer,这使得进程间通信更快。
144- - ** 具有简单、定义良好的服务接口和协议。** 你首先定义服务接口,然后处理实现细节。因此,与用于RESTful服务定义的 OpenAPI/Swagger 和用于 SOAP Web 服务的 WSDL 不同,gRPC 提供了简单但一致、可靠且可扩展的应用程序开发体验。
149+ - ** 实现的进程间通信方式高效。** gRPC 不使用 JSON 或 XML 等文本格式,而是使用基于二进制协议的protocol buffer与 gRPC
150+ 服务、客户端进行通信。此外,gRPC 是在 HTTP/2 之上实现的protocol buffer,这使得进程间通信更快。
151+ - ** 具有简单、定义良好的服务接口和协议。** 你首先定义服务接口,然后处理实现细节。因此,与用于RESTful服务定义的
152+ OpenAPI/Swagger 和用于 SOAP Web 服务的 WSDL 不同,gRPC 提供了简单但一致、可靠且可扩展的应用程序开发体验。
145153- ** 强类型。** protocol buffer清楚地定义了应用程序之间通信的数据类型,这使得分布式应用程序开发更加稳定。因为静态类型有助于减少你在构建跨多个团队和技术的云原生应用程序时遇到的大多数运行时和交互错误。
146- - ** 支持多语言。** gRPC被设计成支持多种编程语言。使用protocol buffer的服务定义与语言无关。因此,你可以选择grpc支持的任意语言,并与任何现有的 gRPC 服务或客户端进行通信。
154+ - ** 支持多语言。** gRPC被设计成支持多种编程语言。使用protocol buffer的服务定义与语言无关。因此,你可以选择gRPC支持的任意语言,并与任何现有的
155+ gRPC 服务或客户端进行通信。
147156- ** 支持双向流式传输。** gRPC 对客户端或服务器端流式传输具有原生支持,这使得开发流媒体服务或流媒体客户端变得更加容易。
148157- ** 内置多种高级特性。** gRPC 提供对高级特性的内置支持,例如身份验证、加密、元数据交换、压缩、负载平衡、服务发现等。
149158- ** 与云原生生态系统高度集成。** gRPC 是 CNCF 的一部分,大多数现代框架和技术都为 gRPC 提供了开箱即用的原生支持。
150159
151160缺点:
152161
153- - ** 可能不适合面向外部的服务。** 当你想将应用程序或服务提供给外部客户端使用时,gRPC 可能不是最合适的协议,因为大多数外部使用者对 gRPC 还很陌生。而且,gRPC 服务的协议驱动、强类型化特性可能会降低你向外部提供的服务的灵活性,因为外部使用者可以控制的东西要少得多。
162+ - ** 可能不适合面向外部的服务。** 当你想将应用程序或服务提供给外部客户端使用时,gRPC 可能不是最合适的协议,因为大多数外部使用者对
163+ gRPC 还很陌生。而且,gRPC 服务的协议驱动、强类型化特性可能会降低你向外部提供的服务的灵活性,因为外部使用者可以控制的东西要少得多。
154164- ** 生态系统相对较小。** 与传统的 REST/HTTP 协议相比,gRPC 生态系统仍然相对较小。浏览器和移动应用程序对 gRPC 的支持仍处于初级阶段。
155165
156166## 参考资料
0 commit comments