Go中实现API的两种方法:REST or gRPC

  1. 云栖社区>
  2. 博客>
  3. 正文

Go中实现API的两种方法:REST or gRPC

云栖号资讯小哥 2020-04-15 15:20:41 浏览428
展开阅读全文

云栖号资讯:【点击查看更多行业资讯
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!


本文,我们来研究一下在Go中实现HTTP API的两种方法(REST和gRPC)及其几种工具。

REST

有些人不太理解REST,所以他们还在继续使用RPC风格来开发API。这样做的原因是wiki的信息量还不足以支撑用户使用REST的全部功能。因此,今天这个话题就很受欢迎,而且以后也会有越来越多的关于REST的文章出现在博客和各种座谈会上。

Zalando的指南帮助我们理解了什么是REST。该文档与OpenAPI的倡议和设计优先(Design First)方法一起出现。据此,首先我们需要描述API,然后再开始实现业务逻辑。相关文档在这里。

Swagger(swagger.io)帮助构建REST API。如果在node.js上编写会相当简单。然而,在Go的情况下要复杂得多。你必须设计快速的解决方案,比如测试,首先要检查endpoint是否有相应的文档或swagger.yml是否有Go的数据结构生成器。

如何在Go中开发一个完整的和受支持的REST API而不需要swagger支持?

其中一些选项如下:

1.写swagger.yml

2.描述一个模型

3.从API一侧和数据库工作层来实现CRUD

4.用API测试来覆盖模型

在此基础上,去统一和制作一个生成器

结果就是,我们得到如下算法:描述模型,编写代码,实现业务逻辑。

作为一个额外的方法,我们还可以从swagger.yml生成模型。

所有带REST API的应用程序都是在常规的3层架构上构建的。

我曾经使用过echo框架创建应用程序。它具有良好的设计和速度。我们使用sqlx作为数据库层。使用这个集合和自编写的代码生成器,我们可以非常快速地构建一个API。然而,我仍然建议使用Django或Flask中的Python来构建API。这个解决方案只有在你不期望高负载时才有效。

gRPC

gRPC作为一款来自Google的工具,不仅仅在Go社区而且在其以外都被积极地推广。默认情况下,gRPC允许你通过HTTP/2创建良好的内部API。

通常来说,gRPC的功能是相当好的,但是它最重要的功能在于默认的代码生成和设计优先理念的推广。

当使用swagger时,很有可能不做支持文档,因为这通常是一个额外的困扰。然而,当你使用gRPC时就不会有这种情况,这个改进的工具简化了开发人员的工作,因为它不可能在没有原型文件的情况下编写代码,更不可能不与开发团队共享。

使用gRPC的一个理想场景是,在微服务间进行的连接,以及移动应用与服务器的通信。

gRPC主要是一个RPC框架,它引用UpdateBalance、GetClient方法。

REST是关于诸如GET/users、POST/users等资源的。

在gRPC中,可以创建许多方法,直到达到Go接口的限制(512个方法/1个接口)。

由于这篇文章主要是关于gRPC的,让我们从grpc-go文档中选择一个简单的“hello, world”示例,并使用插件来改进它。我们将在gRPC服务中添加数据验证和REST API并生成swagger.json及其文档:

1

项目结构如下:

1.Pb——用来存储原型文件和已生成代码的包

2.main.go——用来配置和运行我们的应用程序的一个service

3.server——用来实现应用程序逻辑的包

4.Makefile——使实例自动化的文件

为了生成代码,你应该运行:

2

起初,Makefile中描述的一些命令就足以使例程自动化:

3

我们需要先Makefile从而可以输入make proto,这样就可以从原型文件生成代码。此外,这一部分还会被扩展,命令将变得更长,代码数量也随之增加。

如果我们生成代码实现服务器的主要接口,生成一个API将得到以下代码:

4

5

从main.go按如下方式运行:

6

gRPC-gateway

最近,在一个项目中,我们决定使用gRPC进行服务之间的通信。同时,我们还需要为外部客户继续使用良好的REST。

我们都知道这个工具,我们甚至用这个插件做了一个项目。在这个项目里,会有同时支持几项做同样事情的服务,然而这个前景并不被看好。但在这种情况下,gRPC-gateway却依然非常有用,因为我们将在一个原型文件中同时包含gRPC和REST描述。

根据README的说明,我们先安装一下,然后再把我们的原型文件转换成以下形式:

7

此外,我们应该改变命令去生成代码,继而从原型文件到以下形式:

8

现在,proto命令将为逻辑的实施生成rest网关、swagger和接口。

那么,现在有一个小问题——我们的服务器将监听两个TCP套接字。一个是确保gRPC机制的运行,第二个是确保REST的。此外,网关将作为中介发布,将JSON HTTP REST表述转换为原型文件上的gRPC。

让我们修改一下代码来运行服务器,代码如下:

9

10

11

现在运行我们的服务器和REST请求:

12

至此,我们在gRPC之上获得REST API。但是在本例中,并没有足够的验证设置。关于验证,我们会使用https://github.com/lyft/protoc-gen-validate。按照文档中的示例,我们将把原型文件转换成如下这种形式:

13

让我们添加另一个命令来生成代码:

14

在代码重新生成之后,我们可以看到现在验证可以生效了。

15

结论

gRPC生态系统对Go中的Web服务非常友好。也正是基于这一点,我们可以通过生成大部分重复的代码来加快开发的过程。在这里可以看到项目的完整代码。

如果你写了REST API,但不知道如何描述你的API,那么就选择gRPC吧,在Go中还可以节省更多开发Web服务的时间!

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/zhibo

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-04-14
本文作者:伊海峰
本文来自:“dockone”,了解相关信息可以关注“dockone”

网友评论

登录后评论
0/500
评论
云栖号资讯小哥
+ 关注