Golang 语言 gRPC 到底是什么?

开发 后端
在正式介绍 gRPC 之前,我们先简单介绍一下什么是 RPC,它是 Remote Procedure Call 的缩写,中文译为远程过程调用(也可译为远程方法调用或远程调用),它是计算机通信协议,该协议可以实现调用远程服务就像调用本地服务一样简单,无需关心跨网络,跨平台,跨语言等问题。

[[421001]]

1.介绍

我们上一篇文章「Golang 语言 gRPC 使用的接口设计语言 protobuf」介绍了 Golang 语言 gRPC 使用的接口设计语言 Protobuf,本文我们开始介绍主角 - 谷歌开源的 RPC 框架 gRPC。

在正式介绍 gRPC 之前,我们先简单介绍一下什么是 RPC,它是 Remote Procedure Call 的缩写,中文译为远程过程调用(也可译为远程方法调用或远程调用),它是计算机通信协议,该协议可以实现调用远程服务就像调用本地服务一样简单,无需关心跨网络,跨平台,跨语言等问题。

gRPC 是通信协议基于 HTTP/2,支持多语言的 RPC 框架,使用 Protobuf 作为它的接口设计语言(IDL),可以通过 protoc 工具生成 Golang 语言的结构体,服务端接口和客户端 Stub。

gRPC 消息序列化方式通常使用 Protobuf,它是二进制格式,体积小,网络传输快,占用带宽流量少,调用性能更高,但是可读性差。不过,gRPC 也支持 JSON 序列化方式。

「图片来源:https://grpc.io/img/landing-2.svg」

2.怎么使用 gRPC 定义服务端

gRPC 默认使用 Protobuf 作为接口设计语言,我们可以在 .proto 文件中使用 service 关键字定义服务,使用 rpc 和 returns 关键字定义指定请求参数和返回结果的方法。

示例代码:

  1. service User { 
  2.   rpc Login (LoginRequest) returns (LoginResponse); 
  3.  
  4. message LoginRequest { 
  5.   string email = 1; 
  6.   string password = 2; 
  7.  
  8. message LoginResponse { 
  9.   int64 id = 1; 
  10.   string name = 2; 

阅读上面这段代码,我们使用 Protobuf 接口设计语言定义了一个一元 RPC 服务,即客户端向服务端发送一个请求,服务端向客户端返回一个响应。

此外,gRPC 还支持另外三种定义服务的方式,即服务器流式 RPC、客户端流式 RPC 和双向流式 RPC。限于篇幅,我准备在后续文章中详细介绍这四种定义服务的方式,本文先不展开介绍。

gRPC 提供了 Protobuf 编译器插件 protoc-gen-grpc,用于编译 .proto 文件,生成服务端和客户端代码,我们只需在服务端编写实现 Api 的代码,然后在客户端调用 Api。

3.怎么使用 gRPC 的客户端

我们通过 protoc 编译 .proto 文件,自动生成服务端和客户端代码后,我们如果想要使用 gRPC 的客户端,还需要手动编写客户端代码,也就是在服务端实现 Api 的业务逻辑代码,然后在客户端调用 Api,具体如下:

在服务端,手动编写生成的服务端方法的业务逻辑代码,然后运行 gRPC 服务,接收并处理客户端请求,gRPC 服务自动解码请求参数,然后执行服务的方法,并将返回结果自动进行编码。

在客户端,Stub (也称为存根或客户端)实现和服务相同的方法,然后客户端可以本地调用这些方法,将请求参数封装在 Protobuf 的消息类型中,gRPC 将请求发送给服务器,并返回服务器的 Protobuf 序列化方式的响应消息。

4总结

本文我们介绍了 gRPC 到底是什么,怎么定义 gRPC 的服务端,以及怎么使用 gRPC 的客户端。更多关于 gRPC 的介绍,我建议感兴趣的读者朋友们阅读官网文档了解更多。

本文转载自微信公众号「Golang语言开发栈」,可以通过以下二维码关注。转载本文请联系Golang语言开发栈公众号。

 

责任编辑:武晓燕 来源: Golang语言开发栈
相关推荐

2023-03-29 08:24:46

Rune类型开源项目

2020-10-14 06:22:14

UWB技术感知

2020-09-22 08:22:28

快充

2020-09-27 06:53:57

MavenCDNwrapper

2010-11-01 01:25:36

Windows NT

2011-04-27 09:30:48

企业架构

2021-01-21 21:24:34

DevOps开发工具

2022-10-08 00:00:00

Spring数据库项目

2021-07-07 05:07:15

JDKIterator迭代器

2023-07-12 15:32:49

人工智能AI

2020-03-05 10:28:19

MySQLMRR磁盘读

2024-02-04 00:01:00

云原生技术容器

2021-02-05 10:03:31

区块链技术智能

2019-10-30 10:13:15

区块链技术支付宝

2021-09-03 09:12:09

Linux中断软件

2010-04-22 14:14:29

Live-USB

2013-06-09 09:47:31

.NetPDBPDB文件

2020-08-04 14:20:20

数据湖Hadoop数据仓库

2010-02-05 14:51:48

C++托管

2023-10-11 08:29:54

volatileJava原子性
点赞
收藏

51CTO技术栈公众号