開箱即用的 GoWind Admin|風(fēng)行,企業(yè)級(jí)前后端一體中后臺(tái)框架:集成 Swagger UI 打造交互式 API 文檔
在企業(yè)級(jí)中后臺(tái)系統(tǒng)開發(fā)中,接口調(diào)試、測(cè)試與文檔同步始終是困擾前后端團(tuán)隊(duì)的核心痛點(diǎn):接口變更后文檔未及時(shí)更新、手動(dòng)編寫文檔效率低下、調(diào)試工具切換繁瑣等問題,嚴(yán)重影響開發(fā)協(xié)作效率。而 OpenAPI 規(guī)范(原 Swagger 規(guī)范)及其配套工具 Swagger UI,正是解決這些問題的最優(yōu)解之一。
筆者在使用 Python 生態(tài)的 FastAPI 框架時(shí),發(fā)現(xiàn)其內(nèi)置的 Swagger UI 體驗(yàn)極佳——開發(fā)者可直接通過 http://127.0.0.1:8000/docs 訪問交互式 API 文檔,實(shí)現(xiàn)接口可視化調(diào)試與測(cè)試,無需額外部署工具。受此啟發(fā),我們將這一方案借鑒到 GoWind Admin(基于 Kratos 框架的企業(yè)級(jí)前后端一體中后臺(tái)框架)中,實(shí)現(xiàn)了 API 文檔的自動(dòng)化生成與嵌入式訪問。
一、核心概念:OpenAPI 與 Swagger 的關(guān)系
很多開發(fā)者會(huì)混淆 OpenAPI 和 Swagger,其實(shí)二者是「規(guī)范」與「實(shí)現(xiàn)工具集」的關(guān)系,明確這一點(diǎn)是后續(xù)集成的基礎(chǔ)。
1.1 什么是 OpenAPI?—— API 設(shè)計(jì)的全球標(biāo)準(zhǔn)
OpenAPI 是一套用于設(shè)計(jì)、描述 RESTful API 的開放標(biāo)準(zhǔn)(并非工具),其核心價(jià)值在于標(biāo)準(zhǔn)化 API 的設(shè)計(jì)規(guī)范,確保 API 具備良好的可讀性、可擴(kuò)展性與安全性。遵循該標(biāo)準(zhǔn)的 API 可實(shí)現(xiàn):
- 跨團(tuán)隊(duì)協(xié)作標(biāo)準(zhǔn)化:前后端、測(cè)試、運(yùn)維團(tuán)隊(duì)基于同一套規(guī)范溝通,減少理解偏差;
- 自動(dòng)化流程支撐:為后續(xù)的文檔生成、接口測(cè)試、客戶端 SDK 生成提供結(jié)構(gòu)化數(shù)據(jù)基礎(chǔ);
- 兼容性與可維護(hù)性:API 版本迭代、跨系統(tǒng)集成時(shí)具備統(tǒng)一的約束,降低維護(hù)成本。
OpenAPI 最初名為 Swagger 規(guī)范,由 Swagger 團(tuán)隊(duì)提出,后捐贈(zèng)給 Linux 基金會(huì)并更名為 OpenAPI。如需深入學(xué)習(xí)規(guī)范細(xì)節(jié),可參考 [OpenAPI 規(guī)范(中文版)][2]。
1.2 什么是 Swagger?—— OpenAPI 規(guī)范的落地工具集
OpenAPI 僅定義規(guī)范,手動(dòng)編寫符合規(guī)范的文檔(如 JSON/YAML 格式)繁瑣且易出錯(cuò)。Swagger 則是一套實(shí)現(xiàn)了 OpenAPI 規(guī)范的工具集,旨在降低 API 開發(fā)與管理的門檻。其核心工具包括:
- Swagger Editor:瀏覽器端編輯器,支持實(shí)時(shí)編寫 OpenAPI 規(guī)范并預(yù)覽文檔;
- Swagger UI:核心工具,可將 OpenAPI 規(guī)范(JSON/YAML)動(dòng)態(tài)生成交互式文檔,支持在線調(diào)試接口;
- Swagger Codegen:根據(jù) OpenAPI 規(guī)范自動(dòng)生成多語言客戶端 SDK、服務(wù)器存根代碼;
- Swagger Inspector:免費(fèi) API 測(cè)試工具,支持驗(yàn)證 API 并反向生成 OpenAPI 規(guī)范;
- SwaggerHub:團(tuán)隊(duì)級(jí) API 設(shè)計(jì)與文檔管理平臺(tái),支持協(xié)作編輯與版本控制。
Swagger 官網(wǎng):https://swagger.io/,其中 Swagger UI 是我們本次集成的核心組件。
二、Kratos 集成 Swagger UI 的核心思路
Kratos 框架基于 Protobuf(IDL 語言)和 gRPC 設(shè)計(jì) API,因此集成 Swagger UI 的核心邏輯是:
- 通過工具從 Protobuf 定義生成符合 OpenAPI 規(guī)范的 JSON/YAML 文檔;
- 將生成的 OpenAPI 文檔嵌入到 Kratos 服務(wù)中(避免額外部署文檔服務(wù));
- 在 Kratos HTTP 服務(wù)中集成 Swagger UI,使其加載嵌入式的 OpenAPI 文檔,提供交互式訪問。
下面我們按步驟拆解具體實(shí)現(xiàn)過程。
三、第一步:從 Protobuf 生成 OpenAPI 文檔
Protobuf 是 Kratos 定義 API 的基礎(chǔ),我們需要通過 protoc 插件將 Protobuf 文件轉(zhuǎn)換為 OpenAPI 規(guī)范文檔。目前主流的 Go 語言插件有兩個(gè),分別支持 OpenAPI v2 和 v3 版本(推薦 v3,功能更強(qiáng)大、規(guī)范更完善)。
3.1 安裝 OpenAPI 生成插件
通過 go install 安裝兩個(gè)核心插件:
# OpenAPI v2 生成器(兼容舊版 Swagger UI)
go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@latest
# OpenAPI v3 生成器(推薦,功能更完善)
go install github.com/google/gnostic/cmd/protoc-gen-openapi@latest
3.2 直接通過 protoc 生成文檔(基礎(chǔ)方式)
安裝完成后,可直接通過 protoc 命令生成文檔,核心參數(shù)說明:
-
--proto_path=.:指定 Protobuf 文件所在目錄; -
--openapiv2_out/--openapi_out:指定輸出目錄與路徑規(guī)則(如 paths=source_relative 表示按源文件相對(duì)路徑輸出); -
--openapiv2_opt/--openapi_opt:額外配置(如 JSON 字段命名規(guī)則、日志輸出等)。
生成 OpenAPI v2 JSON 文檔:
protoc --proto_path=. \
--openapiv2_out=paths=source_relative:../docs \ # 輸出到上級(jí) docs 目錄
--openapiv2_opt logtostderr=true \ # 開啟日志輸出
--openapiv2_opt json_names_for_fields=true \ # JSON 字段名使用蛇形命名(如 user_name)
./*.proto
生成 OpenAPI v3 YAML 文檔(推薦):
protoc --proto_path=. \
--openapi_out=naming=json,paths=source_relative:../docs \ # 修復(fù)原文參數(shù)錯(cuò)誤,用逗號(hào)分隔配置
./*.proto
3.3 工程化生成:使用 Buf 替代原生 protoc
直接使用 protoc 命令存在諸多問題:多文件依賴管理復(fù)雜、參數(shù)重復(fù)輸入、團(tuán)隊(duì)協(xié)作規(guī)范不統(tǒng)一。推薦使用 Buf.Build 工具進(jìn)行工程化管理,它提供了 Protobuf 語法檢查、依賴管理、批量生成等功能。
3.3.1 安裝 Buf
go install github.com/bufbuild/buf/cmd/buf@latest
3.3.2 配置 Buf 生成規(guī)則
Buf 需通過三個(gè)核心配置文件管理生成流程(詳細(xì)配置可參考 Buf 官方文檔),此處重點(diǎn)關(guān)注 OpenAPI 生成相關(guān)的配置:在 Protobuf 文件同級(jí)目錄創(chuàng)建 buf.openapi.gen.yaml,配置 OpenAPI 生成規(guī)則:
# buf.openapi.gen.yaml:OpenAPI 生成專屬配置
version: v1
managed:
enabled: false # 關(guān)閉自動(dòng)管理依賴(根據(jù)項(xiàng)目實(shí)際需求調(diào)整)
plugins:
# 生成 OpenAPI v3 YAML 文檔(后臺(tái) API 示例)
- name: openapi
out: ./app/admin/service/cmd/server/assets # 輸出到服務(wù) assets 目錄(便于后續(xù)嵌入)
opt:
- naming=json # 字段名使用 JSON 風(fēng)格(蛇形命名)
- depth=2 # 嵌套字段解析深度(避免過度嵌套導(dǎo)致文檔冗余)
- paths=source_relative # 按源文件相對(duì)路徑生成文件
3.3.3 執(zhí)行 Buf 生成命令
在項(xiàng)目根目錄執(zhí)行以下命令,即可按配置生成 OpenAPI v3 文檔:
# 生成指定目錄的 Protobuf 對(duì)應(yīng)的 OpenAPI 文檔
buf generate --path api/admin/service/v1 \
--template api/admin/service/v1/buf.openapi.gen.yaml
生成成功后,會(huì)在 ./app/admin/service/cmd/server/assets 目錄下生成 openapi.yaml 文件。
四、第二步:將 OpenAPI 文檔嵌入 Kratos 服務(wù)
為了避免單獨(dú)部署 OpenAPI 文檔服務(wù),我們利用 Go 1.16+ 提供的 //go:embed 指令,將 openapi.yaml 文件嵌入到 Kratos 服務(wù)的二進(jìn)制文件中,實(shí)現(xiàn)「文檔與服務(wù)一體部署」。
4.1 編寫嵌入代碼
在 ./app/admin/service/cmd/server/assets 目錄下創(chuàng)建 assets.go 文件:
package assets
import _ "embed"
//go:embed openapi.yaml
// OpenApiData 嵌入的 OpenAPI v3 文檔數(shù)據(jù)(二進(jìn)制格式)
var OpenApiData []byte
通過 //go:embed openapi.yaml 指令,Go 編譯器會(huì)在構(gòu)建時(shí)將 openapi.yaml 文件內(nèi)容寫入 OpenApiData 變量,后續(xù)可直接在代碼中讀取。
五、第三步:集成 Swagger UI 到 Kratos 服務(wù)
Kratos 官方曾提供 swagger-api 項(xiàng)目,但目前已歸檔,且僅支持 OpenAPI v2,存在文檔讀取不穩(wěn)定等問題。為此,筆者封裝了 kratos-swagger-ui 庫,專門適配 Kratos 框架,支持 OpenAPI v3,且集成簡(jiǎn)單。
5.1 安裝集成庫
go get -u github.com/tx7do/kratos-swagger-ui
5.2 在 Kratos HTTP 服務(wù)中注冊(cè) Swagger UI
在 Kratos 服務(wù)的 HTTP 服務(wù)器初始化代碼中,調(diào)用 kratos-swagger-ui 庫的注冊(cè)方法,加載嵌入式的 OpenAPI 文檔:
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"),
)
}
5.3 自動(dòng)化構(gòu)建與運(yùn)行
為了簡(jiǎn)化「生成文檔 + 啟動(dòng)服務(wù)」的流程,我們將相關(guān)命令寫入 Makefile,實(shí)現(xiàn)一鍵執(zhí)行:
# Makefile
.PHONY: api openapi run
# 生成 Protobuf 對(duì)應(yīng)的 Go 代碼(gRPC + HTTP 網(wǎng)關(guān))
api:
buf generate
# 生成所有服務(wù)的 OpenAPI v3 文檔
openapi:
# 生成后臺(tái)服務(wù) API 文檔
buf generate --path api/admin/service/v1 --template api/admin/service/v1/buf.opena API 文檔(如有)
buf generate --path api/front/service/v1 --template api/front/service/v1/buf.openapi.gen.yaml
# 一鍵生成代服務(wù)
run: api openapi
@echo "啟動(dòng) Admin 服務(wù)..."
@go run ./cmd/server -conf ./configs碼、文檔并啟動(dòng)pi.gen.yaml
# 生成前臺(tái)服務(wù)
執(zhí)行以下命令即可完成全流程:
# 僅生成 OpenAPI 文檔
make openapi
# 生成代碼、文檔并啟動(dòng)服務(wù)
make run
六、驗(yàn)證集成效果
啟動(dòng) Kratos 服務(wù)后,若 HTTP 服務(wù)端口為 8080,可通過以下鏈接訪問 Swagger UI:
- Swagger UI 交互式文檔:http://localhost:8080/docs/
- 原始 OpenAPI 文檔:http://localhost:8080/docs/openapi.yaml
訪問后可看到:
- 所有 Protobuf 定義的 API 接口按模塊分類展示;
- 支持在線填寫請(qǐng)求參數(shù),點(diǎn)擊「Try it out」直接調(diào)試接口;
- 自動(dòng)展示響應(yīng)示例、狀態(tài)碼說明,無需手動(dòng)編寫文檔。
七、項(xiàng)目代碼與參考資料
7.1 完整項(xiàng)目代碼
- GoWind Admin(Gitee):https://gitee.com/tx7do/go-wind-admin
- GoWind Admin(GitHub):https://github.com/tx7do/go-wind-admin
7.2 擴(kuò)展參考資料
- Swagger 官方文檔:https://swagger.io/docs/
- OpenAPI 規(guī)范(中文版):https://openapi.apifox.cn/
- Buf 官方文檔:https://buf.build/docs/introduction
- Kratos 官方文檔 - HTTP 服務(wù):https://go-kratos.dev/docs/transport/http
- Go 嵌入文件特性:https://pkg.go.dev/embed
八、總結(jié)
通過本文的方案,我們實(shí)現(xiàn)了 Kratos 框架與 Swagger UI 的深度集成,核心優(yōu)勢(shì)在于:
- 自動(dòng)化文檔生成:從 Protobuf 定義一鍵生成 OpenAPI 文檔,避免手動(dòng)編寫與更新;
- 嵌入式部署:文檔與服務(wù)一體部署,無需額外維護(hù)文檔服務(wù);
- 交互式調(diào)試:前端開發(fā)者可直接通過瀏覽器調(diào)試接口,提升協(xié)作效率;
- 工程化支撐:基于 Buf 實(shí)現(xiàn)規(guī)范管理,適配團(tuán)隊(duì)協(xié)作場(chǎng)景。
該方案已集成到 GoWind Admin 框架中,開箱即用。如果你的 Kratos 項(xiàng)目也需要高效的 API 文檔解決方案,可直接參考本文實(shí)現(xiàn),或直接使用 GoWind Admin 框架快速搭建企業(yè)級(jí)中后臺(tái)系統(tǒng)。