Go使用gRPC与Protocol Buffers构建高性能API 服务

谢权 · · 2527 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

由于近年来软件的规模日益庞大,API成为了应用程序的的骨干。API作为后台服务为web与移动端提供了强有力的支撑,也用于各平台直接的数据交互,当我们想构建一个基于API的web服务时,我们通常会选择RESTful Api 和 JSON 作为之间的数据交换的方式。RESTful Api 和 JSON确实可以很方便的为移动客户端提供服务,由于Docker为代表的容器技术的火热,微服务架构也随之被很多公司推崇。其中微服务能否实现大规模和高性能非常关键。然而微服务肯定需要一个高性能通信机制与各种服务之间通信。那么最大的问题就是Json是否能够满足基于API提供高性能和扩展性的现代应用程序?然而Json是应用程序直接交换数据最快的数据格式吗?RESTful架构是否能够构建复杂的API?我们能够轻松的通过RESTful架构实现双向的API吗?
现在HTTP/2协议比之前的版本提供了更多的功能,当我们需要满足未来需求构建下一代的API服务时,我们可以考虑使用gRPC 与 protocol buffers。

什么是 Protocol Buffers

Protocol Buffers,是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。
它不依赖于语言和平台并且可扩展性极强。现阶段官方支持C++、JAVA、Python等三种编程语言,但可以找到大量的几乎涵盖所有语言的第三方拓展包。通过它,你可以定义你的数据的结构,并生成基于各种语言的代码。这些你定义的数据流可以轻松地在传递并不破坏你已有的程序。并且你也可以更新这些数据而现有的程序也不会受到任何的影响。Protocol Buffers经常被简称为protobuf。

根据以下操作生成protocol buffers文件:

1.从这里https://github.com/google/protobuf下载并安装protoc编译器。将protoc二进制文件的位置添加到PATH环境变量中,以便可以从任何位置调用protoc编译器。

2.为go言安装安装protoc插件,运行go get命令为Go安装protoc插件

什么是gRPC

gRPC是一个高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。gRPC提供了一种简单的方法来精确地定义服务和为iOS、Android和后台支持服务自动生成可靠性很强的客户端功能库。客户端充分利用高级流和链接功能,从而有助于节省带宽、降低的TCP链接次数、节省CPU使用、和电池寿命。
我们可以从这里http://www.grpc.io/blog/principles gRPC的动机和设计原则。

https://o6rr5e4by.qnssl.com/wp-content/uploads/2016/10/1-X7I-IyhPdnNCsYJlm1U0Hw.jpeg

使用gRPC和Protocol Buffers的Go语言示例:

首先我们看下Go语言使用gRPC和Protocol Buffers构建示例API项目的文件结构:
https://o6rr5e4by.qnssl.com/wp-content/uploads/2016/10/1-abvq5iDmLGWj4BdxRrcsyw.jpeg
为了能够再Go语言中使用gRPC,我们需要使用go get 命令安装gRPC:

定义Protocol Buffer的消息类型和服务:

关于Protocol Buffer使用我们可以查看https://developers.google.com/protocol-buffers/docs/proto#generating这里也推荐一篇译文http://colobu.com/2015/01/07/Protobuf-language-guide/
我们首先定义一个服务叫做 “ Customer”,他有2个RPC的方法。

 

这里有多种gRPC定义RPC方法的方式:

1.简单的的RPC方式,与典型的Request/Response模型在客户端向使用服务端的RPC服务器发送一个请求并等待响应。
2.服务器端数据流RPC方式, 客户端发送请求到服务器,拿到一个流去读取返回的消息序列。 客户端读取返回的流,直到里面没有任何消息。从例子中可以看出,通过在 响应 类型前插 stream关键字,可以指定一个服务器端的流方法。
3.客户端数据流式RPC方式,客户端写入一个消息序列并将其发送到服务器,同样也是使用流。一旦客户端完成写入消息,它等待服务器完成读取返回它的响应。通过在 请求 类型前指定 stream 关键字来指定一个客户端的流方法。
4.双向数据流式RPC方式,是双方使用读写流去发送一个消息序列。两个流独立操作,因此客户端和服务器可以以任意喜欢的顺序读写:比如, 服务器可以在写入响应前等待接收所有的客户端消息,或者可以交替的读取和写入消息,或者其他读写的组合。 每个流中的消息顺序被预留。你可以通过在请求和响应前加 stream 关键字去制定方法的类型

我们上面的Customer 提供了2种RPC方法,一个RPC方法叫做GetCustomers,他是简单的RPC方式,GetCustomers方法是服务器端数据流RPC方式。CreateCustomer创建了一个custom,作为作为Request/Response范型执行,GetCustomers提供了一个custom的列表,服务器已数据流的方式提供数据。

为客户端和服务器生成Go代码:

定义proto文件后,下一步是为gRPC客户端和服务器接口生成源代码,以便编写服务器实现,并根据proto文件中定义的消息类型和服务接口进行客户端调用。 protocol buffer编译器协议与gRPC Go插件一起使用以生成客户端和服务器代码。 从应用程序的根目录,使用Go的gRPC插件运行protoc编译器

这将在客户目录中生成一个名为customer.pb.go的Go源文件。 生成的源文件提供了创建服务器和通过RPC进行客户端调用的所有基本代码。

 

创建gRPC Server :

创建gRPC客户端:

Source Code:

https://github.com/shijuvar/go-recipes/tree/master/grpc

参考文献:

https://medium.com/@shijuvar/building-high-performance-apis-in-go-using-grpc-and-protocol-buffers-2eda5b80771b#.qmqhzdhom

Go使用gRPC与Protocol Buffers构建高性能API 服务

有疑问加站长微信联系(非本文作者)

本文来自:谢权SELF

感谢作者:谢权

查看原文:Go使用gRPC与Protocol Buffers构建高性能API 服务

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2527 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传