魔改swagger,knife4j 的另外一种打开方式(一)

660 阅读2分钟

「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」。

哈喽大家好,我是阿Q!

在学习了前边的 swagger-ui 的相关内容之后呢,我们开始搭建 swagger 的注册中心。在继续往下学习之前先来张图感受下,便于大家的理解:

注册中心

项目源代码:https://gitee.com/kdyzm/swagger-register-server

它是一个swagger注册中心,对swagger文档进行持久化并进行CRUD操作,最终在knife4j中展示。它应当包含如下功能

  • 接收客户端传来的swagger文档信息并保存到数据库
  • 集成knife4j并展示文档
  • 提供knife4j前端页面/swagger-resources接口逻辑实现
  • 提供knife4j前端页面获取文档详情接口
  • 能够动态更新文档

表结构设计

设计上,用两张表分别存储group信息和文档详情信息

CREATE TABLE `group_info` (
    `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
    `name` varchar(64) NOT NULL COMMENT 'groupName',
    `location` varchar(128) NOT NULL COMMENT 'location',
    `version` varchar(16) NOT NULL COMMENT 'version',
    `url` varchar(128) NOT NULL COMMENT 'url',
    `app_name` varchar(64) DEFAULT NULL COMMENT '服务名(spring.application.name)',
    `gateway` varchar(64) DEFAULT NULL COMMENT '网关,无则不填',
    PRIMARY KEY (`id`),
    UNIQUE KEY `group_info_name` (`name`) COMMENT 'group name唯一',
    UNIQUE KEY `group_info_app_name` (`app_name`) COMMENT 'appname唯一'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `swagger_json` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `group_name` varchar(64) NOT NULL,
    `content` longtext NOT NULL COMMENT 'swagger具体信息',
    PRIMARY KEY (`id`),
    UNIQUE KEY `swagger_json_groupname` (`group_name`) COMMENT 'groupName唯一'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

group_info表用于存储swaggergroup信息,/swagger-resources接口将会从该表中取group数据

swagger_json表用于存储swagger的原始信息,用于文档渲染。

接收注册接口

swagger-register-serverSwaggerRegisterControllerregist()方法

对应以上两个表,注册接口有两个实体类。注册逻辑是:存在则更新,不存在就新增,groupNameappName都要保持唯一。

获取swagger详情接口

swagger-register-serverSwaggerRegisterControllergetSwaggerDetail()方法

默认值是/v2/api-docs,但是可以自定义,这里要求客户端在注册的时候就约定好接口路径是/swagger/detail

该接口从数据库中获取swagger信息。

获取resources列表接口

从之前的/swagger-resources源码分析过,想要从数据库自定义获取group列表,就需要重新实现SwaggerResourcesProvider接口并且标记为@Primary

swagger-register-serverDocumentationConfig

以上就是我们搭建的 swagger 注册中心的全部内容,接下来我们将要讲解如何搭建 swagger-starter 来完成客户端的搭建。

题外篇

阿Q将持续更新java实战方面的文章,感兴趣的可以关注下公众号:阿Q说代码,也可以来技术群讨论问题呦,点赞之交值得深交!