什么是 gRPC
gRPC 由谷歌开发的,是一种语言中立、平台中立、开源的远程调用过程。
什么是远程调用过程?简单理解就是公开本地应用给其他应用程序调用的方法。gRPC 是一项进程间通信技术,可以用来连接、调用、操作和调式分布式异构应用程序。也像 RPC 应用程序的特点一样:像调用本地函数一样。
特点
- gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。
- 在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。
- gRPC 默认使用 protocol buffers,这是 Google 开源的一套成熟的结构数据序列化机制,它的作用与 XML、json 类似,但它是二进制格式,性能好、效率高(缺点:可读性差)。
gRPC 和 REST 区别
它类似于 REST API 通信,通过它,您可以有效地将应用程序中的功能公开给使用 HTTP 连接作为通信媒介的其他应用程序。
虽然 REST 和 gRPC 有点相似,但您应该注意它们的工作方式存在区别:
- gRPC 使用 HTTP/2 协议,而 REST 使用 HTTP 1.1
- gRPC 使用协议缓冲区数据格式,而不是通常在 REST API 中使用的标准 JSON 数据格式
- 使用 gRPC,您可以根据需要利用 HTTP/2 功能,例如服务器端流式传输、客户端流式传输甚至双向流式传输。
Go 建立一个 gRPC 服务器
我们从在 Go 中定义一个非常简单的 gRPC 服务器开始。一旦我们有一个简单的服务器启动并运行,我们就可以着手创建一个能够与之交互的 gRPC 客户端。
gRPC 可以实现微服务,将大的项目拆分为多个小且独立的业务模块,也就是服务,各服务间使用高效的 protobuf 协议进行 RPC 调用,gRPC 默认使用 protocol buffers ,这是 google 开源的一套成熟的结构数据序列化机制(当然也可以使用其他数据格式如 JSON )。可以用 proto files 创建 gRPC 服务,用 message 类型来定义方法参数和返回类型
- 安装 golang 的 proto 工具包:
go get -u github.com/golang/protobuf/proto
- 在开始建立 gRPC 之前,确保已安装 Protocol Buffers v3:
go get -u github.com/golang/protobuf/protoc-gen-go
- 在 Go 中安装 gRPC:
go get google.golang.org/grpc
然后写一个服务器,通过监听 TCP 连接的端口。如下的 main 函数:
package main import ( "log" "net" ) func main() { lis, err := net.Listen("tcp", ":8000") if err != nil { log.Fatalf("Fail to listen: %v", err) } }
接下来,我们要从 golang.org 导入官方的 gRPC 包,以便我们可以创建一个新的 gRPC 服务器,然后注册我们想要公开的端点,然后通过我们上面定义的现有 TCP 连接提供服务:
package main import ( "log" "net" "google.golang.org/grpc" ) func main() { lis, err := net.Listen("tcp", ":8000") if err != nil { log.Fatalf("Fail to listen: %v", err) } grpcServer := grpc.NewServer() if err := grpcServer.Serve(lis); err != nil { log.Fatalf("Fail to serve: %v", err) } }
这是用 go 编写的最基础 gRPC 服务器,现在的功能还很有限。