Spring Boot 升级3.x 指南
Spring Boot 升级3.x 指南
1. 升级思路
先创建一个parent项目,打包类型为pom,继承自spring boot的parent项目
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.x</version>
</parent>
然后把版本集中放在这个pom里面,示例如下
<properties><!-- 建议添加全局变量 java.version,maven.compiler.source, maven.compiler.target--><java.version>17</java.version><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><spring-cloud-dependencies.version>2022.0.4</spring-cloud-dependencies.version><spring-cloud-starter-netflix.version>2.2.10.RELEASE</spring-cloud-starter-netflix.version>
</properties>
然后添加dependencyManagement节点,示例如下:
<dependencyManagement> <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud-dependencies.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId><version>${spring-cloud-starter-netflix.version}</version><exclusions><exclusion><artifactId>jsr311-api</artifactId><groupId>javax.ws.rs</groupId></exclusion><exclusion><artifactId>jackson-annotations</artifactId><groupId>com.fasterxml.jackson.core</groupId></exclusion><exclusion><artifactId>jackson-core</artifactId><groupId>com.fasterxml.jackson.core</groupId></exclusion><exclusion><artifactId>jackson-databind</artifactId><groupId>com.fasterxml.jackson.core</groupId></exclusion><exclusion><artifactId>guava</artifactId><groupId>com.google.guava</groupId></exclusion></exclusions></dependency><dependencies>
</dependencyManagement>
其它服务都继承这个pom文件,这样各个组件的版本就能统一起来了,将来如果某个组件要升级,直接升级这个项目的版本,其它的重新打包发布即可。
注意:
- 动手前一定要调研项目中使用的组件,某些组件是没法升级的。比如ElasticSearch,驱动版本和ElasticSearch server版本要一致,升级了就会报错。其它常见组件的有Nacos,Kafka,Mysql,RocketMQ,需要调研是否兼容低版本。
- 如果之前使用了Zuul 1.x作为Gateway,Zuul 2.x不开源并且难以升级,建议升级到Spring Cloud Gateway
- 如果使用了Zuul1.x的作为Proxy嵌入服务中,有两个思路,一个是使用Filter+HttpClient手动写转发代码,第二个思路是调研调用接口,使用Feign做转发
- Spring Boot 3.x 需要JDK17,建议使用OpenJDK17,Oracle的JDK17可能存在授权问题
2. 遇到的问题
-
Zuul1.x 升级Spring Cloud Gateway,可以参考 (Zuul迁移至Spring Cloud Gateway踩坑记录)[https://blog.csdn.net/codeblf2/article/details/128093298] ,此记录中服务使用的是k8s部署,转发直接配置uri,如果使用的是Nacos,网络上博客比较多,这里不再赘述。
-
如果是Spring Boot 1.x升级上来的,可能要注意循环依赖,添加以下可以解决:
spring:main:allow-circular-references: true -
Spring Boot 3.x 支持优雅退出,添加以下配置开启
# 打开优雅退出 server:shutdown: graceful # 多长时间后强制杀掉进程 spring:lifecycle:timeout-per-shutdown-phase: 30s -
Beancopier可能没法用了,可以使用BeanUtil.copyProperties替换 -
JDK8升级到JDK17,javax包变成了jakarta,需要替换所有的javax.annotation和javax.validation等,但javax.mail没有变,当jakarta.xxx不存在时,还是使用javax.xxx即可
-
如果引入外部配置文件,使用
spring.cloud.bootstrap.additional-location=/data/config/bootstrap.yml,/data/config/bootstrap2.yml即可 -
如果依赖的一些jar中依赖一些类但由于升级,依赖类已经不存在了,典型的就是
WebMvcConfigurerAdapter.class,之前是继承WebMvcConfigurerAdapter,Spring Boot 3.x 已经改成了实现接口WebMvcConfigurer,可能会出现FileNotFoundException,此时可能难以定位是哪个jar,参考SpringBoot版本升级引起的FileNotFoundException——WebMvcConfigurerAdapter.class -
Spring Cloud Gateway 配置文件参考(可能遇到的问题已经写在了注释中):
spring:cloud:gateway:# 默认过滤器default-filters:# 将path中第一个/xxx去掉 比如请求是 https://www.xxx.com/a/b/c?d=1# 经过这个过滤器之后就是 https://www.xxx.com/b/c?d=1- StripPrefix=1# 下面这两个过滤器是gateway和后面的服务都配置了跨域头,防止返同样的回头有多个导致跨域失败# 典型的 access-control-allow-credentials: true,true 返回到前端导致跨域失败- DedupeResponseHeader=access-control-allow-credentials,RETAIN_UNIQUE- DedupeResponseHeader=access-control-allow-origin,RETAIN_UNIQUEroutes:# 服务名- id: user# 转发到的url 下面的示例是k8s内部转发# 如果使用服务名转发 开头应该是lb:xxx# 这个端口后不要加任何东西 因为转发的时候会忽略掉# 比如 http://service-user.inner:8080/aaa最后拼接出来是http://service-user.inner:8080,/aaa就忽略了uri: http://service-user.inner:8080predicates:# 匹配的请求url中的path 下面这个会匹配到 http://www.xxx.com/gateway/user/login?userName=AAA- Path=/gateway/user/**filters:# StripPrefix:去除原始请求路径中的前1级路径# 会把 http://www.xxx.com/gateway/service1/login中的service1去掉- StripPrefix=1# 在转发后的url添加的前缀 经过这个filter 转发url就变成了 http://service-user.inner:8080/service-user- PrefixPath=/service-user# 这里讲一下全流程# 以请求为 http://www.xxx.com/gateway/user/login?userName=AAA为例 这个url是要登录,登录服务名为service-user# 断言规则 spring.cloud.routes > predicates > Path=/gateway/user/** 能匹配到url http://www.xxx.com/gateway/user/login?userName=AAA# 第一步是默认过滤器 经过 spring.cloud.gateway.default-filters > StripPrefix=1 这个配置后就变成了 http://www.xxx.com/user/login?userName=AAA# 第二步是routers过滤器 spring.cloud.routes下的id=user的 filters > StripPrefix=1会将 http://www.xxx.com/user/login?userName=AAA的/user去掉,变成了 http://www.xxx.com/login?userName=AAA 变成# 第三步是routers过滤器 spring.cloud.routes下的id=user的 filters > PrefixPath=/service-user 会将 http://www.xxx.com/login?userName=AAA 变成 http://service-user.inner:8080/service-user服务/login?userName=AAA# 经过上面的处理后,最终会转发到 service-user服务# response中的header如果有跨域header 会经过 spring.cloud.gateway.default-filters > DedupeResponseHeader过滤器将重复的header去掉
相关文章:
Spring Boot 升级3.x 指南
Spring Boot 升级3.x 指南 1. 升级思路 先创建一个parent项目,打包类型为pom,继承自spring boot的parent项目 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId&…...
使用支付宝的沙箱环境在本地配置模拟支付并发布至公网调试
文章目录 前言1. 下载当面付demo2. 修改配置文件3. 打包成web服务4. 局域网测试5. 内网穿透6. 测试公网访问7. 配置二级子域名8. 测试使用固定二级子域名访问9. 结语 前言 在沙箱环境调试支付SDK的时候,往往沙箱环境部署在本地,局限性大,在沙…...
python-opencv划痕检测
python-opencv划痕检测 这次实验,我们将对如下图片进行划痕检测,其实这个比较有难度,因为清晰度太差了。 我们做法如下: (1)读取图像为灰度图像,进行自适应直方图均衡化处理,增强图…...
微服务学习|Gateway网关:网关作用、快速入门、路由断言工厂、路由过滤器配置、全局过滤器、过滤器执行顺序、跨域问题处理
为什么需要网关 网关功能: 1.身份认证和权限校验 2.服务路由、负载均衡 3.请求限流 网关的技术实现 在SpringCloud中网关的实现包括两种:gateway、zuul Zuul是基于Servlet的实现,属于阻塞式编程。而SprinaCloudGateway则是基于Spring5中提供的WebFlux…...
七、通过libfdk_aac编解码器实现aac音频和pcm的编解码
前言 测试环境: ffmpeg的4.3.2自行编译版本windows环境qt5.12 AAC编码是MP3格式的后继产品,通常在相同的比特率下可以获得比MP3更高的声音质量,是iPhone、iPod、iPad、iTunes的标准音频格式。 AAC相较于MP3的改进包含: 更多的采…...
spring 是如何开启事务的, 核心原理是什么
文章目录 spring 是如何开启事务的核心原理1 基于注解开启事务2 基于代码来开启事务 spring 是如何开启事务的 核心原理 Spring事务管理的实现有许多细节,如果对整个接口框架有个大体了解会非常有利于我们理解事务,下面通过讲解Spring的事务接口来了解…...
头歌——操作系统实训总结
死锁 1、系统出现死锁时一定同时保持了四个必要条件,对资源采用按序分配算法后可破坏的条件是(A)。 A、循环等待条件B、互斥条件C、占有并等待条件D、不可抢占条件 2、资源的静态分配算法在解决死锁问题中是用于(B)。 …...
Django自动生成docs接口文档
1.创建Django项目 python manage.py startproject django20252.创建子应用 python manage.py startapp api3.安装依赖包 pip install coreapi4.创建urls.py from django.contrib import admin from django.urls import path, include from rest_framework import routers f…...
Mock 数据
1. Mock 数据的方式 2. json-server 实现 Mock 数据 项目中安装json-server npm i -D json-server准备一个json文件添加启动命令 //package.json"scripts": {"start": "craco start","build": "craco build","test&q…...
(三)C语言之for语句概述
(三)C语言之for语句概述 一、使用for语句实现打印华氏温度与摄氏温度转换二、for语句概述三、练习 一、使用for语句实现打印华氏温度与摄氏温度转换 #include <stdio.h> /*当华氏温度为 0,20,40,...300时,打印出华氏温度与摄氏温度对照…...
OpenLDAP配置web管理界面PhpLDAPAdmin服务-centos9stream
之前已经发了一篇关于centos9下面配置openldap多主高可用集群的内容,不会配置ldap集群的请参考:服务器集群配置LDAP统一认证高可用集群(配置tsl安全链接)-centos9stream-openldap2.6.2-CSDN博客 这里跟着前篇文章详细说明如何配置…...
深兰科技多款大模型技术产品登上新闻联播!
11月20日晚,新闻联播报道了2023中国5G工业互联网大会,深兰科技metamind、汉境大型城市智能体空间等大模型技术和产品在众多参展产品中脱颖而出,被重点播报。 2023中国5G工业互联网大会 本届大会由工信部和湖北省人民政府联合主办,…...
移远通信推出六款新型天线,为物联网客户带来更丰富的产品选择
近日,移远通信重磅推出六款新型天线,覆盖5G、非地面网络(NTN)等多种新技术,将为物联网终端等产品带来全新功能和更强大的连接性能。 移远通信COO张栋表示:“当前,物联网应用除了需要高性能的天线…...
八、ffmpeg录制视频为yuv文件
前言 测试环境: ffmpeg的4.3.2自行编译版本windows环境qt5.12 图片的一些重要知识: RGB图片 位深度:每一个像素都会使用n个二进制位来存储颜色信息。每一个像素的颜色都是由红(Red)、绿(Green࿰…...
Rust并发编程:理解线程与并发
大家好!我是lincyang。 今天我们来深入探讨Rust中的并发编程,特别是线程的使用和并发的基本概念。 Rust中的线程 Rust使用线程来实现并发。线程是操作系统可以同时运行的最小指令集。在Rust中,创建线程非常简单,但与此同时&…...
二次开发问题汇总【C#】
1未将对象引用到实例。 接口函数的参数不对。解决办法【用fixed去限制数组长度】 unsafe public struct VCI_BOARD_INFO {public UInt16 hw_Version;public UInt16 fw_Version;public UInt16 dr_Version;public UInt16 in_Version;public UInt16 irq_Num;public byte can_Num;…...
中职组网络安全B模块-渗透提权2
任务五:渗透提权2 任务环境说明: 仅能获取xxx的IP地址 用户名:test,密码:...
【考研】数据结构(更新到循环链表)
声明:所有代码都可以运行,可以直接粘贴运行(只有库函数没有声明) 线性表的定义和基本操作 基本操作 定义 静态: #include<stdio.h> #include<stdlib.h>#define MaxSize 10//静态 typedef struct{int d…...
DB2—03(DB2中常见基础操作)
DB2—03(DB2中常见基础操作) 1. 前言1.1 oracle和mysql相关 2. db2中的"dual"2.1 SYSIBM.SYSDUMMY12.2 使用VALUES2.3 SYSIBM.SYSDUMMY1 "变" dual 3. db2中常用函数3.1 nvl()、value()、COALESCE()3.2 NULLIF() 函数3.3 LISTAGG() …...
华为云cce健康检查有什么用?配置需要注意什么?
华为云cce健康检查 如上图,华为云健康检查可用来探测cce的实例运行状态,必要时cce会自动重启实例,达到cce持续服务。 但是配置时需要注意一下几个方面,否则cce的状态总是有些不正常。 1、http探查比较友好。因为我们的在cce里面…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
