目录
一、什么是 RPC 框架 ?
二、什么是 gRPC 框架 ?
三、传统 RPC 与 gRPC 对比
四、gRPC 的优势和适用场景
五、gRPC 在分布式系统中应用场景
六、什么是 Protocol Buffers(ProtoBuf)?
特点
使用场景
简单的使用模拟
七、写一个gRPC 服务的基本流程
①、定义服务和消息
②、生成代码
③、实现服务接口
④、创建 gRPC 服务器
⑤、创建 gRPC 客户端
一、什么是 RPC 框架 ?
RPC
(Remote Procedure Call)描绘了Client
与Server
之间点对点调用流程,包括stub
、通信、RPC
消息解析等部分,实际应用中,还需要考虑服务的高可用、负载均衡等问题,所以产品级的RPC
框架除了点对点的RPC
协议具体实现外,还包括服务的发现与注销、提供服务多台Server
的负载均衡、服务的高可用等更多功能。
目前RPC
框架大致有两种不同的侧重方向,一种偏重于服务治理,另一种偏重于跨语言调用。
服务治理型的RPC
框架有:Dubbo
、DubboX
、Motan
等,这类RPC
框架的特点是功能丰富,提供高性能的远程调用以及服务发现及治理功能,适用于大型服务的微服务化拆分以及管理,对于特定语言(如Java
)的项目可以十分友好的透明化接入。但缺点是语言耦合度较高,跨语言支持难度较大。
跨语言调用型的RPC
框架有:Thrift
、gRPC
、Hessian
、Hprose
等,这一类RPC
框架重点关注于服务跨语言调用,能够支持大部分的语言进行语言无关的调用,非常适合于为不同语言提供通用远程服务的场景。但这类框架没有服务发现相关机制,实际使用时一般需要代理层进行请求转发和负载均衡策略控制。
二、什么是 gRPC 框架 ?
gRPC 是一种高性能、开源的远程过程调用(RPC)框架。它允许分布在不同计算机上的应用程序能够像调用本地方法一样进行通信,从而实现了在分布式系统中进行高效的通信。
三、传统 RPC 与 gRPC 对比
传统的 RPC 模型使用各种协议和编码方式进行通信,这可能导致跨语言通信困难、性能不佳等问题。与此不同,gRPC 使用 Google 开发的 Protocol Buffers(ProtoBuf)进行数据序列化,同时基于 HTTP/2 协议进行通信,从而提供了更高效的通信方式。
四、gRPC 的优势和适用场景
-
高性能: gRPC 使用二进制的 ProtoBuf 编码和 HTTP/2 多路复用等技术,从而实现低延迟和高吞吐量的通信。
-
多语言支持: gRPC 支持多种编程语言,包括 Java、Python、Go 等,使得不同团队可以选择自己擅长的语言进行开发。
-
强类型: 使用 ProtoBuf 定义消息和接口,消除了手动解析数据的麻烦。
-
双向流式通信: gRPC 支持双向流式数据传输,适用于实时性要求高的场景。
-
自动代码生成: 根据定义的服务接口和消息,gRPC 可以自动生成客户端和服务端代码,简化开发流程。
五、gRPC 在分布式系统中应用场景
-
微服务通信: gRPC 适用于微服务架构中各个服务之间的通信,能够有效减少通信开销。
-
跨数据中心通信: gRPC 的性能优势使其适用于跨多个数据中心进行通信,提供更好的用户体验。
-
实时通信: 借助双向流式通信,gRPC 适合实时通信场景,如聊天应用和实时数据推送。
-
通过了解 gRPC 的基本概念、与传统 RPC 的不同之处以及它在分布式系统中的优势,你将能够更好地理解为什么 gRPC 是一个值得学习和应用的强大工具。
六、什么是 Protocol Buffers(ProtoBuf)?
Protocol Buffers(简称Protobuf)是由Google
开发的一种用于数据序列化技术。与传统的XML
和JSON
相比,Protobuf
具有更高的性能和更小的消息体积,特别适用于需要高效数据交换的场景。
初由 Google 开发,用于解决跨平台、跨语言通信以及数据持久化的问题。ProtoBuf 使用简单的接口描述语言来定义数据结构和服务接口,并生成相应代码用于数据的序列化和反序列化。在 gRPC 中,使用 Protocol Buffers(ProtoBuf)进行数据传输非常简单,因为 gRPC 针对 ProtoBuf 提供了内置支持。
protoc 是 protobuf 定义数据结构的一种格式,用.proto
后缀的文件保存,使用proto编译器可以把对应的proto
结构编译为各目标语言的序列化与反序列化代码库
特点
- 速度快:
Protobuf
在序列化与反序列化数据时速度极快 - 占空间小:
Protobuf
序列化后的二进制数据非常小,可节省大量的存储和带宽 - 跨平台:
Protobuf
支持多种编程语言(常见的几乎都支持),兼容性好 - 易扩展:使用
.proto
文件定义数据结构(包括字段类型、默认值和验证规则等),添加新内容时,也可以轻松做到,不会破坏现有系统 - 简单易用:只需专注
.proto
数据结构文件的编写,对应的序列化与反序列化代码可自动生成
使用场景
- 分布式系统:各服务之间需要频繁地进行数据交换,
Protobuf
可以显著提高通信效率 - 存储和持久化:
Protobuf
能节省很多存储空间,常用于日志记录、配置文件和数据持久化 - 移动应用:在网络带宽和存储空间有限的情况下,
Protobuf
能更好地提高性能
protobuf
使用非常广泛,如很多平台的视频、直播间弹幕流即是使用这种技术传输,如有需要,还可对序列化消息进行gzip
压缩,进一步减少消息体积,节省带宽,提高传输速度 。
Protocol Buffers 编译器 (protoc)在 Windows 中怎么安装
protoc下载地址:https://github.com/protocolbuffers/protobuf/releases
protoc编译js文档:JavaScript Generated Code | protobuf-javascript
protoc编译js插件下载地址:https://github.com/protocolbuffers/protobuf-javascript/releases
简单的使用模拟
-
使用
proto
语法(规则)定义我们的数据结构,保存在.proto
后缀的文件内 -
使用proto编译器编译
结果将会生成对应语言的一个代码文件(内包含对应数据序列化与反序列化相关操作的类或函数).proto
文件,指定要编译成目标语言环境(Java
、Python
等) -
接着使用生成的代码文件即可。
七、写一个gRPC 服务的基本流程
①、定义服务和消息
首先,你需要创建一个 .proto 文件来定义服务接口和消息类型。在这个文件中,你可以定义服务方法、请求消息和响应消息。这些定义将用于生成服务端和客户端的代码。
②、生成代码
使用 Protocol Buffers 编译器(protoc)来生成对应编程语言的代码
③、实现服务接口
在服务端,你需要创建一个类来实现定义的服务接口。这个类应该继承自生成的服务接口,并实现相应的方法。
④、创建 gRPC 服务器
在服务端代码中,你需要创建一个 gRPC 服务器,将服务实现类注册到服务器中。
⑤、创建 gRPC 客户端
在客户端,你可以使用生成的客户端代码来调用 gRPC 服务方法
至此,理论部分介绍完毕,后续将使用SpringBoot具体代码实现gRPC四种通信模式。