gRPC+ProtoBuf 使用入门

  • 2018-04-12
  • 1679
  • 0

RPC调用流程

1.client 以本地的方式进行的调用服务
2.client stub接收到调用后负责将方法 参数等组装成能够进行网络传输的消息体
3.cleint stub找到服务端的地址 并将消息发送给server stub
4.server stub收到消息后进行解码
5.server stub根据解码结果调用本地的服务
6.本地服务执行结果并将结果返回后给server stub
7.server stub将返回结果打包成消息并发送至消费方
8.client stub接受到消息
9. client得到返回结果

gRPC 介绍

gRPC是由Google主导开发的RPC框架,使用HTTP/2协议并用ProtoBuf作为序列化工具。在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。当然在当下的环境下,这种解决方案更热门的方式是RESTFull API接口,但是gRPC提供了全双工流,这是RESTFull API接口所没有的。

ProtoBuf 介绍

在许多高级语言中,我们都是使用类的方式对数据进行封装,而利用网络传递数据只能以二进制的方式进行传输,因此我们需要将数据转化为二进制数据从而在网络上进行传播过程称为序列化, 再将接收到的数据从二进制转化为对应的数据类型,称为反序列化.
gRPC 默认使用 protocol buffers,这是 Google 开源的一套成熟的结构数据序列化机制(当然也可以使用其他数据格式如 JSON)。
有关protobuf的学习链接:

使用gRPC

一、准备工作

1、安装protobuf
2. 安装gRPC-go
安装golang protobuf直接使用golang的get即可
  1. go get -u github.com/golang/protobuf/proto // golang protobuf 库
  2. go get -u github.com/golang/protobuf/protoc-gen-go //protoc –go_out 工具
3、获取grpc
go get google.golang.org/grpc

二、程序示例:

1、定义服务:
要定义一个服务,你必须在你的 .proto 文件中指定 service:
文件 rpc.proto如下:

gRPC 允许你定义4种类型的 service 方法,这些都在 Greeter 服务中使用:
rpc GetFeature(Point) returns (Feature) {}
  • 一个 简单 RPC , 客户端使用存根发送请求到服务器并等待响应返回,就像平常的函数调用一样。
rpc ListFeatures(Rectangle) returns (stream Feature) {}
  • 一个 服务器端流式 RPC , 客户端发送请求到服务器,拿到一个流去读取返回的消息序列。 客户端读取返回的流,直到里面没有任何消息。从例子中可以看出,通过在 响应 类型前插入 stream 关键字,可以指定一个服务器端的流方法。
rpc RecordRoute(stream Point) returns (RouteSummary) {}
  • 一个 客户端流式 RPC , 客户端写入一个消息序列并将其发送到服务器,同样也是使用流。一旦客户端完成写入消息,它等待服务器完成读取返回它的响应。通过在 请求 类型前指定 stream 关键字来指定一个客户端的流方法。
rpc RouteChat(stream RouteNote) returns (stream RouteNote) {}
  • 一个 双向流式 RPC 是双方使用读写流去发送一个消息序列。两个流独立操作,因此客户端和服务器可以以任意喜欢的顺序读写:比如, 服务器可以在写入响应前等待接收所有的客户端消息,或者可以交替的读取和写入消息,或者其他读写的组合。 每个流中的消息顺序被预留。你可以通过在请求和响应前加 stream 关键字去制定方法的类型。
使用protoc命令生成相关文件:
protoc –go_out=plugins=grpc:. ./rpc.proto
2、服务端实现

3、客户端实现:


 下一篇:

评论

还没有任何评论,你来说两句吧

Copyright © 2014-2016 lxlxw All Right Reserved