前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >学习 OpenAPI 的一点记录

学习 OpenAPI 的一点记录

作者头像
四火
发布于 2023-11-10 05:59:45
发布于 2023-11-10 05:59:45
47500
代码可运行
举报
文章被收录于专栏:四火的唠叨四火的唠叨
运行总次数:0
代码可运行

我记得在毕业以前,就大致明白这样一件事情,系统之间、模块之间的交互,要确定协议,要定义接口,兜兜转转这些年过去了,我觉得对这件事情认识当然越来越深刻,也说不清其中的程度。最近做的项目中,开始大量地和 OpenAPI 打交道,一方面要最先使用 OpenAPI 来定义接口,让多个其他交互的模块都遵循它来开发,就是 “OpenAPI Driven Development” 的意思,这没啥特别的;但另一方面,系统中还需要把 Protobuf 接口定义转换成 HTTP 接口定义,并实施地使用 swagger-core 来动态创建 OpenAPI Spec,这就比较好玩了。

gRPC 到 HTTP 的协议转换

先来说说这第二件,动态创建 OpenAPI Spec。我们的网关系统需要大量地涉足两种接口,一种是对内调用 gRPC 接口,需要使用 Protobuf 来描述它们;另一种则是对外开放 HTTP 接口,需要使用 OpenAPI 来描述它们。这就牵涉到了两个事情:

  • 一个是需要设计一种机制,允许用户只用某一种描述语言(可以是 Protobuf,也可以是 OpenAPI)做出接口定义,然后这个定义会被自动转述为另一种接口定义语言,从而实现通过最少的配置,将两种接口都定义清楚了。技术实现上,我们使用了 Wire
  • 第二个是对于任何一个从外部到来的 HTTP 请求,这个系统需要根据定义自动把他转成 gRPC 的请求,并调用相应的内部系统,等到得到 gRPC 响应之后,也相应地转成 HTTP 响应并返回给外部。技术实现上,我们使用了 Vert.x

在这个过程中,我也学到了很多有意思的内容。一个是关于协议转换的,必须要完整地了解 Protobuf 是怎样描述一个接口的,而 OpenAPI 又是怎样描述一个接口的,然后才能谈转换,二者在定义上是有一些无法共同覆盖的部分的,这就需要使用某些替代或者扩展机制;再一个是基于 coroutine 或者 reactive 的异步编程(有的子系统基于前者,有的则是后者),以往写的 service 多数都是 blocking 的,适应 non-blocking 的 service 整个思维模式需要做一个转变。这部分体会还是比较深的,后续再写一点理解和总结。

OpenAPI Spec 驱动开发

再来说说这第一件,接口定义来驱动开发,这本来是一个平平无奇的事情,我记得 OpenAPI 的名字还是 Swagger 的时候就在项目中开始大范围地使用了,可是这一次,我才慢慢体会到它的威力远不止此。

使用 OpenAPI spec 来定义接口,不只是确定了所谓的系统和模块之间的合约(其实合约这一点其实使用任何方式来表述接口都可以做到);它还做到了一点,那就是 “标准化”。或者说,写这个合约的语言,叫做 OpenAPI,它是世界通用的语言,用它写出来的合约叫做 OpenAPI spec,大家都能看得懂。

Control Plane 中多模块对 OpenAPI Spec 的依赖

整个系统可以大致分为 Data Plane 和 Control Plane,前者可以说覆盖了从请求抵达、分解、协议转换,到内部接口调用,并将结果再次转换后返回的过程;而后者则是提供一系列机制和工具,去完成定义和控制这个过程所需的接口定义、序列化、持久化、请求校验、接口版本管理等一系列操作。

OpenAPI spec 是 Control Plane 整个系统中最重要的一个依赖项,有了它以后,很多模块都可以完成它相应的任务,无论是开发上,还是这些模块工作上,它们都可以并行。比如说,校验模块可以根据 OpenAPI spec 来校验外来的 HTTP request 和内部转换 gRPC 响应得到的 HTTP response 是否严格符合 spec 的格式;外部的客户端团队可以获取 OpenAPI spec 来自动生成客户端 SDK;接口定义人员可以在完成 protobuf 的定义后立即查看自动生成的 OpenAPI spec 是否符合他的预期等等。

OpenAPI 工具

有了 OpenAPI spec,或者说围绕它,就可以创造一系列的工具,并且这其中的许许多多都可以自动完成。OpenAPI.Tools 就是这样一个汇聚一系列 OpenAPI 工具的网站,而且基本上都是开源的,许多项目里面都可以比较自由地使用。我自己尝试了其中的一些,也实际用到了一些,我把其中比较有用的,记录在这里:

Avantation

可以根据 HAR 文件来生成 OpenAPI spec. HAR 就是 HTTP Archive format,是一种记录浏览器交互数据的 JSON 文件。上面有全部的访问某个网址的记录,包括 http 头、请求、响应和时间等等信息。

比如我们访问 https://reqres.in/api/users?page=2,然后就可以使用 Chrome 的开发者工具来导出 HAR 文件:

安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install -g avantation

运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
avantation get_user.har
✔ GET /api/users/2
✔ all taskes completed

接着就可以查看生成的 openapi.yaml 这个 OpenAPI spec 了.

Swagger CLI

这个功能就可多了,比如可以校验 OpenAPI spec 的格式,合并 spec 等等。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install -g @apidevtools/swagger-cli

安装好后,跑一下格式校验:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
swagger-cli -d validate ./spec.yaml
{
  "command": "validate",
  "file": "./spec.yaml",
  "options": {
    "schema": true,
    "spec": true,
    "format": 2,
    "type": "json",
    "wrap": null,
    "debug": true
  }
}
./spec.yaml is valid
Vacuum

这个就是 OpenAPI 的 linter:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
brew install daveshanley/vacuum/vacuum

可以生成各种格式的结果页面,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vacuum html-report ./spec.yaml
OpenAPI-diff

这个东西用来做 backward compatibility 的检查是个不错的选择。

安装就是一个 docker 镜像:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker pull openapitools/openapi-diff

对比两个 OpenAPI spec 的版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run --rm -t \
-v ~/Downloads/open_api:/open_api \
openapitools/openapi-diff \
--fail-on-incompatible \
/open_api/spec.yaml \
/open_api/spec-updated.yaml
...
- GET /endpoints
  Parameter:
    - Delete input in query
        API changes broke backward compatibility
Redoc

可以生成精美的接口文档。

安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm i -g redoc-cli

运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
redoc-cli build ./spec.yaml
OpenAPI Generator

可以根据 OpenAPI spec 生成客户端、服务端 stub、文档等等,非常好用。

安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
brew install openapi-generator

运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
openapi-generator generate -i spec.yaml -g kotlin -o output-client

openapi-generator generate -i spec.yaml -g kotlin-spring -o output-server

上面的例子中,第一个生成客户端,第二个生成服务端。其中参数-g 是可以用来指定某一种生成器

Swagger UI

Swagger UI 大概是这些工具里面我用的最早的,可以比较方便地查看 spec 并个根据它构造请求。

安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker pull swaggerapi/swagger-ui

运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -p 80:8080 -e
SWAGGER_JSON=/open_api/spec.yaml -v
~/Downloads/open_api:/open_api swaggerapi/swagger-ui

运行起来后就可以通过 http://localhost/访问了。

Restish

Restish 非常好用,我们部署的 service 需要使用命令行(CLI)来访问,以作为 portal 访问的一个功能上更强大的备选方案,可是去写 commandline 和维护挺费劲的,Restish 可以自动生成这样的命令行。

安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
brew tap danielgtaylor/restish && brew install restish

运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
restish api configure rest-example
restish rest-example get-endpoint --service abc --name def

上例中,第一行用来打开交互界面做初始化配置,以从远程 URL 读取指定 OpenAPI spec,第二行则是根据它来进行真正的 API call。

TCases

它可以用来自动生成远程 API 的测试代码,也是比较实用的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./tcases-4.0.1/bin/tcases-api-test -o
./tcases-output/src/test/com/xyz/openapi -u 10000 -m
 2 -l stdout -B uri=https://www.xyz.com/v1/abc ./spec.yaml

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《四火的唠叨》

×Scan to share with WeChat

你可能也喜欢看:

  1. 关于 Jeff Dean 的几个搞笑传言
  2. XML 和 JSON
  3. 常见分布式应用系统设计图解(十):电商秒杀系统
  4. 常见分布式应用系统设计图解(一):即时消息系统
  5. 实际技术选型的考虑因素
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
OpenAPITools 实践
OpenAPITools[1] 可以依据 REST API 描述文件,自动生成服务端桩(Stub)代码、客户端 SDK 代码,及文档等。其是社区版的 Swagger[2] ,差异可见:OpenAPI Generator vs Swagger Codegen[3]。
GoCoding
2021/11/11
9760
OpenAPITools 实践
OpenAPI初探
项目中使用gin组件实现的api接口,总是需要修改代码,又要修改md文档。总想有没有一种办法,能够只写一遍就能完成代码和文档的修改,很快发现了gin-swagger组件,可以通过代码的注释生成文档,但写代码同时写入详细的注释让人发狂。
peakxie
2019/08/29
5.3K0
OpenAPI初探
⚡什么是 OpenAPI,优势、劣势及示例
使用 OpenAPI,客户端应用程序和 API 服务器是分开的。服务的 API 定义定义了客户端如何与之交互,而无需客户端阅读其源代码。
oil欧呦
2024/05/03
1.4K0
OpenAPI 文档代码生成工具
OpenAPI 文档是基于 OpenAPI 规范(OpenAPI Specification, OAS)撰写的,主要用于描述 RESTful API 的一种标准化方式。它是 API 文档的格式化规范,帮助开发者清晰地定义和理解 API 的结构和行为。
陈明勇
2025/01/03
5157
API 工程化分享
本文是学习B站毛剑老师的《API 工程化分享》的学习笔记,分享了 gRPC 中的 Proto 管理方式,Proto 分仓源码方式,Proto 独立同步方式,Proto git submodules 方式,Proto 项目布局,Proto Errors,服务端和客户端的 Proto Errors,Proto 文档等等
郑子铭
2022/05/15
6290
API 工程化分享
Go语言微服务框架 - 10.接口文档-openapiv2的在线文档方案
虽然protobuf已经是通用性很广的IDL文件了,但对于未接触过这块的程序员来说,还是有很大的学习成本。在综合可读性和维护性之后,我个人比较倾向于使用oepnapiv2的方案,提供在线接口文档。
junedayday
2021/11/10
1.9K0
【SpringBoot系列】OpenAPI规范构建SpringBoot接口服务
到目前为止,我们已经了解了如何生成一个新的 spring boot 应用程序,然后如何将其容器化。但是,我们的应用程序没有任何功能。今天我们将学习如何使用 Spring boot 创建 REST API。我们将采用模式优先的方法生成 REST API 接口,本文将采用 OpenAPI 规范以及如何使用该规范生成 REST API 接口。
Freedom123
2024/04/19
8640
如何搭建一个高效安全的API开放平台:完整步骤指南
在当今数字化时代,API(应用程序编程接口)已成为连接不同系统和服务的桥梁。一个设计良好的API开放平台能够为企业带来巨大的商业价值和技术优势。本文将详细介绍从零开始搭建一个API开放平台的完整步骤,涵盖技术选型、架构设计、安全防护和运维管理等关键环节。
编程小白狼
2025/04/24
3470
构建下一代 HTTP API - 总览
十月底我应邀在一个技术群里做个分享,思来想去我选择了 API 这个话题,因为很多互联网初创公司产品的第一步就是如何定义和设计一套 API,来满足产品核心所能提供的用户体验。我把 2016 年我在 Tubi 做 UAPI,2018 年我在 ArcBlock 做 Goldorin,2019 年做 Forge TX pipeline / Forge Patron 的经验揉了进去,又重新研究和回顾了 Swagger(Open API)/ GraphQL / GRPC gateway 这几个我曾经在各种场合使用过的工具,写下了一个 slides。那次讲座之后,同样的内容我又在 Tubi 内部讲了一遍,脱敏后的讲座 slides 如果大家感兴趣可以在这里获取:
tyrchen
2020/12/16
6330
构建下一代 HTTP API - 总览
使用 OAS(OpenAPI标准)来描述 Web API
无论哪种类型的Web API, 都可能需要给其他开发者使用. 所以API的开发者体验是很重要的. API的开发者体验, 简写为 API DX (Developer Experience). 它包含很多东西, 例如如何使用API, 文档, 技术支持等等, 但是最重要的还是API的设计. 如果 API 设计的不好, 那么使用该API构建的软件就需要增加在时间,人力,金钱等方面的投入. 有时候API会被错用, 甚至带来毁灭性后果. 最后抱怨该API等用户越来越多, 慢慢的, 客户就会停止使用该API.
solenovex
2020/02/18
3.7K0
使用 OAS(OpenAPI标准)来描述 Web API
还在手动同步文档?用 Git 和 OpenAPI 让它自动跑起来!
很多团队都有这样的经历:API 改了,但文档没跟上,开发联调时一脸懵。这种文档与代码脱节的情况,不仅影响效率,还容易引发严重 bug。本文将探讨一种更稳妥的解决思路,让你的接口文档和代码版本实现真正的“同步演进”。
网罗开发
2025/05/13
640
还在手动同步文档?用 Git 和 OpenAPI 让它自动跑起来!
使用go-swagger为golang API自动生成swagger文档
Swagger是一个简单但功能强大的API表达工具。它具有地球上最大的API工具生态系统,数以千计的开发人员,使用几乎所有的现代编程语言,都在支持和使用Swagger。使用Swagger生成API,我们可以得到交互式文档,自动生成代码的SDK以及API的发现特性等。
李海彬
2018/07/26
10.6K2
使用go-swagger为golang API自动生成swagger文档
Swagger详细了解一下(长文谨慎阅读)
Swagger 是最流行的 API 开发工具,它遵循 OpenAPI Specification(OpenAPI 规范,也简称 OAS)。 Swagger 可以贯穿于整个 API 生态,如 API 的设计、编写 API 文档、测试和部署。 Swagger 是一种通用的,和编程语言无关的 API 描述规范。
IT苦逼一枚
2020/04/27
33.1K0
文档即契约:在 SAP UI5 项目中用 OpenAPI 打通代码、文档与调试全链路
在现代云原生时代,API 不再是附属品,而是产品最核心的交付物。开发团队若想摆脱文档滞后于代码的魔咒,就需要把文档上升到与代码同等重要的地位,让二者共生共进。本文围绕文档即契约这一理念,结合 OpenAPI 规范与 Swagger UI,在 SAP UI5 项目中演示如何通过代码注释自动生成交互式 API 文档,并探讨版本联动与分层发布策略,帮助不同角色在同一个事实源上高效协作。
编程小妖女
2025/05/10
550
文档即契约:在 SAP UI5 项目中用 OpenAPI 打通代码、文档与调试全链路
搞懂gRPC支持HTTP进行双协议通信
2)通过 Protocol Buffers 提供强类型接口定义和高效的二进制序列化,减少数据体积;
闫同学
2025/04/18
2870
搞懂gRPC支持HTTP进行双协议通信
干货分享|推荐几个超赞的在线文档生成工具,终于可以告别word时代了
最近公司打算做一个openapi开放平台,让我找一款好用的在线文档生成工具,具体要求如下:
苏三说技术
2020/10/15
6.8K0
干货分享|推荐几个超赞的在线文档生成工具,终于可以告别word时代了
Linkerd服务网格的基础知识和服务配置
Linkerd 服务网格解决的最重要问题之一是可观察性:提供服务行为的详细视图,Linkerd 对可观察性的价值主张是,它可以为你的 HTTP 和 gRPC 服务提供黄金指标,这些都是自动执行,无需更改代码或开发人员参与的。
王先森sec
2024/01/12
1920
Linkerd服务网格的基础知识和服务配置
DDD分层
DDD中明确了repository概念,并属于domain层,但dao是对底层数据库的封装,具体实现类放在infrastructure层更合理
码农戏码
2021/03/23
2.6K0
用 AWS Smithy 构建下一代 API 服务
自动化代码生成这种能减少工作量的事情一直是程序员们的最爱。如果某些代码片段不断重复自身,我们会用宏替换来减少这种重复,但如果涉及到大规模,架构级别的重复,那么我们倾向于用代码生成来解决这种重复。日常工作中,大家使用得比较多的代码生成工具有 gRPC(或者其衍生的一系列 xRPC),用于把微服务的描述生成不同语言的代码。此外还有 GraphQL,用于把 GraphQL schema 生成服务端和客户端的代码。
tyrchen
2023/12/06
8500
用 AWS Smithy 构建下一代 API 服务
构建下一代 HTTP API - OpenAPI spec 和解析器
在 抽象的能力 一文结尾的地方,我简单谈到了做 feed 的一些心得。当时我接手这个工作的时候,之前的工程师已经留下了好几万行 php 代码,这些代码处理几十个来自不同厂商的 feed,把里面的内容提取出来存在数据库中。因为 feed 的格式不尽相同,有 XML,有 JSON,同样表述一个数据,大家的字段名有时也不太一样,比如同样是 video url,有的叫 url,有的叫 media_url,它们在 XML/JSON 里所处的层级也不尽然相同。所以之前的代码为每个 feed 写了一个类。有新需求(比如新的 feed)时,找一个最类似的代码,copy & paste,然后在好几百行粘贴出来的代码中根据差异一点点修改,最终形成新的 feed 的处理代码。
tyrchen
2021/01/04
1.8K0
构建下一代 HTTP API - OpenAPI spec 和解析器
相关推荐
OpenAPITools 实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验