Spring Cloud Gateway 网关整合 Knife4j 4.3 实现微服务接口文档聚合

简介: Spring Cloud Gateway 网关整合 Knife4j 4.3 实现微服务接口文档聚合

开局一张图

1.png

前言


youlai-mall 开源微服务商城新版本基于 Spring Boot 3 和 Java 17,同时采用 Knife4j 4.3。与以前版本不同的是,新版本的 Knife4j 不再依赖 Springfox 框架(该框架于2020年停止更新)作为基础的 OpenAPI3 规范,而选择了 SpringDoc 作为底层依赖框架的 OpenAPI3 规范的实现。因此,相对于以前的版本,新版本存在较大的差异。


在新版本中,您可以参考 Knife4j 官网 进行适配和升级。本文将介绍新版本中 Knife4j 4.3 和微服务的整合、 Spring Cloud Gateway 网关聚合,以及如何自动填充 Spring Authorization Server 的自定义扩展的 OAuth2 密码模式的 access_token。


Spring Cloud 整合 Knife4j


这里的 Spring Cloud 微服务是除了网关(youlai-gateway)之外的其他服务,像系统服务(youlai-system)和商城服务(mall-*)


pom.xml


添加 knife4j 的 maven 依赖,参考 Spring Boot 3 整合 Knife4j

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

application.yml


除了 packages-to-scan 扫描接口包路径,其他默认即可,参考 Spring Boot 3 整合 Knife4j

spring:
  security:
    oauth2:
      authorizationserver:
        # OAuth2 认证路径
        token-uri: http://localhost:9999/youlai-auth/oauth2/token
# 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: 
        # 配置接口文档扫描包路径,每个服务的路径不同,下面是系统服务(youlai-system)的包路径
        - com.youlai.system.controller
# knife4j的增强配置,不需要增强可以不配
knife4j:
  enable: false
  setting:
    language: zh_cn

SwaggerConfig.java

package com.youlai.system.config;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.OAuthFlow;
import io.swagger.v3.oas.models.security.OAuthFlows;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
/**
 * Swagger 配置类
 * <p>
 * 基于 OpenAPI 3.0 规范 + SpringDoc 实现 + knife4j 增强
 *
 * @author haoxr
 * @since 3.0.0
 */
@Configuration
public class SwaggerConfig {
    /**
     * OAuth2 认证 endpoint
     */
    @Value("${spring.security.oauth2.authorizationserver.token-uri}")
    private String tokenUrl;
    /**
     * OpenAPI 配置(元信息、安全协议)
     */
    @Bean
    public OpenAPI apiInfo() {
        return new OpenAPI()
                .components(new Components()
                        .addSecuritySchemes(HttpHeaders.AUTHORIZATION,
                                new SecurityScheme()
                                        // OAuth2 授权模式
                                        .type(SecurityScheme.Type.OAUTH2)
                                        .name(HttpHeaders.AUTHORIZATION)
                                        .flows(new OAuthFlows()
                                                .password(
                                                        new OAuthFlow()
                                                                .tokenUrl(tokenUrl)
                                                                .refreshUrl(tokenUrl)
                                                )
                                        )
                                        // 安全模式使用Bearer令牌(即JWT)
                                        .in(SecurityScheme.In.HEADER)
                                        .scheme("Bearer")
                                        .bearerFormat("JWT")
                        )
                )
                // 接口全局添加 Authorization 参数
                .addSecurityItem(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION))
                // 接口信息定义
                .info(new Info()
                        .title("系统服务")
                        .version("3.0.0")
                        .description("用户、角色、菜单、部门、字典等接口")
                        .license(new License().name("Apache 2.0")
                                .url("https://www.apache.org/licenses/LICENSE-2.0"))
                );
    }
}

访问单服务接口文档


访问 Knife4j 的文档地址:http://ip:port/doc.html即可查看文档


系统服务 (youlai-system) 的接口文档地址 http://localhost:8800/doc.html ,访问页面如下:

2.pngSpring Cloud Gateway 网关聚合


参考 Knife4j 官方文档:Spring Cloud Gateway 网关聚合


Knife4j 官方提供 手动配置 和 服务发现 两种聚合方式,如果微服务数量少且有定制化文档需求建议 手动配置,否则一般还是推荐服务发现的方式,可以避免每次新增一个服务还得手动去添加配置的烦恼。


这里使用的是 服务发现 聚合方式,如果手动请参考官方配置(很详细)


pom.xml

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-gateway-spring-boot-starter</artifactId>
    <version>4.3.0</version>
</dependency>

application.yml

spring:
  cloud:
    gateway:
      discovery:
        locator:
          # 启用服务发现
          enabled: true
          lower-case-service-id: true
      # 网关路由
      routes:
        - id: 系统服务
          uri: lb://youlai-system
          predicates:
            - Path=/youlai-system/**
          filters:
            - StripPrefix=1 
# knife4j 网关聚合
knife4j:
  gateway:
    enabled: true
    # 指定服务发现的模式聚合微服务文档,并且是默认 default 分组
    strategy: discover
    discover:
      # OpenAPI 3.0 规范 
      version: openapi3
      enabled: true

访问网关聚合接口文档


访问 Knife4j 的文档地址:http://ip:port/doc.html即可查看文档


网关(youlai-gateway) 的接口文档地址 http://localhost:9999/doc.html ,访问页面如下图:

3.png

接口测试


接下来做一个 OAuth2 登录认证(Spring Authorization Server 扩展的 OAuth2 密码模式),认证成功拿到访问令牌(access_token) 去请求获取登录用户信息接口测试 。


认证成功之后,再去打开其他接口会请求头会自动携带访问令牌。


登录认证


点击接口文档左侧菜单栏 Authorize 打开认证页面,填写图示 OAuth2 密码模式授权认证参数

4.png

特别提醒: Knife4j 自动填充请求头前提需要数据原生返回,那么什么是原生数据格式?


  • ✔️原生数据格式
{
    "access_token": "eyJraWQiOiJlNTg1NTQ3MS02ZDlmLTRkOWEtODJlNi1mN2QyNjY4YjhhZDgiLCJhbGciOiJSUzI1NiJ9.xxx.xxx",
    "refresh_token": "oYQz7UA4jafCfYZN7BW1cX6Kn-QGxNf1XIxKp-xxx",
    "token_type": "Bearer",
    "expires_in": 86400
}

❌包装数据格式


自定义数据格式,像包含了业务码的,这种 Knife4j 是无法解析的,更没法去自动填充了

{
    "code": "00000",
    "data": {
        "access_token": "eyJraWQiOiJlNTg1NTQ3MS02ZDlmLTRkOWEtODJlNi1mN2QyNjY4YjhhZDgiLCJhbGciOiJSUzI1NiJ9.xxx.xxx",
        "refresh_token": "ImW57MWPEBQpcNpuPsX1l5eJCDtyoBMz-xxx",
        "token_type": "Bearer",
        "expires_in": 86400
    },
    "msg": "一切ok"
}

client 是代码中为测试接口预留的一个客户端ID,具体可以看下 MyAuthenticationSuccessHandler 这个类的处理

5.png

获取用户信息


认证成功之后,打开 获取登录用户信息 接口 ,点击请求头部可以看到访问令牌已经自动填充到请求头的 Authorization 参数中了。

6.png

点击发送,可以看到数据成功返回。

7.png

输入错误的访问令牌,提示 “token无效或已过期”,符合预期效果。

8.png

结语


这篇文章首先介绍了如何将 Spring Cloud 微服务与 Knife4j 4.3 集成,借助 Spring Cloud Gateway 网关聚合各个服务的接口文档,实现了更统一的管理方式。最后,我们还探讨了如何在整合后的接口文档中测试 Spring Authorization Server 扩展的 OAuth2 密码模式认证接口,一旦认证成功,Knife4j 会自动填充访问令牌,使您能够轻松地访问其他接口。


到此,youlai-mall 新版本接口文档的整合和调试教程结束。希望这篇文章对您有所帮助,能够帮助您避免在使用新版本时遇到各种问题。


源码

相关文章
|
9月前
|
存储 缓存 负载均衡
Gateway 网关坑我! 被这个404 问题折腾了一年?
小富分享了一个困扰团队一年多的 SpringCloud Gateway 路由 404 问题。通过日志追踪和源码分析,发现是网关在 Nacos 配置更新后未能正确清理旧的路由权重缓存,导致负载均衡时仍使用已删除的路由数据。最终通过监听路由刷新事件并手动更新缓存,成功解决了问题。
1241 125
Gateway 网关坑我! 被这个404 问题折腾了一年?
|
缓存 Java API
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
本文介绍了在Spring Boot中配置Swagger2的方法。通过创建一个配置类,添加`@Configuration`和`@EnableSwagger2`注解,使用Docket对象定义API文档的详细信息,包括标题、描述、版本和包路径等。配置完成后,访问`localhost:8080/swagger-ui.html`即可查看接口文档。文中还提示了可能因浏览器缓存导致的问题及解决方法。
1339 0
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
|
8月前
|
机器学习/深度学习 Kubernetes API
【Azure APIM】自建网关(self-host gateway)收集请求的Header和Body内容到日志中的办法
在Azure API Management中,通过配置trace策略可完整记录API请求的Header和Body信息。在Inbound和Outbound策略中分别使用context.Request/Response.Headers和Body.As&lt;string&gt;方法捕获数据,并写入Trace日志,便于排查与审计。
244 8
|
JSON Java API
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的使用
本文详细介绍了Swagger2的使用方法,包括在Spring Boot项目中的配置与应用。重点讲解了Swagger2中常用的注解,如实体类上的`@ApiModel`和`@ApiModelProperty`,Controller类上的`@Api`、`@ApiOperation`以及参数上的`@ApiParam`等。通过示例代码展示了如何为实体类和接口添加注解,并在页面上生成在线接口文档,实现接口测试。最后总结了Swagger的优势及其在项目开发中的重要性,提供了课程源代码下载链接供学习参考。
964 0
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的使用
|
Java Maven 微服务
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的 maven 依赖
在项目中使用Swagger2工具时,需导入Maven依赖。尽管官方最高版本为2.8.0,但其展示效果不够理想且稳定性欠佳。实际开发中常用2.2.2版本,因其稳定且界面友好。以下是围绕2.2.2版本的Maven依赖配置,包括`springfox-swagger2`和`springfox-swagger-ui`两个模块。
622 0
|
前端开发 Java API
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档—— Swagger 简介
第6课介绍了在Spring Boot中集成Swagger2以展示在线接口文档的方法。随着前后端分离架构的发展,API文档成为连接前端与后端开发的重要纽带。然而,代码更新频繁导致文档难以同步维护,Swagger2解决了这一问题。通过Swagger,在线API文档不仅方便了接口调用方查看和测试,还支持开发者实时测试接口数据。本文使用Swagger 2.2.2版本,讲解如何在Spring Boot项目中导入并配置Swagger2工具,从而高效管理接口文档。
454 0
|
10月前
|
安全 虚拟化
Omnissa Secure Email Gateway 2.33 - 电子邮件网关
Omnissa Secure Email Gateway 2.33 - 电子邮件网关
203 0
|
人工智能 API 开发者
狂揽7.5k星!这款开源API网关彻底解放开发者:一键聚合GPT-4、Suno、Midjourney,还能在线充值!
New API 是一款基于 One API 二次开发的 AI 模型接口管理与分发系统,支持多种大模型(如 GPT-4、Suno、Midjourney 等)统一封装为 OpenAI 格式接口调用。其核心功能包括多模型统一网关、企业级权限管控、“推理力度”分级、无魔法访问全球 AI 服务、灵活计费体系及开发者友好设计。技术架构采用 Golang + Gin 框架,支持高并发低延迟,适用于企业内部 AI 中台、多模型 SaaS 平台、学术研究协作及个人开发者工具等场景。项目开源地址:https://github.com/kingbug/new-api。
10625 10
|
前端开发 Java Nacos
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
本文介绍了如何使用Spring Cloud Alibaba 2023.0.0.0技术栈构建微服务网关,以应对微服务架构中流量治理与安全管控的复杂性。通过一个包含鉴权服务、文件服务和主服务的项目,详细讲解了网关的整合与功能开发。首先,通过统一路由配置,将所有请求集中到网关进行管理;其次,实现了限流防刷功能,防止恶意刷接口;最后,添加了登录鉴权机制,确保用户身份验证。整个过程结合Nacos注册中心,确保服务注册与配置管理的高效性。通过这些实践,帮助开发者更好地理解和应用微服务网关。
2461 0
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
|
人工智能 数据可视化 API
FastGPT 基于Higress 聚合 LLM 网关的最佳实践
本文介绍了Fast GPT的产品形态和设计理念,重点讨论了大模型的幻觉问题及其对应用落地的影响。Fast GPT通过结合工作流的强逻辑性和AI的理解能力,提升系统的稳定性和可靠性。文章还详细描述了Fast GPT的工作流节点、知识库管理及AI网关的功能,并展示了几个实际应用场景,如私人助手、图文生成和文档处理等。最后,探讨了如何通过引入云函数和Copilot简化代码编写,实现无代码编排的工作流解决方案,提升用户体验。