写点什么

Springboot 升级到 2.6.1 的坑

作者:Xiao8
  • 2022 年 6 月 13 日
  • 本文字数:4606 字

    阅读完需:约 15 分钟

SpringBoot 2.6.0 重磅发布

重要特性

1. Servlet 应用支持在 Cookie 中配置 SameSite 属性

该属性可通过 server.session.cookie.same-site 属性来配置,共有三个可选值:


  • Strict 严格模式,必须同站请求才能发送 cookie

  • Lax 宽松模式,安全的跨站请求可以发送 cookie

  • None 禁止 SameSite 限制,必须配合 Secure 一起使用

2. 支持为主应用端口和管理端口配置健康组

这在 Kubernetes 等云服务环境中很有用。在这种环境下,出于安全目的,为执行器端点使用单独的管理端口是很常见的。拥有单独的端口可能会导致不可靠的健康检查,因为即使健康检查成功,主应用程序也可能无法正常工作。


以往传统的配置会将所有 Actuator 端点都放在一个单独的端口上,并将用于检测应用状态的健康组放在主端口的附加路径下。

3. 增强/info 端点,加入 Java Runtime 信息

增强后的例子:


{  "java": {    "vendor": "BellSoft",    "version": "17",    "runtime": {      "name": "OpenJDK Runtime Environment",      "version": "17+35-LTS"    },    "jvm": {      "name": "OpenJDK 64-Bit Server VM",      "vendor": "BellSoft",      "version": "17+35-LTS"    }  }}
复制代码


该信息可以通过这个属性开启或关闭:


management.info.java.enabled=true
复制代码

4. 支持使用 WebTestClient 来测试 Spring MVC

开发人员可以使用 WebTestClient 在模拟环境中测试 WebFlux 应用程序,或针对实时服务器测试任何 Spring Web 应用程序。


这次增强后,开发者可以在 Mock 环境中使用 @AutoConfigureMockMvc 注释的类,就可以轻松注入 WebTestClient。 这样编写测试就比之前容易多了。

5. 增加 spring-rabbit-stream 的自动化配置

这次更新添加了 Spring AMQP 的新 spring-rabbit-stream 模块的自动配置。


当 spring.rabbitmq.listener.type 属性设置为 stream 时, StreamListenerContainer 是自动配置的。


spring.rabbitmq.stream.*属性可用于配置对broker的访问,spring.rabbitmq.listener.stream.native-listener 可用于启用native listener
复制代码

6. 支持/env 端点和 configprops 配置属性的自定义脱敏

虽然 Spring Boot 之前已经可以处理 /env 和 /configprops 端点中存在的敏感值,只需要可以通过配置属性来控制即可。但还有一种情况,用户可能希望根据属性源自哪个 PropertySource 来应用清理。


例如,Spring Cloud Vault 使用 Vault 来存储加密值并将它们加载到 Spring 环境中。由于所有值都是加密的,因此将整个属性源中的每个键的值脱敏是有意义的。可以通过添加类型为 SanitizingFunction 的 @Bean 来配置此类自定义脱敏规则。


顺手推荐一下我一直在连载的免费教程:Spring Boot 教程可以点击直达!。


跟很多其他教程不同。这个教程不光兼顾了 1.x 和 2.x 版本。同时,对于每次的更新,都会选择一些相关内容修补 Tips,所以对各种不同阶段的读者长期都会有一些收获。如果你觉得不错,记得转发支持一下!


同时,如果你对哪方面还有疑惑,或希望 DD 多做些什么例子到教程里,也欢迎留言催更,或点赞支持别人的催更内容!

其他变更

1. Reactive Session 个性化

当前版本可以动态配置 reactive session 的有效期


server.reactive.session.timeout=30
复制代码
2. Redis 链接自动配置链接池

当应用依赖中包含 commons-pool2.jar 会自动配置 redis 链接池 (Jedis Lettuce 都支持)。如果你想关闭则通过如下属性:


spring.redis.jedis.pool.enabled=false
spring.redis.lettuce.pool.enabled=false
复制代码


3. 构建信息个性化


通过 spring-boot-maven-plugin 支持自动生成此次构建信息的 build-info.properties


<plugin>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-maven-plugin</artifactId>  <configuration>       <excludeInfoProperties>        <excludeInfoProperty>version</excludeInfoProperty>     </excludeInfoProperties>  </configuration></plugin>
复制代码
4. Metrics 新增指标

应用启动的两个新指标:


application.started.time: 启动应用程序所需的时间
application.ready.time: 启动应用到对外提供服务所需时间
复制代码


磁盘空间的两个指标:


disk.free: 磁盘空闲空间
disk.total: 磁盘总空间
复制代码
5. Docker 镜像的构建

增强 docker-maven-plugin 插件的功能:


  • 为自定义镜像设置 tags 标签

  • 网络配置参数,可用于 Cloud Native Buildpacks 的构建过程

  • 支持使用 buildCache 和 launchCache 配置参数自定义用于缓存层的名称,这些层由构建包提供给构建的镜像


6. 移除 2.4 版本中的过期属性


由于 2.4 版本完成历史使命,因此有大量过期属性被移除,最近要升级的小伙伴一定要关注一下这部分内容,因为你原来的配置会失效!


因为内容较多,这里就不完全贴出来了,有兴趣的可以看看文末参考资料中的官方信息。

7. 默认情况完全禁止 Bean 的循环引用

在 2.6.0 之后,默认禁止了循环引用,如果你的项目出现循环引用,会进行报错:


The dependencies of some of the beans in the application context form a cycle:
authorizationServerConfig (field private org.springframework.security.crypto.password.PasswordEncoder com.leinao.config.AuthorizationServerConfig.passwordEncoder) securityConfig org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration┌─────┐| com.alibaba.cloud.sentinel.SentinelWebAutoConfiguration (field private java.util.Optional com.alibaba.cloud.sentinel.SentinelWebAutoConfiguration.sentinelWebInterceptorOptional)└─────┘

Action:
Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.
复制代码


这里对阿里巴巴的 Sentinel 进行了循环引用,导致出现错误。


当然,可能这样的要求对于开发者会很痛苦。所以,你也可以通过下面的配置,放开不允许循环依赖的要求:


spring.main.allow-circular-references=true
复制代码
8. SpringMVC 默认路径匹配策略

Spring MVC 处理程序映射匹配请求路径的默认策略已从 AntPathMatcher 更改为 PathPatternParser。


Actuator 端点现在也使用基于 PathPattern 的 URL 匹配。需要注意的是,Actuator 端点的路径匹配策略无法通过配置属性进行配置。


如果需要将默认切换回 AntPathMatcher,可以将 spring.mvc.pathmatch.matching-strategy 设置为 ant-path-matcher,比如下面这样:


spring.mvc.pathmatch.matching-strategy=ant-path-matcher
复制代码

springboot 2.6.1

11 月 29 日 Spring Boot 2.6.1 正式发布,主要是为了支持本周即将发布的 Spring Cloud 2021,此版本包括 11 个错误修复和文档改进。

Bug 修复

  • 模式分析 PatternParseException 的操作消息中的 matching-strategy 属性的名称不正确 #28839

  • 修复 ErrorPageSecurityFilter 部署到 Servlet 3.1 的兼容问题 #28790

  • QuartzDataSourceScriptDatabaseInitiializer 不提供 MariaDB #28779 的映射

  • “test” 和 “Inlined Test Properties” 属性源顺序不正确 #28776

  • 在没有 spring-security-web 的 Servlet 应用程序中使用 Spring Security 时出现 ArrayStoreException #28774

  • DefaultClientResources 在将 Lettuce 与 Actuator 一起使用时未正确关闭是发出警告 #28767

  • 具有 permitAll 的页面无法再通过自动配置的 MockMvc #28759

  • 依赖管理 org.elasticsearch.distribution.integ-test-zip:elasticsearch 应将其类型声明为 zip #28746

修复文档

  • 修复文档 “External Application Properties” 部分中的拼写错误 #28834

  • 修复参考文档 #28833 中 “spring –version” 的输出。

  • org.springframework.boot.actuate.metrics.data 包添加描述 #28761。

升级 spring-cloud-k8s

服务提供者(SSO)

首先引入高版本:


<parent>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-parent</artifactId>      <version>2.6.1</version>      <relativePath/>  </parent>
复制代码


接下来,我们看看 cloud 如何接入 k8s,这里已经发生重大改变:


<dependencyManagement>    <dependencies>      <dependency>        <groupId>org.springframework.cloud</groupId>        <artifactId>spring-cloud-dependencies</artifactId>        <version>2021.0.0</version>        <type>pom</type>        <scope>import</scope>      </dependency>    </dependencies>  </dependencyManagement>
复制代码


cloud 我们引入最新版本 2021.0.0,接下来,我们看看 k8s 部分依赖:


    <dependency>       <groupId>org.springframework.cloud</groupId>       <artifactId>spring-cloud-starter-kubernetes-fabric8-config</artifactId>    </dependency>
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-commons</artifactId> </dependency>
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-kubernetes-fabric8-discovery</artifactId> </dependency>
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-kubernetes-fabric8-loadbalancer</artifactId> </dependency>
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>${okhttp.version}</version> </dependency>
复制代码


这里发生改变的是,之前引入的是直接对 k8s 的,这里是关于 fabric8 第三方的注入。


引入完这些后,我们接下来看关于 Oauth2 的使用,之前引入的是:


<dependency>        <groupId>org.springframework.cloud</groupId>        <artifactId>spring-cloud-starter-oauth2</artifactId>     </dependency>
复制代码


这种通过注解方式来处理,但在 spring cloud2021 版本中,已经摒弃了这种方式,统一归纳到 spring-cloud-common,这里为了解决这种问题使用以下依赖:


<dependency>    <groupId>org.springframework.security.oauth.boot</groupId>    <artifactId>spring-security-oauth2-autoconfigure</artifactId></dependency>
复制代码


服务提供者目前未出现任何严重问题,我们打包部署下:



看到上面的日志,表明已经部署成功。

服务消费者

同样引入你那些版本依赖,如上面的服务提供者一样,同时,也需要引入:


<dependency>    <groupId>org.springframework.security.oauth.boot</groupId>    <artifactId>spring-security-oauth2-autoconfigure</artifactId></dependency>
复制代码


以实现 SSO,目前看到未出现任何问题,接下来,我们需要去部署:



部署完后,发现报以上的错,经过各种尝试发现是与 swagger 的兼容,这里直接尝试:修复方法:注解 EnableSwagger2 改为 EnableWebMvc:



同时,我们发现下面的红色部分会出现问题,因为是改变了函数参数,修改为红色部分即可。


最后,我们再次启动,发现完美开启,升级成功。


PS:springboot 高版本结合 alibaba,目前发现一些问题,暂时不提供升级。待后续。。。

发布于: 刚刚阅读数: 3
用户头像

Xiao8

关注

God bless the fighters. 2020.03.11 加入

欢迎关注公众号:程序猿Damon,长期从事Java开发,研究Springcloud的微服务架构设计。目前主要从事基于K8s云原生架构研发的工作,Golang开发,长期研究边缘计算框架KubeEdge、调度框架Volcano、容器云KubeSphere研究

评论

发布
暂无评论
Springboot 升级到 2.6.1 的坑_6月月更_Xiao8_InfoQ写作社区