背景
随着微服务框架和云原生框架的出现,传统的单体应用程序被分解为一组细粒度的、自治的和面向业务能力的微服务,网络通信链路的数量激增,服务间的通信技术也因此成为了现代分布式系统中至关重要的一个环节。
目前,我们在应用开发中,最常用的通信方式是构建一个ResutFul服务,通过http协议进行服务调用,然后再比较多的场景下,restful服务对于构建进程间通信来讲过于庞大,低效并且容易出错,因为需要一个比restful服务更高效的高可扩展,松耦合的进程间通信技术,隐藏,诞生了gRPC,一种用于构建分布式应用程序和微服务的现代进程通信方式。
什么是gRPC
gRPC是一种进程间通信技术。在 gRPC 中,客户端可以直接调用不同机器上的服务端的方法,就像调用本地函数一样。
与许多 RPC 系统一样,gRPC 基于定义服务的思想,指定可以远程调用的接口及其参数和返回类型。服务端实现这个接口并运行一个 gRPC 服务器来处理客户端调用。而客户端有一个stub(在某些语言中也称为client),它提供与服务器相同的方法。客户端通过调用stub的方法来与服务端进行通信,获取响应结果。
下图为开发gRPC应用的一个示例:
gRPC的优点:
gRPC的缺点:
gRPC的四种消息流
·gRPC 支持四种通信模式,分别是简单 RPC、服务端流式 RPC、客户端流式 RPC 和双向流式 RPC。
简单RPC
在简单的 RPC 中,在 gRPC server端和 gRPC client端之间的通信总是一个请求对应一个响应。
服务端流式 RPC
从client端的角度来看,简单 RPC 和服务端流式 RPC 具有相同的请求消息流。在这两种情况下,我们都会发送一条请求消息。主要区别在于server端。server端会发送多条消息,而不是向client端发送一条响应消息。
客户端流式 RPC
在客户端流式 RPC 中,client端向server端发送多条消息,server端发送一条响应消息作为回复。
双向流式 RPC
在此模式中,client端通过发送请求头帧来建立连接。一旦建立连接,client端和server端都可以直接发送多个长度前缀消息,而无需等待对方完成。双方都可以自主结束连接,这意味着他们不能再发送任何消息。
总结
gRPC 建立在两个快速高效的协议之上,称为protocol buffer和 HTTP/2。protocol buffer是一种数据序列化协议,它是一种与语言无关、平台中立和可扩展的结构化数据序列化方法。序列化后,此协议会生成一个比普通 JSON 数据更小的二进制强类型数据。之后,这个序列化后的二进制数据会通过称为 HTTP/2 的二进制传输协议进行传输。
HTTP/2 是互联网协议 HTTP 的下一个主要版本。HTTP/2 是完全多路复用的,这意味着 HTTP/2 可以通过单个 TCP 连接并行发送多个数据请求。这使得用 HTTP/2 编写的应用程序比其他应用程序更快、更简单、更健壮。
所有这些因素使 gRPC 成为一个高性能的 RPC 框架。