Spring Cloud Gateway + Knife4j 4.3 接口文档整合和网关聚合

news2024/9/28 1:30:09

目录

    • 前言
    • Spring Cloud 整合 Knife4j
      • pom.xml
      • application.yml
      • SwaggerConfig.java
      • 访问单服务接口文档
    • Spring Cloud Gateway 网关聚合
      • pom.xml
      • application.yml
      • 访问网关聚合接口文档
    • 接口测试
      • **登录认证**
      • 获取登录用户信息
    • 结语
    • 源码

前言

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 ,访问页面如下:

Spring 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 ,访问页面如下图:

接口测试

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

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

登录认证

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

image-20231027164838095

💡 特别提醒: 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 这个类的处理

获取登录用户信息

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

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

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

结语

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

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

源码

GithubGitee
开源组织有来开源组织有来开源组织
后端youlai-mall 📖youlai-mall 📖
前端mall-admin🌎mall-admin 🌎
移动端mall-app 🌎mall-app 🌎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1140750.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库SqlServer笔试题

数据库SqlServer笔试题 一、数据库基础知识&#xff08;通用&#xff09;篇 1.说说主键、外键、超键、候选键 超键&#xff1a;在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键&#xff0c;多个属 性组合在一起也可以作为一个超键。超键包含…

CSGO游戏搬砖的10个冷知识,90%的人还不知道

敲黑板了&#xff0c;同学们&#xff0c;很多人号一多就蒙圈&#xff0c;接下来解释一下buff号、Steam号、选品软件、识别码&#xff0c;桌面令牌&#xff0c;手机令牌&#xff0c;几者的关系: 1、前期一套实名只能绑定两个buff号&#xff0c;steam账号无需实名&#xff0c;后期…

安装和配置Maven,IDEA中配置Maven

一、安装 Maven 首先创建一个空的文件夹&#xff0c;文件夹不能是中文或者其他特殊字符&#xff0c;然后将maven文件解压到这个空的文件夹 解压 二、配置环境变量 电脑右键 高级系统设置 输入以下内容 编辑好之后一直点击确定 验证是否安装成功&#xff0c;winR输入cmd进入命令…

docker 部署 若依 Ruoyi springboot+vue分离版

本篇从已有虚拟机/服务器 安装好dokcer为基础开始讲解 1.部署mysql 创建conf data init三个文件夹 conf目录存放在mysql配置文件 init目录存放着若依数据库sql文件&#xff08;从navicat导出的并非若依框架自带sql&#xff09; 创建一个属于本次若依部署的网段&#xff08;只…

nc65单据穿透

nc65单据穿透 jych项目 1.支出合同台账合同号字段可以穿透到对应的单据上 一个合同号穿透到一个物质设备采购合同上 1.支出合同台账单据模板合同号字段卡片下和列表下高级属性勾选是否超链接 2.支出合同台账中增加监听类 HeadItemLinkListener.java package nc.ui.jych.…

如何处理 Python 报错 can‘t multiply sequence by non-int of type float

大多数时候&#xff0c;当你在编程时遇到错误&#xff0c;你可以在错误信息中发现错误发生的原因以及如何解决它。 Python 错误 “TypeError: can’t multiply sequence by non-int of type float” 也不例外。 我准备了这篇文章&#xff0c;向你展示这个错误发生的原因以及如…

目标检测及锚框、IoU

1. 目标检测 物体检测&#xff08;目标检测&#xff09;是计算机视觉和数字图像处理的热门方向&#xff0c;意在判断一幅图像上是否存在感兴趣物体&#xff0c;并给出物体分类及位置等&#xff08;What and Where&#xff09;。本文主要进行物体检测研究背景、发展脉络、相关算…

MySQL的概念和sql语句

数据库的概念 数据库的概念&#xff1a;数据库是用来组织&#xff08;各个数据之间是有关联&#xff0c;是按规则组织起来的&#xff09;&#xff0c;存储和管理&#xff08;增&#xff0c;删&#xff0c;改&#xff0c;查&#xff09;的仓库 数据库管理系统&#xff08;DBMS&…

写保护设置——三、I2C EEPROM

三、I2C EEPROM I2C通讯的EEPROM只有硬保护&#xff0c;没有软保护。 以AT24C01A/02/04/16型EEPROM和AT24C02A/04A/08A/16A型EEPROM为例&#xff0c;管脚定义和写保护WP功能分别如下。 &#xff08;1&#xff09;AT24C01A/02/04/16型EEPROM 规格书&#xff1a; AT24C01A/02…

软件测试行情不好,我还是啃下了27K的offer

o “会代码吗&#xff1f;” o “会&#xff0c;Java、Python我都会一些&#xff01;” o “有没有用代码开发过一些测试工具平台呢&#xff1f;” o “额。。。这个。。。没做过。。。” o “那你回去等消息吧” 软件测试行业发展到今天&#xff0c;测试人员会代码&#x…

Jtti:Apache服务的反向代理及负载均衡怎么配置

配置Apache服务的反向代理和负载均衡可以帮助您分散负载并提高应用程序的可用性和性能。下面是一些通用的步骤&#xff0c;以配置Apache反向代理和负载均衡。 1. 安装和配置Apache&#xff1a; 确保您已经安装了Apache HTTP服务器。通常&#xff0c;Apache的配置文件位于/etc…

城中村智能水电表改造,提升居民生活品质

随着我国城市化进程的加快&#xff0c;城中村成为了城市发展的焦点。然而&#xff0c;由于历史原因&#xff0c;城中村的水电设施普遍存在老化、破损等问题&#xff0c;给居民生活带来诸多不便。为了提升城中村居民的生活品质&#xff0c;智能水电表的推广和改造已成为当务之急…

css:button实现el-radio效果

先看最终效果&#xff1a; ​​​ 思路&#xff1a; 一、 首先准备好按钮内容&#xff1a;const a [one,two,three] 将按钮循环展示出来&#xff0c;并设置一些样式&#xff0c;将按钮背景透明&#xff1a; <button v-for"(item,index) in a" :key"in…

创造健康、造福一方,强强联合共筑新疆妇幼健康梦

改善优生优育全程服务&#xff0c;提供优质生育全程医疗保健服务&#xff0c;强化孕前优生健康检查、产前筛查以及不孕不育诊治服务等&#xff0c;是国家《“十四五”国民健康规划》的重要内容。为向全疆群众提供国内一流的妇幼保健诊疗服务&#xff0c;满足群众“生的出、生的…

【威联通】共享文件夹设置

1. 前期准备 下载 QNAPQsyncClient 然后安装此软件&#xff0c;安装的目标文件夹可以更换到其他盘&#xff0c;如下图所示 点击 确定 点击 完成 弹出框中选择 中国 然后点击 套用 点击 跳过 点击 完成 勾选方框&#xff0c;然后点击 确定 第一个框中输入需要同步的 NAS IP 地址…

MFA-Conformer

基于多尺度特征聚合Conformer说话人识别模型的创新与应用 论文&#xff1a;https://arxiv.org/abs/2203.15249 代码&#xff1a;GitHub - zyzisyz/mfa_conformer 收录于 INTERSPEECH 2022 1. 简介 本文由清华大学与腾讯科技&#xff08;北京&#xff09;有限公司、台湾大学…

Android intent的一些小使用

目录&#xff1a; 1. Test5.java2. activity_main5.xml3. Empty.java (这个是用来带参数打开Activity按钮用的)4. activity_empty.xml5. 总结 一些基本的问题就不进行说明了&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; // 最后的隐形intent和带返回值没有解决…

2023最新短剧小程序搭建,短剧分销系统功能介绍

#短剧小程序# 基础功能最近新增功能 1.对接流量主变现 2.影视作品观看 3.支持创作者入驻 4.PC独立后台管理 5.壁纸&#xff0c;表情包下载 6.内容管理分类&#xff0c;专题分类 7.可单次付费或月会员 8.会员开通与支付功能 9.微信端使用 10.后台数据清晰明了 11.可定制搭建 新…

安装Redis使用make命令报异常

报错信息如下&#xff1a; 解决方案&#xff1a; 安装 gcc yum install gcc-c -y清空编译失败残留文件&#xff1a; make distclean使用 make 命令进行编译&#xff1a; make -j 2 PREFIX/usr/local/redis install

JAVA实现生活废品回收系统 开源

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容三、界面展示3.1 登录注册3.2 资源类型&资源品类模块3.3 回收机构模块3.4 资源求购/出售/交易单模块3.5 客服咨询模块 四、免责说明 一、摘要 1.1 项目介绍 生活废品回收系统是可持续发展的解决方案&#xff0c;旨在鼓…