3 gRPC
简介
gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持。
gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。
gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC) 系统。
在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。
图 12 gRPC 简图
特性
- 基于 HTTP/2
HTTP/2 提供了连接多路复用、双向流、服务器推送、请求优先级、首部压缩等机制。可以节省带宽、降低 TCP 链接次数、节省 CPU,帮助移动设备延长电池寿命等。 gRPC 的协议设计上使用了 HTTP2 现有的语义,请求和响应的数据使用 HTTP Body 发送,其他的控制信息则用 Header 表示。
- IDL 使用 ProtoBuf
gRPC 使用 ProtoBuf 来定义服务,ProtoBuf 是由 Google 开发的一种数据序列化协议(类似于 XML、JSON、hessian)。ProtoBuf 能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。压缩和传输效率高,语法简单,表达力强。
- 多语言支持(C, C++, Python, PHP, Nodejs, C#, Objective-C、Golang、Java)
gRPC 支持多种语言,并能够基于语言自动生成客户端和服务端功能库。目前已提供了 C 版本 grpc、Java 版本 grpc-java 和 Go 版本 grpc-go,其它语言的版本正在积极开发中,其中,grpc 支持 C、C++、Node.js、Python、Ruby、Objective- C、PHP 和 C#等语言,grpc-java 已经支持 Android 开发。
优点 :
- protobuf 二进制消息,性能好/效率高(空间和时间效率都很不错)
- proto 文件生成目标代码,简单易用
- 序列化反序列化直接对应程序中的数据类,不需要解析后在进行映射(XML,JSON 都是这种方式)
- 支持向前兼容(新加字段采用默认值)和向后兼容(忽略新加字段),简化升级
- 支持多种语言(可以把 proto 文件看做 IDL 文件)
- Netty 等一些框架集成
缺点 :
- GRPC 尚未提供连接池,需要自行实现
- 尚未提供“服务发现”、“负载均衡”机制
- 因为基于 HTTP2,绝大部多数 HTTP Server、Nginx 都尚不支持,即 Nginx 不能将 GRPC 请求作为 HTTP 请求来负载均衡,而是作为普通的 TCP 请求。(nginx1.9 版本已支持)
- Protobuf 二进制可读性差(貌似提供了 Text_Fromat 功能)。默认不具备动态特性(可以通过动态定义生成消息类型或者动态编译支持)
架构
gRPC 是一个高性能的、开源的远程过程调用 (RPC) 框架,最初由谷歌开发。它允许不同的应用程序通过网络轻松进行通信,支持多种编程语言。gRPC 基于 HTTP/2 协议,使用 Protocol Buffers 作为接口描述语言,提供了高效的序列化和反序列化。以下是对 gRPC 架构的详细介绍,包括其组件、工作原理、特点和应用场景。
一、gRPC 架构组件
Protocol Buffers (Protobuf) :
- gRPC 使用 Protocol Buffers 作为其接口定义语言(IDL)。Protobuf 是一种语言中立、平台中立的序列化结构数据的方式,适合用于数据传输。
- 用户定义服务和消息格式,并通过
.proto
文件进行描述。
gRPC 服务器 :
- 服务器实现定义在 Protobuf 文件中的服务,并处理来自客户端的请求。
- gRPC 服务器可以并发处理多个请求,具有高效的请求处理能力。
gRPC 客户端 :
- 客户端通过 gRPC 生成的存根(stub)与 gRPC 服务器进行通信。客户端代码会自动生成,简化了开发过程。
- 客户端可以调用远程服务,就像调用本地方法一样,隐藏了网络调用的复杂性。
负载均衡 :
- gRPC 提供了内置的负载均衡机制,支持客户端负载均衡和服务端负载均衡,能够分发请求到多个后端服务器,提高系统的可扩展性和容错性。
流式处理 :
- gRPC 支持四种不同的 RPC 类型:
- 单次请求/响应 (Unary):客户端发送单个请求,服务器返回单个响应。
- 服务器流式 (Server Streaming):客户端发送单个请求,服务器返回一个响应流。
- 客户端流式 (Client Streaming):客户端发送一个请求流,服务器返回单个响应。
- 双向流式 (Bidirectional Streaming):客户端和服务器可以同时发送和接收请求流。
- gRPC 支持四种不同的 RPC 类型:
二、gRPC 工作原理
定义服务 :
- 使用 Protocol Buffers 定义服务及其方法。例如:
syntax = "proto3"; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply); } message HelloRequest { string name = 1; } message HelloReply { string message = 1; }
- 使用 Protocol Buffers 定义服务及其方法。例如:
生成代码 :
- 使用
protoc
工具生成服务器端和客户端的代码,以支持不同的编程语言。
- 使用
实现服务 :
- 开发者在服务器端实现定义的服务逻辑,在客户端调用相应的存根方法。
进行通信 :
- 客户端通过生成的存根与服务器进行远程调用,服务器处理请求并返回响应,整个过程通过 HTTP/2 进行传输。
三、gRPC 的特点
高性能 :
- gRPC 基于 HTTP/2,支持多路复用、流控制和头压缩,具有低延迟和高吞吐量。
跨语言支持 :
- gRPC 支持多种编程语言(如 Java、Go、Python、C++、Node.js 等),方便不同系统之间的互操作。
强类型 :
- Protocol Buffers 提供了强类型系统,确保数据的结构一致性和类型安全。
流式传输 :
- 支持流式 RPC,允许客户端和服务器进行更灵活的交互。
内置安全 :
- gRPC 提供了基于 TLS 的安全传输,确保数据的保密性和完整性。
易于扩展 :
- gRPC 的负载均衡、故障恢复和跟踪功能,使其非常适合微服务架构和分布式系统。
四、gRPC 的应用场景
微服务架构 :
- gRPC 非常适合微服务架构中的服务间通信,能够高效地处理高并发请求。
实时应用 :
- 支持双向流式通信的特性,使 gRPC 适用于实时应用,如聊天应用、视频会议等。
数据处理系统 :
- 在大数据处理和机器学习系统中,gRPC 可以用作数据传输和任务协调的有效工具。
跨语言服务 :
- gRPC 的跨语言支持使得不同语言编写的服务可以无缝协作,方便构建复杂的系统。
五、总结
gRPC 是一个强大且灵活的远程过程调用框架,适合构建高性能、可扩展的分布式系统。通过 Protocol Buffers 定义服务和数据结构,gRPC 提供了高效的通信机制,支持多种语言和多种通信模式。随着微服务和云原生应用的普及,gRPC 的应用场景将会越来越广泛。
本章参考
[1]. gRPC 官方文档中文版 http://doc.oschina.net/grpc
[2]. gRPC https://blog.csdn.net/xuduorui/article/details/78278808
[3]. RPC 框架性能基本比较测试 www.useopen.net/blog/2015/rpc-performance.html
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论