spring boot 3.3.4 网关(gateway) 集成knife4j 4.4.0

spring boot版本 3.3.4,jdk 22, springcloud 2023.0.3

官方参考链接 

Spring Cloud Gateway网关聚合 | Knife4j (xiaominfo.com)

springboot版本信息

<properties> <java.version>22</java.version> <spring-cloud.version>2023.0.3</spring-cloud.version> 
</properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.4</version><relativePath/>
</parent>

一、网关集成 knife4j 4.4.0

<dependency>  这是网关的maven坐标,它不用spring boot自带的tomcat<groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-gateway-spring-boot-starter</artifactId><version>4.4.0</version>
</dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.4.0</version>
</dependency>

网关的核心配置

server:port: 9101servlet:context-path: /
spring:main:web-application-type: reactive #不使用tomcat的配置,与gateway无关application:name: GatewayAppcloud:gateway:#保证通过网关能访问子服务的配置 这个与gateway无关,主要是fegin调用使用routes:- id: ServiceApp9100 #你的子服务uri: http://localhost:9100predicates:- Path=/service/**   # service子服务的context-path值- id: PortalApp9099  #你的子服务uri: http://localhost:9099predicates:- Path=/protal/**eureka: # 配置确认通过网关可以从eureka调用到子服务instance:lease-expiration-duration-in-seconds: 30lease-renewal-interval-in-seconds: 10hostname: localhost     #服务主机名称prefer-ip-address: true #是否优先使用ip来作为主机名client:register-with-eureka: true #注册到Eureka的注册中心fetch-registry: true #获取注册实例列表enabled: true # 启用eureka客户端registry-fetch-interval-seconds: 30 #定义去eureka服务端获取服务列表的时间间隔healthcheck:enabled: trueservice-url:defaultZone: http://localhost:9098/eureka/ #eureka服务的地址knife4j:          #这里是重点gateway:# 开起网关聚合文档enabled: true# 网关前缀(如nginx配置的代理前缀) 默认:/api-path-prefix: /# 使用的UI版本(v2或者v3) 默认: v3version: v3# 指定服务发现的模式聚合微服务文档,并且是默认 default 分组strategy: discover# 服务发现discover:# OpenAPI 3.0 规范version: openapi3# 开启服务发现 默认:trueenabled: true# 默认排序 默认:0default-order: 0# 排除的服务名 默认:为空(建议排除网关服务)excluded-services: ${spring.application.name}routes:# 子服务分组名称#子服务的服务名跟你的子服务名字一样就行 一般用servlet.context-path的值- name: service#这里很重要 必须有【service】,否则访问的是ip:port/v3/apidocs,报404#官网在这里根本没有解释,估计官网写文档的认为开发都是高手,没有多余的交代#service漏写很痛苦,各种尝试,各种jar包替换,没有过多的交代,导致开发者填坑url: 'service/v3/api-docs'# context-pathcontext-path: '/service'# 服务名service-name: service# 排序order: 1

上面的配置完,就能启动网关服务访问,前提是子服务也得集成结束(参见下文 “二、子服务集成”),要不然会报错

http://127.0.0.1:9101/doc.html  网关服务的访问地址/doc.html

高版本就是引入maven坐标,添加配置,启动项目就行,不用做任何配置类操作。

补充一点关于上面的访问链接 浏览器控制台404问题

源代码中 这个访问路径

knife4j:
  gateway:
    enabled: true   #配置文件有这个就行

新增了两个maven坐标,原因是网关gateway排除了springboot自带的Tomcat包

<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope>
</dependency>
<dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId>
</dependency>

网关增加的配置类,目的是在网关访问时处理一下访问的路径,主要原因是它可能出现了

http://ip:port//xxx     /这里是空/     这种情况导致404,启动成功能正常访问,可以将这个配置类伤处试试,莫名其妙的也正常了。

import jakarta.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.RegExUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.util.Strings;
import org.springdoc.core.properties.SpringDocConfigProperties;
import org.springdoc.core.properties.SwaggerUiConfigParameters;
import org.springdoc.core.properties.SwaggerUiConfigProperties;
import org.springdoc.core.properties.SwaggerUiOAuthProperties;
import org.springdoc.core.providers.ObjectMapperProvider;
import org.springdoc.webmvc.core.configuration.SpringDocWebMvcConfiguration;
import org.springdoc.webmvc.ui.SwaggerIndexPageTransformer;
import org.springdoc.webmvc.ui.SwaggerWelcomeCommon;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.web.servlet.resource.ResourceTransformerChain;import java.io.IOException;
import java.util.Optional;@Configuration
@ConditionalOnClass(SpringDocWebMvcConfiguration.class)
public class SwaggerConfiguration {/*** 重写swagger地址,通过浏览器访问/swagger-ui/index.html时,html页面会请求/v3/api-docs和/v3/api-docs/swagger-config* 1)本地(localhost)访问时,能正常返回* 2)会出现404,因为访问的地址少了服务名:* 比如应该是“http://host:port/服务名/v3/api-docs”,但实际访问的是“http://host:port//v3/api-docs”*/public class RewritePathSwaggerIndexPageTransformer extends SwaggerIndexPageTransformer {private SpringDocConfigProperties springDocConfigProperties;private SwaggerUiConfigParameters swaggerUiConfigParameters;/*** 上一次请求获取到的前缀*/private String lastPrefix = Strings.EMPTY;public RewritePathSwaggerIndexPageTransformer(SwaggerUiConfigProperties swaggerUiConfig,SwaggerUiOAuthProperties swaggerUiOAuthProperties, SwaggerUiConfigParameters swaggerUiConfigParameters,SwaggerWelcomeCommon swaggerWelcomeCommon, ObjectMapperProvider objectMapperProvider,SpringDocConfigProperties springDocConfigProperties) {super(swaggerUiConfig, swaggerUiOAuthProperties, swaggerUiConfigParameters, swaggerWelcomeCommon,objectMapperProvider);this.springDocConfigProperties = springDocConfigProperties;this.swaggerUiConfigParameters = swaggerUiConfigParameters;}@Overridepublic Resource transform(HttpServletRequest request, Resource resource,ResourceTransformerChain transformerChain) throws IOException {SpringDocConfigProperties.ApiDocs apiDocs = springDocConfigProperties.getApiDocs();String apiDocsPath = apiDocs.getPath();String configUrl = swaggerUiConfigParameters.getConfigUrl();String prefix = getPrefix(request);// 考虑同一个服务,可能有时候会被“走网关访问”,有时候会被“走IP+端口直接访问”,所以这里做了区分判断// 通过网关转发if (StringUtils.isNotBlank(prefix)) {// 上一次不是通过网关转发,即需要重新调整;如果上一次是通过网关转发,则不能调整,否则就叠加两次了if (!StringUtils.equals(lastPrefix, prefix)) {String newApiDocsPath = prefix + apiDocsPath;apiDocs.setPath(newApiDocsPath);String newConfigUrl = RegExUtils.replaceFirst(configUrl, apiDocsPath, newApiDocsPath);swaggerUiConfigParameters.setConfigUrl(newConfigUrl);lastPrefix = prefix;}} else {// 不是通过网关转发// 上一次是通过网关转发,即需要重新调整if (!StringUtils.equals(lastPrefix, prefix)) {// 去掉转发时,网关添加的路径String newApiDocsPath = RegExUtils.replaceFirst(apiDocsPath, lastPrefix, "");apiDocs.setPath(newApiDocsPath);String newConfigUrl = RegExUtils.replaceFirst(configUrl, apiDocsPath, newApiDocsPath);swaggerUiConfigParameters.setConfigUrl(newConfigUrl);lastPrefix = prefix;}}return super.transform(request, resource, transformerChain);}/*** 获取网关转发时,url上添加的前缀*/public String getPrefix(HttpServletRequest request) {// 获取网关转发的服务名return Optional.ofNullable(request.getHeader("x-forwarded-prefix")).orElse(Strings.EMPTY);}}
}

二、子服务集成

前提是子服务已经和eureka作好集成,通过网关能访问到子服务的api

maven坐标

<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.4.0</version>
</dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version>
</dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope>
</dependency>

配置文件中的配置,可能有些多余的,目前没有排除

server:port: 9100servlet:context-path: /service
springdoc:swagger-ui:path: /swagger-ui.htmltags-sorter: alphaoperations-sorter: alphaapi-docs:path: /v3/api-docsgroup-configs:- group: 'service'paths-to-match: '/**'packages-to-scan: 'com.xxx.xxxx' #你的包路径,比如com.xxx.xxx.controller
# knife4j的增强配置,不需要增强可以不配
knife4j:enable: truesetting:language: zh-CN

启动子服务就行,确保子服务自己的knife4j能访问到

至此集成完成。不需要任何配置类编写,就是引入maven坐标,整理好配置文件,启动类头上不需要任何关于knife4j的注解。

注意:如果eureka有Security管理,记得放开下面路径,没有引入Security应该不用管

/*** 配置要忽略的路径  这个在eureka项目的启动类中加就行*/
@Bean
WebSecurityCustomizer webSecurityCustomizer() {// 忽略 /error /eureka/**return web -> web.ignoring().requestMatchers("/error","/eureka/**","/swagger-ui.html","/webjars/**","/swagger-resources/**","/v2/*","/doc.html","/service/v3/api-docs","/v3/api-docs/swagger-config");
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件企业选择第三方软件检测机构有哪些好处?

在软件开发的当今时代&#xff0c;确保软件的质量和性能是每个企业面临的挑战&#xff0c;因此软件检测公正必不可少。随着市场的需求&#xff0c;越来越多企业会选择将该项工作交由第三方软件检测机构进行。第三方软件检测机构指独立于软件开发方和需求方的第三方机构&#xf…

Java基于SSM微信小程序物流仓库管理系统设计与实现(源码+lw+数据库+讲解等)

选题背景 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

EMCMO--多任务优化求解约束多目标问题

EMCMO–多任务优化求解约束多目标问题 title&#xff1a; An Evolutionary Multitasking Optimization Framework for Constrained Multi-objective Optimization Problems author&#xff1a; Kangjia Qiao, Kunjie Yu, BoyangQu, Jing Liang, Hui Song, and Caitong Yue. …

C++基础补充(03)C++20 的 std::format 函数

文章目录 1. 使用C20 std::format2. 基本用法3. 格式说明 1. 使用C20 std::format 需要将VisualStudio默认的标准修改为C20 菜单“项目”-“项目属性”&#xff0c;打开如下对话框 代码中加入头文件 2. 基本用法 通过占位符{}制定格式化的位置&#xff0c;后面传入变量 #…

rk3588 opencv 的使用

-------------------------------------------------------------------------------------------------------- 目前是 3588 上无法 直接编译出 C程序。 报错如下&#xff1a; -----------------------------------------------------------------------------------------…

82.【C语言】数据结构之顺序表的初始化和销毁

目录 1.线性表 2.分类 1.静态顺序表&#xff1a;使用定长数组存储元素 代码示例(写入Seqlist.h中) 2.动态顺序表:使用与动态内存管理有关的函数 代码示例(写入Seqlist.h中) 补:数据管理的四个需求:增改删查 3.操作顺序表 1.初始化顺序表 1.不开辟空间 2.开辟空间 1…

无人机之三维航迹规划篇

一、基本原理 飞行环境建模&#xff1a;在三维航迹规划中&#xff0c;首先需要对飞行环境进行建模。这包括对地形、障碍物、气象等因素进行准确的测量和分析&#xff0c;以获得可行的飞行路径。 飞行任务需求分析&#xff1a;根据无人机的任务需求&#xff0c;确定航迹规划的…

分布式篇(分布式事务)(持续更新迭代)

一、事务 1. 什么是事务 2. 事务目的 3. 事务的流程 4. 事务四大特性 原子性&#xff08;Atomicity&#xff09; 一致性&#xff08;Consistency&#xff09; 持久性&#xff08;Durability&#xff09; 隔离性&#xff08;Isolation&#xff09; 5. MySQL VS Oracle …

汇总10个AI免费一键生成PPT的网站

一、前言 PPT幻灯片是现代办公和学习中的重要组成部分。它在工作、研究或培训中扮演着重要角色&#xff0c;并能够让观众更好地理解信息。随着当今人工智能技术的快速发展&#xff0c;现在有很多免费的AI PPT生成器可供选择&#xff0c;帮助用户更加便捷地制作出高效且具有较强…

基于SpringBoot+Vue+uniapp微信小程序的宿舍报修系统的详细设计和实现

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

Qt获取磁盘信息+表格显示

效果展示 主要代码 获取磁盘相关数据 获取磁盘数据 Qt 没有提供相关的接口&#xff0c;需要使用 Windows API。接口解释如下&#xff1a; BOOL GetDiskFreeSpaceExW([in, optional] LPCWSTR lpDirectoryName,[out, optional] PULARGE_INTEGER lpFreeBytesAvailable…

GPIO口的学习

推挽输出 用它去控制一个mos管&#xff0c;当输出高电平时电流这样流出去&#xff0c;给外面的这颗mos管的栅极充电&#xff0c;所以这个过程称为推把电流推出去 然后当IO口输出低电平时电流这样流进来,给外面的这颗mos管的栅极放电,那这就是挽&#xff0c;把电流挽回来,所以所…

【汇编语言】寄存器(内存访问)(七)—— CPU提供的栈机制

文章目录 前言1. CPU提供的栈机制2. push指令3. 问题4. 问题的分析与解答5. pop指令结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但仅仅从课程的角度出发就太片面了&#xff0c;其实学习汇编语言可以深…

fmql之Linux Uart

正点原子第48章。 串口收发测试 正点原子教程 RS232和RS485的串口收发测试是一样的。 // 设置串口波特率为115200 stty -F /dev/ttyPS1 ispeed 115200 ospeed 115200 cs8// 发送字符串 echo "www.openedv.com" >/dev/ttyPS1// 接收数据 cat /dev/ttyPS1 fmql测…

强烈推荐Kafka动画入门概念的3个讲座

强烈推荐Kafka动画入门概念的3个讲座&#xff0c;3个都是动画讲解&#xff0c;十分不错&#xff0c; 1、主题、偏移量和分区 ~ Kafka核心概念(Part1) 地址&#xff1a;主题、偏移量和分区 ~ Kafka核心概念(Part1)_哔哩哔哩_bilibili 2、偏移量提交、重平衡和消费者组 ~ Kafka核…

C Primer Plus 第9章——第一篇

你该逆袭了 文章目录 一、复习函数1、定义带形式参数的函数2、声明带形式参数函数的原型3、使用 return 从函数中返回值&#xff08;1&#xff09;、返回值不仅可以赋给变量&#xff0c;也可以被用作表达式的一部分。&#xff08;2&#xff09;、返回值不一定是变量的值&#x…

【Linux】进程池

目录 进程池 进程池的概念&#xff1a; 手搓进程池&#xff1a; 1、创建信道和子进程 2、通过channel控制子进程 3、回收管道和子进程 进程池 进程池的概念&#xff1a; 定义一个池子&#xff0c;在里面放上固定数量的进程&#xff0c;有需求来了&#xff0c;就拿一个池中…

微信小程序考试系统(lw+演示+源码+运行)

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了微信小程序考试系统的开发全过程。通过分析微信小程序考试系统管理的不足&#xff0c;创建了一个计算机管理微信小程序考试系统的方案。文章介绍了微信小程序考…

Leetcode 二叉搜索树的第 K 个元素

复习一下二叉搜索树 二叉搜索树 (Binary Search Tree, 简称 BST) 是一种特殊的二叉树(可以为空)&#xff0c;其中每个节点都有一个值&#xff0c;并且满足以下特点&#xff1a; 定义&#xff1a; 左子树节点的值小于根节点的值&#xff1a;对于每个节点&#xff0c;左子树中所…

力扣66~70题

题66&#xff08;简单&#xff09;&#xff1a; python代码&#xff1a; class Solution:def plusOne(self, digits: List[int]) -> List[int]:s_str.join([str(i) for i in digits])nstr(int(s_str)1)n_strlist(n)res[int(i) for i in n_str]return res题67&#xff08;简…