相信大家都听过RPC、HTTP、Socket等协议,他们均可用于业务中来进行数据通信,又根据各自协议的特点,应用场景也比较多样、复杂,那大家是否听过或者了解gRPC呢?用来做什么呢?我们就来了解一下gRPC以及其用途。
介绍
用官方网站1一句话介绍介绍gRPC
A high-performance, open source universal RPC framework.
即:高性能、开源的通用型RPC框架
说起RPC,人们常会和HTTP做对比,两者在底层数据传输时本质基本一致,即全部基于TCP实现安全可靠的连接进行数据通信,但在应用层又有些不同。
RPC,即Remote Procedure Call(远程过程调用),主要在TCP协议之上进行工作;
HTTP,即HyperText Transfer Protocol(超文本传输协议),主要在HTTP协议之上进行工作。
从协议上来说,RPC更加高效一些。
gRPC结构图:
gRPC基本基于定义服务的思想,指定远程调用的方法,包含方法的入参以及返回数据类型。服务端继承、实现接口并开启监听服务等待客户端请求;客户端保存一份副本,提供与服务端相同的方法。客户端、服务端的语言没有特别限制,只要支持gRPC协议基本可实现客户端、服务端的连接、数据通信。
目前gRPC支持的语言大致有:Golang、Python、Java、PHP、C&C++等。
gRPC的创建基于Protobuf,进行数据定义、服务接口定义等等,所以在深入了解gRPC前,最好对于protobuf有一定的了解。protobuf有proto2、proto3版本,现在大都基于proto3进行开发,所以大家了解proto32
基于gRPC实现restful接口,主要使用gRPC的一个插件,使得服务端通过一套代码即可对外提供HTTP服务、RPC服务,其架构如下图:
gRPC使用
gRPC的使用通常有如下几步:
- 编写Protobuf,定义RPC的接口以及入参、出参,数据类型等
- 基于Protobuf编译成项目语言的文件,如go、java等
- 实现服务端功能模块,主要实现gRPC的接口
- 实现客户端功能
gRPC示例
Demo文件结构
.
├── example
│ ├── service.pb.go // 编译后的rpc文件
│ ├── service.pb.gw.go // 编译后的gateway文件
│ └── service.proto // protobuf文件
├── gw.go // gRPC的gateway服务端
├── gw_client.go // gRPC客户端
└── gw_server.go // gRPC服务端
1. 通过protobuf定义数据结构、类型
syntax = "proto3";
package example;
import "google/api/annotations.proto";
message StringMessage {
string value = 1;
}
// 定义EchoServer
service EchoService {
// 定义Echo接口,以及参数、返回数据
rpc Echo(StringMessage) returns (StringMessage) {
option (google.api.http) = {
post: "/v1/example/echo" // 定义http服务的请求方法(post)、路由
body: "*"
};
}
}
2. 编译protobuf文件为指定语言
demo主要为go语言,故而将protobuf编译为go语言版本,使用的命令为以下两条:
-
编译为RPC数据结构、类型、服务
protoc -I/usr/local/include -I. -I$GOPATH/src -I$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway