APP下载

跟我学 gRPC—1. gRPC 及相关介绍

消息来源:baojiabao.com 作者: 发布时间:2026-05-12

报价宝综合消息跟我学 gRPC—1. gRPC 及相关介绍

Go语言中文网,致力于每日分享编码、开源等知识,欢迎关注我,会有意想不到的收获!

专案地址:https://github.com/EDDYCJY/go-grpc-example

作为开篇章,将会介绍 gRPC 相关的一些知识。简单来讲 gRPC 是一个 基于 HTTP/2 协议设计的 RPC 框架,它采用了 Protobuf 作为 IDL

你是否有过疑惑,它们都是些什么?本文将会介绍一些常用的知识和概念,更详细的会给出手册地址去深入

一、RPC

什么是 RPC

RPC 代指远端过程呼叫(Remote Procedure Call),它的呼叫包含了传输协议和编码(物件序列号)协议等等。允许运行于一台计算机的程式呼叫另一台计算机的子程式,而开发人员无需额外地为这个互动作用程式设计

实际场景:

有两台服务器,分别是A、B。在 A 上的应用 C 想要呼叫 B 服务器上的应用 D,它们可以直接本地呼叫吗?

答案是不能的,但走 RPC 的话,十分方便。因此常有人称使用 RPC,就跟本地呼叫一个函式一样简单

RPC 框架

我认为,一个完整的 RPC 框架,应包含负载均衡、服务注册和发现、服务治理等功能,并具有可拓展性便于流量监控系统等接入

那么它才算完整的,当然了。有些较单一的 RPC 框架,通过组合多元件也能达到这个标准

你认为呢?

常见 RPC 框架

gRPCThriftRpcxDubbo

比较一下

为什么要 RPC

简单、通用、安全、效率

RPC 可以基于 HTTP 吗

RPC 是代指远端过程呼叫,是可以基于 HTTP 协议的

肯定会有人说效率优势,我可以告诉你,那是基于 HTTP/1.1 来讲的,HTTP/2 优化了许多问题(当然也存在新的问题),所以你看到了本文的主题 gRPC

二、Protobuf

介绍

Protocol Buffers 是一种与语言、平台无关,可扩充套件的序列化结构化资料的方法,常用于通讯协议,资料储存等等。相较于 JSON、XML,它更小、更快、更简单,因此也更受开发人员的青眯

语法

1、第一行(非空的非注释行)宣告使用 proto3 语法。如果不宣告,将预设使用 proto2 语法。同时我建议用 v2 还是 v3,都应当宣告其使用的版本

2、定义 SearchService RPC 服务,其包含 RPC 方法 Search,入参为 SearchRequest 讯息,出参为 SearchResponse讯息

3、定义 SearchRequest、SearchResponse 讯息,前者定义了三个字段,每一个字段包含三个属性:型别、字段名称、字段编号

4、Protobuf 编译器会根据选择的语言不同,生成相应语言的 Service Interface Code 和 Stubs

最后,这里只是简单的语法介绍,详细的请右拐 Language Guide (proto3)

资料型别

v2 和 v3 主要区别

删除原始值字段的字段存在逻辑删除 required 字段删除 optional 字段,预设就是删除 default 字段删除扩充套件特性,新增 Any 型别来替代它删除 unknown 字段的支援新增 JSON Mapping新增 Map 型别的支援修复 enum 的 unknown 型别repeated 预设使用 packed 编码引入了新的语言实现(C#,JavaScript,Ruby,Objective-C)以上是日常涉及的常见功能,如果还想详细了解可阅读 Protobuf Version 3.0.0

相较 Protobuf,为什么不使用XML?

更简单资料描述档案只需原来的1/10至1/3解析速度是原来的20倍至100倍减少了二义性生成了更易使用的资料访问类

三、gRPC

介绍

gRPC 是一个高效能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计

多语言

C++C#DartGoJavaNode.jsObjective-CPHPPythonRuby

特点

1、HTTP/2

2、Protobuf

3、客户端、服务端基于同一份 IDL

4、移动网络的良好支援

5、支援多语言

概览

讲解

1、客户端(gRPC Sub)呼叫 A 方法,发起 RPC 呼叫

2、对请求资讯使用 Protobuf 进行物件序列化压缩(IDL)

3、服务端(gRPC Server)接收到请求后,解码请求体,进行业务逻辑处理并返回

4、对响应结果使用 Protobuf 进行物件序列化压缩(IDL)

5、客户端接受到服务端响应,解码请求体。回拨被呼叫的 A 方法,唤醒正在等待响应(阻塞)的客户端呼叫并返回响应结果

示例

在这一小节,将简单的给大家展示 gRPC 的客户端和服务端的示例程式码,希望大家先有一个基础的印象,将会在下一章节详细介绍

构建和启动服务端

1、监听指定 TCP 埠,用于接受客户端请求

2、建立 gRPC Server 的例项物件

3、gRPC Server 内部服务和路由的注册

4、Serve() 呼叫服务器以执行阻塞等待,直到程序被终止或被 Stop() 呼叫

建立客户端

1、建立 gRPC Channel 与 gRPC Server 进行通讯(需服务器地址和埠作为引数)

2、设定 DialOptions 凭证(例如,TLS,GCE凭据,JWT凭证)

3、建立 Search Client Stub

4、呼叫对应的服务方法

思考题

1、什么场景下不适合使用 Protobuf,而适合使用 JSON、XML?

2、Protobuf 一节中提到的 packed 编码,是什么?

总结

在开篇内容中,我利用了尽量简短的描述给你介绍了接下来所必须、必要的知识点 希望你能够有所收获,建议能到我给的参考资料处进行深入学习,是最好的了

参考资料

Protocol Buffers https://developers.google.com/protocol-buffers/docs/proto3gRPC https://grpc.io/docs/本系列作者:煎鱼,原创授权释出
2020-01-30 06:56:00

相关文章