什么是gRPC
gRPC是google开发的一个高性能、开源和通用的RPC框架,面向服务端和移动端,基于HTTP/2协议设计。
gRPC目前提供C、Java和Go语言版本,分别是:grpc、grpc-java和grpc-go。其中C版本支持C,C++,Node.js,Python,Ruby,Objective-C,PHP和C#。
- git地址为 https://github.com/grpc
- 官方英文文档 https://grpc.io/docs
- 官方中文文档 http://doc.oschina.net/grpc
在gRPC里,客户端应用可以像调用本地对象一样直接调用另外一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多RPC系统类似,gRPC也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个gRPC服务器来处理客户端调用。
gRPC客户端和服务端可以在多种环境中运行和交互——从google内部的服务器到你的笔记本,并且可以用任何gRPC支持的语言来编写。所以,你很容易地用Java创建一个gRPC服务端,用Go、Python、Ruby来创建客户端。此外,Google最新API将有gRPC版本的接口,使你很容易地将Google的功能集成到你的应用里。
gRPC特点
- 语言中立,支持多种语言;
- 基于IDL文件定义服务,通过proto3工具生成指定语言的数据结构、服务端接口以及客户端Stub;
- 通信协议基于标准的HTTP/2设计,支持双向流、消息头压缩、但TCP的多路复用、服务端推送等特性,这些特性使得gRPC在移动端设备上更加省电和节省网络流量;
- 编码格式序列化支持PB和JSON,PB是一种语言无关的高性能序列化框架,基于HTTP/2+PB,保障了RPC调用的高性能
gRPC安装
gRPC依赖于ProtoBuf,在Linux系统下,通过以下步骤就可以安装好gRPC和ProtoBuf。
1 | 1. sudo yum install build-essential autoconf libtool libgflags-dev libgtest-dev clang libc++-dev pkg-config unzip |
gRPC服务定义
简单RPC
客户端使用存根发送请求到服务器并等待响应返回,就像平常的函数调用一样
1 | // Obtains the feature at a given position. |
服务器端流式RPC
客户端发送请求到服务器,拿到一个流去读返回的消息序列。客户端读取返回的流,直到里面没有任何消息。从下述例子中可以看出,通过在 响应 类型钱插入stream关键字,可以指定一个服务端的流方法。
1 | // Obtains the Features available within the given Rectangle. Results are |
客户端流式RPC
- 客户端写入一个消息序列并将其发送到服务器,同样也是使用流。一旦客户端写入消息,它等待服务器完成读取它的响应。通过在 请求 类型前指定stream关键字来指定一个客户端的流方法。
1 | // Accepts a stream of Points on a route being traversed, returning a |
双向流式RPC
双方使用读写流去发送一个消息序列,两个流独立操作,因此客户端和服务器可以以任何喜欢的顺序读写:比如,服务器可以在写入响应前等待接收所有的客户端消息,或者可以交替的读写和写入消息,或者其他读写的组合。每个流中的消息顺序被预留。你可以通过在请求和响应前加stream关键字去制定方法的类型。
1 | // Accepts a stream of Points on a route being traversed, returning a |
代码实现
proto文件(demo.proto)
1 | syntax = "proto3"; |
编译
protoc --go_out=plugin=grpc:. *.proto
- 与普通proto文件编译有所区别,需要对应语言的grpc插件的支持;
- 对go来说,要考虑路径是否配置正确
PATH=$PATH:$GOPATH/bin
服务端
1 | package main |
客户端
1 | package main |
执行结果
1 | ➜ grpc go run server.go |
1 | ➜ grpc go run client.go |