Api文档

在之前的 Spring Cloud 微服务系列文章中,我整合了 Swagger 来实现接口文档功能。然而,在 DailyMart 项目中,由于使用的是 Spring Boot 3.x 版本,再次使用 Swagger 可能会遇到一些问题。目前 Spring Boot 3.x 将包 javax 下的所有内容迁移到了 jakarta 包下,例如 HttpServletRequest,而 Swagger 仍然使用的是 javax 包,导致不兼容的问题。因此,我们将使用 SpringDoc 来替代之前的 Swagger 组件。

1. 集成SpringDoc

在 Spring Boot 3.0 中,集成 SpringDoc 非常简单,只需要遵循以下几个步骤:

1.1 引入依赖

首先,在基础设施层的 dailymart-customer-infrastructure 模块的 pom.xml 文件中引入 SpringDoc 的依赖:

1.2 添加文档注解

接下来,我们可以在项目的接口上添加相应的接口注解,以之前介绍的用户接口接口为例:
以下是SpringDoc中常用的几个注解,大家可以自行测试
注解
含义
@Tag
用在Controller类上,描述此Controller的信息
@Operation
用在Controller的方法里,描述此Api的信息
@Parameter
用在Controller方法里的参数上,描述参数信息
@Parameters
用在Controller方法里的参数上
@Schema
用于DTO,以及DTO的属性上
@ApiResponse
用在Controller方法的返回值上
@ApiResponses
用在Controller方法的返回值上
@Hidden
用在各种地方,用于隐藏其api

1.3 优化包装类

在之前的文章《DailyMart07:DDD 中统一返回格式与全局异常处理》中,我们实现了包装响应体的功能,使所有对外的接口自动返回 Result 包装类。然而,集成了 SpringDoc 后,我们需要过滤掉 SpringDoc 的接口包装,以避免异常。我们可以通过如下方式进行优化:
完成了上述步骤后,我们已经成功集成了 SpringDoc 文档。此时,在浏览器中访问 http://localhost:8081/swagger-ui/index.html,即可查看用户模块的接口文档。你还可以进入具体的接口页面进行调试,非常方便。
notion image
不过,此时生成的文档仍然使用默认值,接下来我们将介绍如何进行各种自定义配置。

1.4 自定义SpringDoc配置

为了配置文档的基础属性,我们可以在基础设施层创建一个名为 OpenApiConfig 的配置类:
在上述代码中,有很多配置项可以根据自己的需求进行调整。例如,你可以根据代码和截图对照,按照自己的要求进行配置。
notion image
另外,如果在生产环境中需要关闭接口文档功能,集成 SpringDoc 后,你可以通过以下配置进行关闭:

2. 启用Knif4j增强

在之前使用 Swagger 时,许多人对 Swagger UI 的界面风格不太满意,更倾向于集成 Knife4j 的 UI。SpringDoc 也可以集成 Knife4j,步骤如下:

2.1 引入依赖

引入 Knife4j 的依赖,不再需要单独引入 SpringDoc 的依赖。在 pom.xml 中添加以下依赖:
此时,你可以通过访问 http://localhost:8081/doc.html 来查看 Knife4j 的文档页面,原 Swagger 页面仍然可以访问。
notion image

3. 网关聚合

DailyMart 是一个微服务项目,包含多个服务。为了避免每次都进入单独的项目模块查看接口文档,我们可以在网关层进行聚合。
从 Knife4j 4.0 版本开始,在网关层进行文档聚合变得非常方便。下面是相关的步骤:

3.1 引入依赖

在网关服务模块 dailymart-gateway 中添加如下依赖:

3.2 修改配置

在 application.yaml 配置文件中添加文档聚合的相关配置,如果需要其他配置,请参考官方手册:https://doc.xiaominfo.com/docs/middleware-sources/spring-cloud-gateway
完成上述两步后,重新启动网关服务。在 DailyMart 项目中,网关服务的端口为 9090。现在,你只需要访问 http://10.5.103.34:9090/doc.html 就可以在网关聚合后查看接口文档了。
notion image

4. 构建公共模块

在 DailyMart 项目中,涵盖多个服务。按照目前的做法,每个服务都需要单独引入 Knife4j 的依赖并创建 SpringDoc 的配置类。然而,我们可以将这些重复的工作封装成一个公共的自定义 Starter。这样,任何需要使用这些文档功能的模块只需引入该 Starter 即可。

4.1 创建自定义Starter

在项目中创建一个名为 dailymart-doc-spring-boot-starter 的自定义 Starter 模块:
notion image
image.png
创建配置类 DocAutoConfiguration,内容如下:
在这个配置类中,通过引入 DailyMartDocProperties 来填充文档的标题和描述,其代码如下:
当然,在SpringBoot2.7以后自定义Starter,还需要在文件/resource/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中导入配置类

4.2 其他模块引入自定义Starter

构建了自定义 Starter 后,其他模块就不再需要单独引入 Knife4j 的依赖和 SpringDoc 的配置类了。而是只需引入公共的 dailymart-doc-spring-boot-starter,并在配置文件中指定当前模块的标题、描述和版本,非常方便。
首先在各个微服务的基础设施层模块中的 pom.xml 中添加自定义starter的依赖:
然后在模块的配置文件中指定自定义 Starter 的属性:

小结

在本文中,我们深入研究了在 Spring Cloud 微服务中集成 SpringDoc 生成 API 文档的过程。我们逐步介绍了如何通过替代 Swagger 解决版本兼容性问题,并通过自定义配置来优化生成的文档。我们还探讨了如何使用 Knife4j 提升文档 UI,以及在网关中聚合多个服务的文档。最后,我们引入了构建自定义 Starter 的方法,实现了在不同模块中轻松引入文档功能。
Loading...
目录
文章列表
王小扬博客
产品
Think
Git
软件开发
计算机网络
CI
DB
设计
缓存
Docker
Node
操作系统
Java
大前端
Nestjs
其他
PHP