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

相关文章
|
11天前
|
JSON 数据可视化 API
Python 中调用 DeepSeek-R1 API的方法介绍,图文教程
本教程详细介绍了如何使用 Python 调用 DeepSeek 的 R1 大模型 API,适合编程新手。首先登录 DeepSeek 控制台获取 API Key,安装 Python 和 requests 库后,编写基础调用代码并运行。文末包含常见问题解答和更简单的可视化调用方法,建议收藏备用。 原文链接:[如何使用 Python 调用 DeepSeek-R1 API?](https://apifox.com/apiskills/how-to-call-the-deepseek-r1-api-using-python/)
|
5月前
|
自然语言处理 算法 Java
地址描述转换为坐标点不使用API,有什么转换的方法?
地址描述转换为坐标点不使用API,有什么转换的方法?
412 64
|
4月前
|
测试技术 API 项目管理
API测试方法
【10月更文挑战第18天】API测试方法
94 1
|
2月前
|
JSON 安全 API
Python调用API接口的方法
Python调用API接口的方法
409 5
|
3月前
|
缓存 API 网络架构
掌握现代API开发:GraphQL vs REST
【10月更文挑战第24天】本文深入探讨了现代API开发中两种主流技术——GraphQL和REST的设计理念、技术特点及实际开发中的对比分析。GraphQL通过声明式数据请求和强类型系统提供更高的灵活性和性能,而REST则以其无状态特性和成熟的生态系统见长。文章还讨论了两者在客户端-服务器交互、安全性和工具支持方面的优劣,帮助开发者根据项目需求做出明智选择。
|
4月前
|
Java 大数据 API
别死脑筋,赶紧学起来!Java之Steam() API 常用方法使用,让开发简单起来!
分享Java Stream API的常用方法,让开发更简单。涵盖filter、map、sorted等操作,提高代码效率与可读性。关注公众号,了解更多技术内容。
175 5
|
4月前
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
136 11
|
4月前
|
中间件 Go API
使用Go语言构建高性能RESTful API
在现代软件开发中,RESTful API因其简洁和高效而成为构建网络服务的首选。Go语言以其并发处理能力和高性能著称,是开发RESTful API的理想选择。本文将介绍如何使用Go语言构建RESTful API,包括基础的路由设置、中间件的使用、数据验证、错误处理以及性能优化。通过实际代码示例,我们将展示Go语言在API开发中的强大功能和灵活性。
|
4月前
|
JavaScript 前端开发 Java
多种语言请求API接口方法
每种语言和库的选择取决于具体需求、项目环境以及个人偏好。了解这些基本方法,开发者就可以根据项目需求选择合适的语言和库来高效地与API交互。
72 1
|
4月前
|
安全 测试技术 API
一图看懂API测试9种方法
一图看懂API测试九种方法:冒烟测试验证基本功能,功能测试确保符合规格,集成测试检查组件协同工作,回归测试防止新变更引入问题,负载测试评估性能稳定性,压力测试挑战极限负载,安全测试发现并修复漏洞,用户界面测试确保UI与API协调,模糊测试提升异常数据处理鲁棒性。

热门文章

最新文章