加速 Spring Boot 3.3 迁移

在这里插入图片描述

1. 关键要点

  • 为什么你应该升级你的服务
  • 迁移到 Spring Boot 3.3 时需要更新的内容
  • OpenRewrite 如何帮助使升级更轻松、更快捷

2. 前言

现在Spring Boot 已经到了3.3,但是你在哪里?在过去的 3.x 版本更新中,我们看到了许多新功能,包括使用新的 Java
语言功能的能力、增强的可观察性、更好地支持使用 Graal 进行本机编译以及对虚拟线程的支持。

然而,对于许多人来说,升级到最新版本似乎非常困难,尤其是从旧 2.x 版本升级而来的人。毕竟,除了 Spring 之外,还有很多东西需要更新,例如 Java 版本迁移到 Jakarta EE 9。而且您的组织中可能运行着各种依赖项的许多不同版本,这使得迁移任务更加困难。

继续阅读以了解如何使整个组织的软件迁移过程更加顺畅。

3. 为什么你应该升级你的服务

人们很容易采取“如果没有损坏,为什么要修复它”的想法。但是,OSS 对 Spring Boot 2.x 的支持已于 2023 年11 月结束。

这意味着您需要进行所有这些升级,以确保在发布新的 CVE 时您的软件保持安全。此外,通过升级,您将可以访问许多工具中的大量新功能。

例如,通过升级到 Java 17(这是 Spring Boot 3.0+ 的要求),您不仅可以获得各种新的 Java 语言功能(记录、模式匹配、switch 表达式等),还可以受益于虚拟机和垃圾收集器的性能改进。

‍注意:您的环境将具有独特的性能足迹。最好使用监控平台来创建应用程序当前性能的基准,这样您就可以在升级时量化节省的成本。

关于 Spring Boot 3.x,您可以从对构建本机可执行文件和使用 GraalVM 的更好支持中受益。通过将 Spring 应用程序构建为本机可执行文件,您会发现启动时间有显著改善。您还会发现可观察性是此新版本中的一个关键主题,现在通过Micrometer Tracing实现跟踪。

从Spring Boot 3.2开始,您可以利用 Java 21 及更高版本中的虚拟线程。通过卸载阻塞 IO 操作,您可以从同一硬件处理更多请求,而不会使编程模型复杂化。

4. 迁移到 Spring Boot 3.x 时需要更新的内容

迁移到 Spring Boot 3.x 包括许多相关的迁移和依赖项更新,您必须在迁移到此新 Spring Boot 版本之前执行这些更新,其中包括:

  • 升级您组织的应用程序、基础设施和 CI/CD 管道以使用 Java 17 或 21。此步骤的好消息是,这项工作可以在升级任何 SpringBoot 应用程序之前完成。
  • 任何利用 Java EE 的现有 Spring 应用程序都需要更新到 Jakarta EE 9。这似乎是一项简单的练习,涉及将所有导入从“javax”命名空间移动到“jakarta”命名空间,但这还要求将任何第三方库也迁移到与 Jakarta EE 9 兼容的版本。
  • 最后,根据应用程序从哪个 Spring Boot 版本迁移而来,迁移到 Spring Boot 3.x 时可能需要对应用程序的代码和配置进行一些更改

5. Java 17 迁移

Spring Boot/Spring 需要 Java 17 的基准版本,并且需要应用程序迁移到 Java 平台的最新长期支持 (LTS) 版本。

对于在 Java 8 上运行的应用程序,主要的摩擦来源是Java 9 中引入了模块系统,以及从核心 JDK 中删除了许多 J2EE javax 依赖项。使用任何 Java EE 规范的应用程序都需要向其项目添加显式依赖项。此外,还有许多与 Java 模块系统不兼容的第三方依赖项,必须作为此练习的一部分进行升级。

从 Java 11 开始,OpenJDK 社区采用了新的六个月发布周期,因此用户现在必须处理已弃用的 API。已弃用的功能最初不会造成严重影响,但随后会从 Java 平台中删除。跨 Java 多个版本升级的应用程序必须解决从平台中删除的 API。幸运的是,有一个 Java 工具Jdeprscan可用于识别哪些 API 已从平台弃用或删除。使用这些 API 的应用程序需要修复其解决方案才能成功升级到 Java 17。

6. Java 21 和虚拟线程

在这里插入图片描述
还有一个方便的Spring Boot 3.x 最佳实践配方,可让您升级到最新的 Spring Boot 3.x 版本,以及升级到 Java 21 和使用虚拟线程。今后,我们将保留此配方作为方便的配方,以便一次性应用所有推荐的 Spring Boot 配方。

作为升级到 Java 21 的一部分,我们还将采用新的 Sequenced Collections 接口中的方法,并放弃现已弃用的 Locales 和 URL 构造函数,以及其他一些较小的增强功能。有关完整详细信息,请参阅迁移到 Java 21 配方。

7. Jakarta EE 9 迁移

Spring Boot 3.x 更新之前需要处理的另一项重要任务是迁移到 J2EE 9。这很重要,因为所有 Java EE
库的命名空间都已从 javax 更改为 jakarta.*。作为其中的一部分,对这些库的任何引用都必须将其包迁移到新的命名空间。

此外,Jackson、Hibernate、Tomcat 和 Jetty 等第三方库提供了与 Jakarta EE 9 兼容的替代工件。这些新的工件将要求 Sprint Boot 的用户仔细检查他们的第三方库,以确保他们拥有兼容的工件。

8. OpenRewrite 自动重构如何提供帮助

好消息是,OpenRewrite 社区正在研究许多复杂更改的方案。这意味着这些更新的很大一部分可以使用OpenRewrite自动完成。

对于那些不知道的人来说,OpenRewrite 是一个语义感知的代码搜索和转换工具。它能够对代码、构建文件和配置进行复杂的更改,这些更改在惯用性上与现有项目的格式标准一致。

实际上,OpenRewrite 有大量的方案可以帮助用户迁移到 Spring Boot 3,其中包括:

  • 从旧版本的 Java 迁移到 Java 17
  • 从 Junit 4 迁移到 Junit 5
  • 从 Java EE 迁移到 Jakarta EE 8 和 9
  • 从旧版本的 Spring Boot 迁移(1.5 -> 2.x、2.7 ->3.0、3.0 -> 3.x)
  • 这些配方会改变编码、更新和配置!

配方是可组合的,这使得更大规模的框架迁移可以包含调用一组执行特定任务的配方或将其他复合配方链接在一起。

例如,迁移到 Java 11 的配方可以利用修改 Maven 依赖项的配方和针对特定已弃用 API 迁移的配方。反过来,迁移到 Java 17 的配方可以链接到 Java 11 配方,而Spring Boot 3.x 迁移配方可以利用这些配方以及将 Jakarta EE 库迁移到版本 9 的配方。

如果您想缩小所做更改的范围,还可以利用配方的可组合特性来定位您尚未更新的特定组件。例如,如果不使用 Spring Boot 3.x,您可以:

  • 将 Spring Boot 2.x 项目从 JUnit 4 迁移到 JUnit 5
  • 迁移到 Spring Security 5.8
  • 迁移到 Java 17
  • 执行 Spring Boot 2.x 最佳实践

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

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

相关文章

从EN标准到REACH法规:全面掌握CE认证洗涤剂的安全要求

一、什么是CE认证? CE认证(Conformit Europenne)是产品符合欧洲经济区(EEA)安全、健康、环保和消费者保护要求的标志。对于洗涤剂而言,CE认证证明该产品符合欧洲相关法规和标准,确保其在使用过…

牛客JS题(三十四)监听对象

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; defineProperty实现深度监视递归终止条件引用传值闭包与作用域 题干&#xff1a; 我的答案 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /></head&…

ue5正确导入资源 content(内容),content只能有一个

把资源content下的东西&#xff0c;全部拷贝&#xff0c;放在项目的content下 content只能有一个

【HarmonyOS NEXT星河版开发学习】小型测试案例02-华为登录

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面&#xff08;还未发布&#xff09; 前言 通过此案例&#xff0c;不得不感叹鸿蒙的强大了&#xff0c;仅仅使用了26行代码就构建出来了这个界面&#xff0c;确实特别方便&#…

【git】简易的命令行入门教程

文章目录 1.Git 全局设置2.创建 git 仓库3.已有仓库 1.Git 全局设置 git config --global user.name "******" git config --global user.email "******qq.com"2.创建 git 仓库 mkdir ****** cd ****** git init touch README.md git add README.md git…

如何在notebook中运行nodejs

在 Python 生态系统的推动下&#xff0c;机器学习和人工智能日益流行&#xff0c;这带来了计算笔记本的概念。这些交互式计算平台主要是为以 Python 为中心的数据科学应用而开发的&#xff0c;它们将代码、计算输出、解释性文本和多媒体合并成一个有内聚力的文档。 作为 JavaS…

Liunx---批量安装服务器

目录 一、环境准备 一、环境准备 1.准备一台rhel7的主机并且打开主机图形。 2.配置好可用ip 3.做kickstart自动安装脚本后面需要用到DHCP&#xff0c;关闭VMware DHCP功能 二、安装图形化kickstart自动安装脚本的工具 yum install system-config-kickstart ----安装图形化生…

python模式设计代码之观察者模式

1、观察者模式 话题订阅模式。观察者模式有两个角色&#xff0c;分别是话题发布者和话题订阅者&#xff08;即观察者&#xff09;。发布者就是把消息发送给话题&#xff0c;观察者就是订阅这个话题从而得到最新的资讯。这个模式的作用就拿手机的消息推送来说&#xff0c;app身…

elasticsearch的学习(四):elasticsearch的一些基本概念

简介 elasticsearch的一些基本概念。 核心概念 索引&#xff1a;一个拥有相似特征的文档的集合。 类型&#xff1a;在索引中定义&#xff0c;是索引的一个逻辑上的分类&#xff0c;版本7以上已经弃用了。 文档&#xff1a;可被索引的基础信息单元&#xff0c;即一条数据&a…

Linux 错误码

目录 一、概述二、含义三、错误处理函数1、IS_ERR2、strerr、perror 一、概述 在 Linux 系统中&#xff0c;错误码是用来表示操作系统运行过程中发生的错误的数字代码。错误码通常由负数表示&#xff0c;0 表示成功&#xff0c;正数表示警告或其他非致命错误。 为了开发者更好…

【Linux基础】Linux基本指令(二)

目录 &#x1f680;前言一&#xff0c;mv指令二&#xff0c;more & less指令2.1 more 指令2.1 less指令 三&#xff0c;重定向技术(重要)3.1 echo指令3.2 输出重定向 >3.3 追加重定向 >>3.4 输入重定向 < 四&#xff0c;head & tail指令4.1 head 指令4.2 t…

【经验分享】ShardingSphere+Springboot-04:自定义分片算法(COMPLEX/STANDARD)

文章目录 3.4 CLASS_BASED 自定义类分片算法3.4.1 复杂分片自定义算法&#xff08;strategyCOMPLEX &#xff09;3.4.2 STANDARD 标准分片自定义算法## 进阶:star: 自定义算法范围查询优化 3.4 CLASS_BASED 自定义类分片算法 3.4.1 复杂分片自定义算法&#xff08;strategyCOM…

VUE结合elementui实现分页器列表

<template><div>外贸知识<div class"art-box"><div class"art-item-box"><div class"art-item" v-for"(art, index) in paginatedArtList" :key"index"><a :href"art.artsrc"&g…

离开SD的大佬们另组战队,开源新品牌冲击MJ王座

FLUX.1强势登场&#xff0c;秒杀Midjourney&#xff1f; Midjourney 6.1 才发表几天&#xff0c;FLUX.1立刻就来踢馆了 离职四个月&#xff0c;Stability AI 核心成员 Robin Rombach 前几日官宣成立了 Black Forest Labs&#xff0c;公司推出的第一个产品 FLUX.1&#xff0c;…

GStreamer 简明教程(一):环境搭建,运行 Basic Tutorial 1 Hello world!

文章目录 前言一、源码环境搭建二、Basic Tutorial 1 Hello world三、开启更多日志参考 前言 本系列文章将纪录学习 [GStreamer] 的过程。 为什么想学习 [GStreamer]&#xff0c;有这么几个原因&#xff1a; 多媒体处理是一个复杂的任务&#xff0c;[GStreamer] 的管道架构可…

Docker最佳实践(七):安装MinIO文件服务器

大家好&#xff0c;欢迎各位工友。 Minio是一个开源免费的高性能对象存储服务器&#xff0c;专为大规模数据集和高并发访问而设计。它具有出色的读写性能和低延迟&#xff0c;可以满足对数据速度和效率要求较高的应用场景。本篇呢我们就来演示一下如何在Docker中搭建Minio容器&…

Java的线程实现

我们知道&#xff0c;线程是比进程更轻量级的调度执行单位&#xff0c;线程的引入&#xff0c;可以把一个进程的资源分配和执行调度分开&#xff0c;各个线程既可以共享进程资源&#xff08;内存地址、文件I/O等&#xff09;&#xff0c;又可以独立调度。目前线程是Java里面进行…

智能分析,安全无忧:AI视频分析技术在安全生产中的深度应用

在当今快速发展的科技时代&#xff0c;视频智能分析技术&#xff08;Intelligent Video Analysis&#xff0c;简称IV&#xff09;已经成为提升安全生产水平的重要手段。这一技术通过计算机图像视觉分析技术&#xff0c;实现了对场景中目标的自动识别和追踪&#xff0c;有效提升…

【层归一化用于单个样本适合于序列建模,通俗】

层归一化&#xff08;Layer Normalization&#xff09;&#xff0c;简称 LayerNorm&#xff0c;会将神经网络层的激活值规范到均值为0&#xff0c;并将其方差归一化为1。尤其是在循环神经网络&#xff08;RNNs&#xff09;和自注意力模型&#xff08;如 Transformers&#xff0…

【学习笔记】Day 8

写在开头&#xff1a; 最近老板突然提出一个全新的组会主题&#xff0c;是关于 “最近我犯的傻”&#xff0c;其目的在于提供乐子的同时引以为戒。本来我还在愁到底去哪里找干的啥事儿&#xff0c;结果今天直接拉了个大的。什么叫无心插柳柳成荫啊&#xff0c;悲。 一…