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/22、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 编码,是什么?





























