Golang微服务框架Kratos轻松集成并使用Swagger UI

简介: 在我们的开发当中,调试接口,测试接口,提供接口文档给前端,那都是非常频繁的工作内容。那么,我们需要用什么方法和工具来实施这些工作内容呢?Swagger,或者说OpenAPI。

Golang微服务框架Kratos轻松集成并使用Swagger UI

在我们的开发当中,调试接口,测试接口,提供接口文档给前端,那都是非常频繁的工作内容。

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

Swagger,或者说OpenAPI。

下面先让我们了解一下下什么是Swagger,什么是OpenAPI。

什么是 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

结语

作为程序员,偷懒是一个美德,因为要想偷懒,就必须要想尽办法改善流程,制造工具,能自动化的就自动化。而集成Swagger UI在工作中也确实切实的减轻了我和团队的工作量,提升了开发效率。

如果你对Kratos集成Swagger UI还有什么不太明白的,我有一个开源的CMS项目,里面有完整的应用代码:

参考资料

目录
相关文章
|
22天前
|
人工智能 达摩院 并行计算
VideoRefer:阿里达摩院开源视频对象感知与推理框架,可集成 VLLM 提升其空间和时间理解能力
VideoRefer 是浙江大学与阿里达摩学院联合推出的视频对象感知与推理技术,支持细粒度视频对象理解、复杂关系分析及多模态交互,适用于视频剪辑、教育、安防等多个领域。
121 17
VideoRefer:阿里达摩院开源视频对象感知与推理框架,可集成 VLLM 提升其空间和时间理解能力
|
3月前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
57 2
|
4月前
|
Java 程序员 API
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
180 1
|
5月前
|
算法 API Apache
Flink CDC:新一代实时数据集成框架
本文源自阿里云实时计算团队 Apache Flink Committer 任庆盛在 Apache Asia CommunityOverCode 2024 的分享,涵盖 Flink CDC 的概念、版本历程、内部实现及社区未来规划。Flink CDC 是一种基于数据库日志的 CDC 技术实现的数据集成框架,能高效完成全量和增量数据的实时同步。自 2020 年以来,Flink CDC 经过多次迭代,已成为功能强大的实时数据集成工具,支持多种数据库和数据湖仓系统。未来将进一步扩展生态并提升稳定性。
782 2
Flink CDC:新一代实时数据集成框架
|
4月前
|
开发框架 监控 搜索推荐
GoFly快速开发框架集成ZincSearch全文搜索引擎 - Elasticsearch轻量级替代为ZincSearch全文搜索引擎
本文介绍了在项目开发中使用ZincSearch作为全文搜索引擎的优势,包括其轻量级、易于安装和使用、资源占用低等特点,以及如何在GoFly快速开发框架中集成和使用ZincSearch,提供了详细的开发文档和实例代码,帮助开发者高效地实现搜索功能。
267 0
|
6月前
|
存储 消息中间件 前端开发
Web2py框架下的神秘力量:如何轻松集成第三方API,让你的应用不再孤单!
【8月更文挑战第31天】在开发现代Web应用时,常需集成第三方服务如支付网关、数据存储等。本文将指导你使用Web2py框架无缝接入第三方API。通过实例演示从注册获取API密钥、创建控制器、发送HTTP请求到处理响应的全过程。利用`requests`库与Web2py的内置功能,轻松实现API交互。文章详细介绍了如何编写RESTful控制器,处理API请求及响应,确保数据安全传输。通过本教程,你将学会如何高效整合第三方服务,拓展应用功能。欢迎留言交流心得与建议。
65 1
|
7月前
|
开发框架 前端开发 JavaScript
ABP框架中短信发送处理,包括阿里云短信和普通短信商的短信发送集成
ABP框架中短信发送处理,包括阿里云短信和普通短信商的短信发送集成
ABP框架中短信发送处理,包括阿里云短信和普通短信商的短信发送集成
|
6月前
|
消息中间件 Java 网络架构
AMQP与微服务架构的集成策略
【8月更文第28天】在微服务架构中,各个服务通常通过HTTP/REST、gRPC等协议进行交互。虽然这些方法在很多场景下工作得很好,但在需要高并发、低延迟或需要处理大量消息的情况下,传统的同步调用方式可能无法满足需求。此时,AMQP作为异步通信的一种标准协议,可以提供一种更为灵活和高效的消息传递机制。
50 1
|
6月前
|
人工智能
LLama+Mistral+…+Yi=? 免训练异构大模型集成学习框架DeePEn来了
【8月更文挑战第6天】DeePEn是一种免训练异构大模型集成学习框架,旨在通过融合多个不同架构和参数的大模型输出概率分布,提升整体性能。它首先将各模型输出映射至统一概率空间,然后进行聚合,并最终反转回单一模型空间以生成输出。实验证明,在知识问答和推理任务上,DeePEn相比单一大模型如LLaMA和Mistral有显著提升,但其效果受模型质量和数量影响,并且计算成本较高。[论文: https://arxiv.org/abs/2404.12715]
60 1
|
6月前
|
测试技术 Java Spring
Spring 框架中的测试之道:揭秘单元测试与集成测试的双重保障,你的应用真的安全了吗?
【8月更文挑战第31天】本文以问答形式深入探讨了Spring框架中的测试策略,包括单元测试与集成测试的有效编写方法,及其对提升代码质量和可靠性的重要性。通过具体示例,展示了如何使用`@MockBean`、`@SpringBootTest`等注解来进行服务和控制器的测试,同时介绍了Spring Boot提供的测试工具,如`@DataJpaTest`,以简化数据库测试流程。合理运用这些测试策略和工具,将助力开发者构建更为稳健的软件系统。
82 0