整合 Knife4j 于 Spring Cloud 网关:实现跨服务的 API 文档统一展示

745 阅读4分钟

🌟“场快订” 场馆预定平台是我个人匠心打造的全栈免费开源项目,使用 Spring Cloud + Uniapp 开发,包含高并发设计(缓存击穿、缓存穿透处理)、大数据量查询优化、分库分表、IP 流量管控、分布式事务、分布式 ID、幂等处理、WebSocket 双向通信、消息队列异步执行、延时队列等内容,此外还包括域名购买与解析项目打包上线HTTP升级HTTPS等手把手教程,项目代码简洁,部分代码使用设计模式重构,非常适用于学习后端技术、毕业设计、相关计算机竞赛,感兴趣的朋友可以从以下链接进行学习:

image.png

🎯导读:本文档概述了构建和配置基于JDK 17、Spring Boot 3.0.7及Spring Cloud 2022.0.3的微服务系统,特别聚焦于集成Knife4j以增强API文档管理和接口测试功能。文中详细介绍了如何在Spring Boot应用中添加Knife4j依赖、配置Swagger UI路径和API分组,以及使用注解为接口添加描述信息。此外,文档还讲解了通过Spring Cloud Gateway聚合多个微服务的API文档的方法,并说明了如何设置白名单和基本认证来保护API文档访问。这些步骤旨在提升开发效率,确保API文档的准确性和易用性。

🏠️ HelloDam/场快订(场馆预定 SaaS 平台)

实践版本

  • JDK 17
  • SpringBoot 3.0.7
  • SpringCloud 2022.0.3
  • SpringCloudAlibaba 2022.0.0.0-RC2

Knife4j

doc.xiaominfo.com/

其他微服务引入Knife4j

参考文档:doc.xiaominfo.com/docs/quick-…

我这里以admin服务为例子

依赖

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
    <version>4.4.0</version>
</dependency>

配置文件

注意需要修改接口的扫包路径,即packages-to-scan

# springdoc-openapi项目配置
springdoc:
  swagger-ui:
    path: /swagger-ui.html
    tags-sorter: alpha
    operations-sorter: alpha
  api-docs:
    path: /v3/api-docs
  group-configs:
    - group: 'default'
      paths-to-match: '/**'
      packages-to-scan: com.vrs.controller
# knife4j的增强配置,不需要增强可以不配
knife4j:
  enable: true
  setting:
    language: zh_cn

添加接口描述

  • @Tag:添加类描述
  • @Operation:添加接口描述
@RestController
@RequestMapping("/user/")
@RequiredArgsConstructor
@Tag(name = "用户管理")
public class UserController {

    private final UserService userService;

    /**
     * 查询用户名是否存在
     */
    @Operation(summary = "查询用户名是否存在")
    @GetMapping("/v1/has-username")
    public Result<Boolean> hasUsername(@RequestParam("username") String username) {
        return Results.success(userService.hasUsername(username));
    }

}

访问接口文档

http://ip地址:端口/doc.html,如果设置了服务访问前缀,记得要加到/doc前面,例如的地址为http://localhost:7050/admin/doc.html

在这里插入图片描述

屏蔽请求参数字段

有时候接口接收的参数是一个json数据,但是其中一些字段是不需要的,例如idcreateTimeupdateTimeisDeleted,可以通过@Schema字段将其隐藏

@Schema(description = "id", hidden = true)
private Long id;

通过网关服务统一聚合访问

参考文档:doc.xiaominfo.com/docs/middle…

依赖

需要在网关服务添加如下依赖

<!-- Knife4j API 小刀注解依赖 -->
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-gateway-spring-boot-starter</artifactId>
    <version>4.4.0</version>
</dependency>

配置文件

需要在网关服务的配置文件中的routes中设置每个微服务的接口访问地址,注意enabled一定要设置为true,才能开启聚合功能,注意如果微服务有设置接口前缀,一定要设置context-path

# knife4j的网关聚合配置 文档地址:http://{gateway.host}:{gateway.port}/doc.html
knife4j:
  # 聚合swagger文档
  gateway:
    # 是否开启Knife4j网关聚合功能(生产环境不建议开启)
    enabled: true
    # 排序规则(tag/operation排序自4.2.0版本新增)
    # 取值:alpha-默认排序规则,官方swagger-ui默认实现,order-Knife4j提供的增强排序规则,开发者可扩展x-order,根据数值来自定义排序
    tags-sorter: order
    operations-sorter: order
    # 指定聚合的策略(默认手动配置(manual),服务发现(discover))
    strategy: manual
    # 个性化定制的部分子服务分组情况
    routes:
      - name: admin模块
        # 服务名
        service-name: vrs-admin
        # 真实子服务访问url地址-提供OpenAPI的文档
        url: /admin/v3/api-docs?group=default
        # 路由前缀,兼容OpenAPI3规范在聚合时丢失contextPath属性的异常情况,由开发者自己配置contextPath,Knife4j的前端Ui做兼容处理,与url属性独立不冲突,仅OpenAPI3规范聚合需要,OpenAPI2规范不需要设置此属性,默认为(apiPathPrefix)
        context-path: /admin
        # 排序
        order: 1

白名单过滤 Knife4j 相关资源

通过http://网关服务ip:端口/doc.html访问,发现文档请求异常

在这里插入图片描述

通过查看网页请求的错误,发现是权限验证的问题

在这里插入图片描述

那只需要在网关层放开相应资源的权限控制即可,参考文档:doc.xiaominfo.com/docs/featur…

将相应资源地址放到白名单中

在这里插入图片描述

再次访问文档url,发现其他服务的接口被聚合进来了。具体原理就是网关服务通过/admin/v3/api-docs去admin服务请求了接口数据,请求到之后将其放到当前接口文档中

在这里插入图片描述

用户名密码控制接口文档访问

参考文档:doc.xiaominfo.com/docs/featur…

在网关服务的配置文件中添加如下配置

knife4j:
  gateway:
    basic:
      enable: true
      username: admin
      password: 12344321

接下来访问接口文档就需要使用账号密码来访问了

在这里插入图片描述