开箱即用的GO后台管理系统 Kratos Admin - 交互式API文档 Swagger UI

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,182元/月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: Kratos Admin 集成 Swagger UI,实现交互式 API 文档。通过 Buf 生成 OpenAPI 规范,并内嵌至服务,自动同步接口变动,提升调试与协作效率。

开箱即用的GO后台管理系统 Kratos Admin - 交互式API文档 Swagger UI

在我们的开发当中,有几个问题会比较麻烦:

  1. 调试接口
  2. 测试接口
  3. 提供接口文档

那么,我们需要用什么方法和工具来实施这些工作内容呢?Swagger,或者说 OpenAPI。

我在使用Python的一个框架FastAPI的时候,发现它把Swagger UI内嵌了后端服务当中,可以直接访问 http://127.0.0.1:8000/docs:

Fast API Swagger UI

于是,我就把它借鉴了过来。

什么是 OpenAPI

OpenAPI 是编写 RESTful API 的全球标准。它是一种规范,使得全球开发人员可以标准化 API 的设计,并在从头开始编写 REST API 时遵守所有安全、版本控制、错误处理和其他最佳实践。不仅仅是从头开始,即使现有的 API 也可以进行微调以符合全球标准。

此外,遵守开发产品的通用标准显然有助于什么。

最初,OpenAPI 被称为 Swagger 规范。Swagger 提出了构建 API 的最佳实践,然后这些最佳实践成为了 OpenAPI规范。

像 SwaggerHub 这样的工具可以帮助开发人员在基于浏览器的编辑器中构建 API,符合标准并完全控制设计过程。

使用 Swagger Inspector 等工具,我们还可以生成自己的 API 规范,并将其传递给组织中的其他团队。

需进一步了解,可查看 OpenAPI 规范(中文版)

什么是 Swagger

OpenAPI 是一个编写 API 文档的规范,然而如果手动去编写 OpenAPI 规范的文档,是非常麻烦的。而 Swagger 就是一个实现了OpenAPI 规范的工具集。

官网:https://swagger.io/

Swagger 包含的工具集:

  • Swagger编辑器: Swagger Editor允许在浏览器中编辑YAML中的OpenAPI规范并实时预览文档。
  • Swagger UI: Swagger UI是HTML,Javascript和CSS资产的集合,可以从符合OAS标准的API动态生成漂亮的文档。
  • Swagger Codegen:允许根据OpenAPI规范自动生成API客户端库(SDK生成),服务器存根和文档。
  • Swagger Parser:用于解析来自Java的OpenAPI定义的独立库
  • Swagger Core:与Java相关的库,用于创建,使用和使用OpenAPI定义
  • Swagger Inspector(免费): API测试工具,可让您验证您的API并从现有API生成OpenAPI定义
  • SwaggerHub(免费和商业): API设计和文档,为使用OpenAPI的团队构建。

怎么样集成Swagger到Kratos

首先,我们要了解的是:要在项目中集成Swagger,唯一的办法就是通过Swagger UI来集成。

Swagger UI依赖读取的是OpenAPI的json或者yaml格式的API文档,这个文档不是给人来读取的,而是给Swagger UI。同样,它也不是给人来写的,靠的是生成器来生成的。

因此,下面首先我们需要来了解API是如何生成的,怎样生成的。

API文档怎么产生呢?

因为Kratos是依托于Protobuf和gRPC来设计API的,所以,我们可以由相关的生成器工具来生成。

Protobuf是一个DSL语言,它需要一个叫做protoc的工具来将API编译转换成目标语言。而它的具体工具是依靠插件来实现的。

目前已有的由Go编写的OpenAPI生成插件有两个:

我们可以通过以下命令来安装:

go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@latest
go install github.com/google/gnostic/cmd/protoc-gen-openapi@latest

直接生成的命令倒是简单。

生成 OpenAPI v2 json文档:

protoc --proto_path=. --openapiv2_out=paths=source_relative:../ --openapiv2_opt logtostderr=true --openapiv2_opt json_names_for_fields=true ./*.proto

生成 OpenAPI v3 yaml文档:

protoc --proto_path=. --openapi_out=naming=json=paths=source_relative:../ ./*.proto

但是,直接使用命令是很不方便的,我们可以使用一个叫做Buf.Build来进行工程化生成。

安装Buf很简单:

go install github.com/bufbuild/buf/cmd/buf@latest

然后我们需要在项目的根目录下创建buf.work.yamlbuf.yamlbuf.gen.yaml等配置文件。关于这些配置文件如何进行配置,本文将不做详细的讲解,可自行寻找教程学习。本文只着重讲解生成OpenAPI的相关知识。

要生成OpenAPI,我们还需要创建一个配置文件buf.openapi.gen.yaml,并且放在proto同级目录下,在这里我们以后台API做讲解

# 配置protoc生成规则
version: v1
managed:
  enabled: false
plugins:
  # generate openapi v2 json doc
#  - name: openapiv2
#    out: ../docs
#    opt:
#      - json_names_for_fields=true
#      - logtostderr=true

  # generate openapi v3 yaml doc
  - name: openapi
    out: ./app/admin/service/cmd/server/assets
    opt:
      - naming=json
      - depth=2
      - paths=source_relative

接着我们就可以在项目根目录下使用下面的命令来生成了:

buf generate --path api/admin/service/v1 --template api/admin/service/v1/buf.openapi.gen.yaml

最终,在./app/admin/service/cmd/server/assets这个目录下面,将会生成出来一个文件名为openapi.yaml的文件。

怎么将openapi.yaml文件引入到Swagger UI

Kratos官方本来是有一个swagger-api的项目的(现在已经被归档了),集成的是OpenAPI v2的Swagger UI。这个项目呢,不好使,我在应用中,经常会读不出来OpenAPI的文档。还有就是OpenAPI v2不如v3功能强大。

因为没有支持,而我又需要跟前端进行沟通,所以我只好生成出OpenAPI文档之后,自行导入到ApiFox里面去使用,ApiFox呢,挺好的,支持文件和在线两种方式导入,文档管理,接口测试的功能也都很强大。但是总是要去费神导出文档,这很让人抗拒——在开发的初期,接口变动是很高频的行为——难道就不能够全自动吗?程序只要一发布,接口就自动的跟随程序一起发布出去了。

对,说的就是集成Swagger UI。

为了做到这件事,我需要做这么几件事情:

  1. 把Buf生成OpenAPI文档,编译运行程序写进MakeFile里面;
  2. 利用golang的Embedding Files特性,把openapi.yaml嵌入到服务程序里面;
  3. 集成Swagger UI到项目,并且读取内嵌的openapi.yaml文档。

那么,我们首先开始编写Makefile:

# generate protobuf api go code
api:
    buf generate

# generate OpenAPI v3 docs.
openapi:
    buf generate --path api/admin/service/v1 --template api/admin/service/v1/buf.openapi.gen.yaml
    buf generate --path api/front/service/v1 --template api/front/service/v1/buf.openapi.gen.yaml

# run application
run: api openapi
    @go run ./cmd/server -conf ./configs

这样我们只需要运行make openapi就执行OpenAPI的生成了,调试运行的时候,输入make run命令就可以生成OpenAPI并运行程序。

Makefile写好了,现在我们来到./app/admin/service/cmd/server/assets这个目录下面,我们在这个目录下面创建一个名为assets.go的代码文件:

package assets

import _ "embed"

//go:embed openapi.yaml
var OpenApiData []byte

就这样,我们就把openapi.yaml内嵌进程序了。

最后,我们就需要来集成Swagger UI进来了。我为此封装了一个项目,要使用它,我们需要:

go get -u github.com/tx7do/kratos-swagger-ui

在创建REST服务器的地方调用程序包里面的方法:

package server

import (
    rest "github.com/go-kratos/kratos/v2/transport/http"
    swaggerUI "github.com/tx7do/kratos-swagger-ui"

    "kratos-cms/app/admin/service/cmd/server/assets"
)

func NewRESTServer() *rest.Server {
   
    srv := CreateRestServer()

    swaggerUI.RegisterSwaggerUIServerWithOption(
        srv,
        swaggerUI.WithTitle("Admin Service"),
        swaggerUI.WithMemoryData(assets.OpenApiData, "yaml"),
    )
}

自此我们就大功告成了!

如果API服务的端口是8080,那么我们可以访问链接来访问Swagger UI:

http://localhost:8080/docs/

同时,openapi.yaml文件也可以在线访问到:

http://localhost:8080/docs/openapi.yaml

项目代码

参考资料

目录
相关文章
|
Linux 测试技术
Linux基础项目开发1:量产工具——UI系统(五)
Linux基础项目开发1:量产工具——UI系统(五)
121 0
Linux基础项目开发1:量产工具——UI系统(五)
|
SQL JavaScript 前端开发
学生管理系统Element UI版(上)
搭建环境 创建vue项目:vue create day16_element_student 安装第三方组件:axios、element
157 0
|
7月前
|
人工智能 JavaScript 关系型数据库
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
227 14
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
|
8月前
|
UED
「Mac畅玩鸿蒙与硬件52」UI互动应用篇29 - 模拟火车票查询系统
本篇教程将实现一个模拟火车票查询系统,通过输入条件筛选车次信息,并展示动态筛选结果,学习事件处理、状态管理和界面展示的综合开发技巧。
221 13
「Mac畅玩鸿蒙与硬件52」UI互动应用篇29 - 模拟火车票查询系统
|
9月前
|
人工智能 搜索推荐 算法
婚恋交友系统UI/UX设计优化 婚恋交友系统用户界面友好性提升 婚恋交友系统用户行为分析与优化 婚恋交友系统用户反馈收集与处理
针对婚恋交友系统的UI/UX设计优化,本文提出多项策略:简化用户界面、提升交互体验、个性化推荐算法;增强用户界面友好性,包括适应性、无障碍及情感化设计;通过数据收集与分析优化用户行为路径;建立多渠道反馈机制,分类处理并及时告知结果。这些措施旨在提高用户体验和满意度,促进平台健康发展。[点击查看完整演示和免费源码](https://gitee.com/duoke-official-open-source/hunlianjiaoyou)
411 6
|
9月前
|
前端开发 数据安全/隐私保护
全新紫色新UI数码盲盒系统源码/全开源无加密/附教程
全新紫色新UI数码盲盒系统源码/全开源无加密/附教程 前端uniapp+H5 后端FastAdmin框架 可打包成APP多端运行 亲测可用
246 13
|
11月前
|
机器学习/深度学习 数据可视化 计算机视觉
基于opencv的车牌识别系统(UI界面采用tkinter设计)
基于opencv的车牌识别系统(UI界面采用tkinter设计)
190 0
|
搜索推荐 数据库
最新UI六零导航系统源码 | 多模版全开源
使用PHP+MySql,增加后台管理 多模板选择,支持在后台切换模板 增加常用搜索引擎,如:知乎、哔哩哔哩、在线翻译等(支持自定义) 支持用户提交收录申请,地址:http://域名/apply 部分模板优化和增加部分功能,如返回顶部、获取输入框焦点、时间日期显示等
166 1
|
开发者 图形学 前端开发
绝招放送:彻底解锁Unity UI系统奥秘,五大步骤教你如何缔造令人惊叹的沉浸式游戏体验,从Canvas到动画,一步一个脚印走向大师级UI设计
【8月更文挑战第31天】随着游戏开发技术的进步,UI成为提升游戏体验的关键。本文探讨如何利用Unity的UI系统创建美观且功能丰富的界面,包括Canvas、UI元素及Event System的使用,并通过具体示例代码展示按钮点击事件及淡入淡出动画的实现过程,助力开发者打造沉浸式的游戏体验。
546 0
|
小程序 PHP
全新UI自助图文打印系统小程序源码 PHP后端 附教程
全新UI自助图文打印系统小程序源码 PHP后端 附教程
468 2