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

简介:

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


本文,我们来研究一下在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”

相关文章
|
6天前
|
JSON 安全 API
Microsoft邮箱API发送邮件的方法和步骤
Aoksend详解如何使用Microsoft邮箱API发送邮件:1. 在Azure创建应用并获取访问权限;2. 设置API请求头,含Authorization和Content-Type;3. 构建JSON格式的邮件内容;4. 使用POST方法发送至API端点;5. 检查响应处理发送结果。遵循最佳实践,安全集成邮件功能。
|
9天前
|
搜索推荐 JavaScript 前端开发
Gmail邮箱API发送邮件的方法有什么
使用Gmail API发送邮件,需先获取API访问权限,包括在Google Cloud Platform上创建项目,启用Gmail API,生成API密钥或OAuth 2.0凭据。然后,用Python等编程语言设置API请求,指定邮件详情。发送简单邮件涉及创建Base64编码的消息体,而带附件的邮件需编码为multipart格式。可添加邮件头信息,并处理发送结果以确保成功。Gmail API使应用能集成自动化、个性化的邮件发送功能,提升效率和体验。
|
19天前
|
前端开发 JavaScript API
基于React的简易REST API客户端设计与实现
基于React的简易REST API客户端设计与实现
17 3
|
25天前
|
人工智能 Java API
Google Gemini API 接口调用方法
Google 最近发布的 Gemini 1.0 AI 模型通过其升级版,Gemini,标志着公司迄今为止最为强大和多功能的人工智能技术的突破。
|
3月前
|
存储 设计模式 Cloud Native
云原生系列Go语言篇-类型、方法和接口 Part 1
通过前面章节的学习,我们知道Go是一种静态类型语言,包含有内置类型和用户定义类型。和大部分现代编程语言一样,Go允许我们对类型关联方法。它也具备类型抽象,可以编写没有显式实现的方法。
50 0
|
7天前
|
监控 安全 API
Office365邮箱API发送邮件有什么值得推荐的方法
使用Office365邮箱API发送邮件时,建议采用OAuth认证确保安全;利用RESTful API简化流程;借助官方客户端库加速集成;遵循最佳实践保障安全可靠;批量发送时使用异步方式提升效率;监控调试以解决问题;注意避免触发垃圾邮件过滤。AokSend提供高效发信服务,支持触发式接口和SMTP/API,独立IP确保高触达。
|
25天前
|
设计模式 缓存 安全
一篇文章带你吃透Go语言的Atomic和Channel--实战方法
一篇文章带你吃透Go语言的Atomic和Channel--实战方法
27 0
|
25天前
|
Java API Maven
email api java编辑方法?一文教你学会配置步骤
在Java开发中,Email API是简化邮件功能的关键工具。本文指导如何配置和使用Email API Java:首先,在项目中添加javax.mail-api和javax.mail依赖;接着,配置SMTP服务器和端口;然后,创建邮件,设定收件人、发件人、主题和正文;最后,使用Transport.send()发送邮件。借助Email API Java,可为应用添加高效邮件功能。
|
29天前
|
JavaScript 前端开发 API
JavaScript循环遍历常用的7种方法以及常用的数组 API
JavaScript循环遍历常用的7种方法以及常用的数组 API
34 0
|
1月前
|
缓存 中间件 API