SpringBootSpringCloud升级可能会出现的问题

1.背景

之前负责过我们中台的SpringBoot和Cloud的升级,特次记录分享一下项目中可能出现的问题,方便后续的人快速定位问题。以及下述选择的解决方案都是基于让升级的服务影响和改动最小以及提供通用的解决方案的提前进行选择的。

1.1版本说明

升级前(大部分):
springboot版本:2.2.5.RELEASE
spring-cloud版本:Hoxton.SR3

升级后(2023年02月):
springboot版本:2.7.5;
spring-cloud版本:2021.0.4;

选择版本逻辑:
见官方映射逻辑
https://spring.io/projects/spring-cloud

这里是引用

同时选择最新中使用最多最稳定的版本。

2.升级带来可能不兼容问题

2.1ClassDefFoundError: kotlin/reflect/TypesJVMKt

升级kotlin版本<kotlin.version>1.6.21</kotlin.version>

2.2 NoClassDefFoundError: org/springframework/cloud/openfeign/ribbon/LoadBalancerFeignClient

问题原因:
io.opentracing.contrib.spring.cloud.feign.TraceFeignContext#addTracingClient 找不到对应的类
spring-cloud-netflix-ribbon 已从 SpringCloud 中删除
在这里插入图片描述
opentracing-spring-cloud-starter 作者没有时间更新对应新版的 Spring-cloud
见:
https://github.com/opentracing-contrib/java-spring-cloud/issues/312
https://github.com/opentracing-contrib/java-spring-cloud/pull/324

解决方案:
1.按需考虑是否替换为最新的OpenTelemetry,需结合自己公司的监控体系,影响较大

2.重写io.opentracing.contrib.spring.cloud.feign.TraceFeignContext#getInstances,影响小,关键代码如下:

package io.opentracing.contrib.spring.cloud.feign;
// 注意上面的package要同opentacing路径一致才能替换

public class CompatibleTraceFeignContext extends TraceFeignContext {

    private final FeignContext delegate;
    private final Tracer tracer;
    private final List<FeignSpanDecorator> spanDecorators;

    public CompatibleTraceFeignContext(Tracer tracer,
                                       FeignContext delegate,
                                       BeanFactory beanFactory,
                                       List<FeignSpanDecorator> spanDecorators) {
        super(tracer, delegate, beanFactory, spanDecorators);
        this.delegate = delegate;
        this.tracer = tracer;
        this.spanDecorators = spanDecorators;
    }

    @Override
    public <T> T getInstance(String name, Class<T> type) {
        T object = this.delegate.getInstance(name, type);
        return (T) this.compatibleAddTracingClient(object);
    }

    @Override
    public <T> Map<String, T> getInstances(String name, Class<T> type) {
        Map<String, T> tracedInstances = new HashMap<>();
        Map<String, T> instances = this.delegate.getInstances(name, type);
        if (instances == null) {
            return tracedInstances;
        }

        for (Map.Entry<String, T> instanceEntry : instances.entrySet()) {
            tracedInstances.put(instanceEntry.getKey(), (T) this.compatibleAddTracingClient(instanceEntry.getValue()));
        }
        return tracedInstances;
    }

    private Object compatibleAddTracingClient(Object bean) {
        if (bean instanceof TracingClient) {
            return bean;
        }

        if (bean instanceof Client) {
            return compatibleBuildTracingClient((Client) bean, tracer);
        }

        return bean;
    }

    private TracingClient compatibleBuildTracingClient(Client delegate, Tracer tracer) {
        return new TracingClientBuilder(delegate, tracer)
                .withFeignSpanDecorators(spanDecorators)
                .build();
    }

}

2.3 升级SpringBoot 版本后,默认为Junit5,junit4相关类没有了

引入junit4或者修改换成Junit5写法(建议)

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

junit4和junit5共存时,可能单测会执行不到junit4的方法,可以参考此链接 https://codeantenna.com/a/cMyp4oXyCU

2.4 org.springframework.dao.InvalidDataAccessApiUsageException: ConnectionCallback; isValid; nested exception is java.sql.SQLFeatureNotSupportedException: isValid

问题原因:
此问题是由于shrding版本过旧与springBoot-actuator不匹配,数据库健康检测失败。
具体原因见:https://github.com/apache/shardingsphere/issues/5882

原因的根源: shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/unsupported/AbstractUnsupportedOperationConnection.java

@Override
    public final boolean isValid(final int timeout) throws SQLException {
        throw new SQLFeatureNotSupportedException("isValid");
    }

此问题会导致健康检测地址返回{“status”:“DOWN”},从而注册不上consul
解决方案:

  1. 按需考虑是否要升级shardin版本,不过是alpha版本,见:https://github.com/apache/shardingsphere/pull/6002。
  2. 重写

2.5 高版本spring循环依赖校验变严

当前设置:不建议使用循环依赖,如果有这种情况, 先定位问题尝试修复

2.6@FeignClient 兼容问题 不支持@RequestMapping 写在Client接口上

原因:
Caused by: java.lang.IllegalArgumentException: @RequestMapping annotation not allowed on @FeignClient interfaces at org.springframework.cloud.openfeign.support.SpringMvcContract.processAnnotationOnClass(SpringMvcContract.java:182)
解决方案:
重写SpringMvcContract

2.7reactor-core版本问题

Caused by: java.lang.ClassNotFoundException: reactor.util.context.ContextView
	at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:419)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:352)
	... 58 common frames omitted

升级升级reactor-core到3.4.3

2.8 spring-boot-starter-data-redis 版本不兼容

org.springframework.boot.actuate.metrics.cache.RedisCacheMetrics.missCount(RedisCacheMetrics.java:56)
更新spring-boot-starter-data-redis 版本与SpringBoot一致

2.9升级版本之后的Spring Cloud Stream(SCS)消费kafka无法正常反序列化payload.

SCS消费业务系统发送的的消息时Message的payload的数据类型依然是byte[], 没有按照旧版本的行为序列化为String
触发条件:

  1. 使用SCS(@StreamListener)消费kafka消息,且没有为payload指定具体类型(入参Message没有指定泛型,指定泛型为Object也不会反序列化)
    问题原因:
    SCS是使用了AbstractMessageConverter来对payload进行反序列化的, AbstractMessageConverter有几个实现,序列化的过程是一个过滤器的模式,默认情况下,ApplicationJsonMessageMarshallingConverter是第一个处理器,当没有指定泛型时且payload是byte[]类型时,旧版本的处理逻辑如下:
    在这里插入图片描述
    新版逻辑:
    在这里插入图片描述
    无法命中条件,所以原样输出btye数组。
    解决方案:指明泛型

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV基本图像处理操作(十)——图像特征harris角点

角点 角点是图像中的一个特征点&#xff0c;指的是两条边缘交叉的点&#xff0c;这样的点在图像中通常表示一个显著的几角。在计算机视觉和图像处理中&#xff0c;角点是重要的特征&#xff0c;因为它们通常是图像中信息丰富的区域&#xff0c;可以用于图像分析、对象识别、3D…

JavaSE中的String类

1.定义方式 常见的三种字符串构造 public class Test1 {public static void main(String[] args) {// 使用常量串构造String str1 "abc";System.out.println(str1);// 直接newString对象String str2 new String("ABC");System.out.println(str2);// 使用…

【Linux学习】Linux指令(四)

文章标题 &#x1f680;zip/unzip指令&#xff1a;&#x1f680;tar指令&#xff08;重要&#xff09;&#xff1a;&#x1f680;uname –r指令&#xff1a;&#x1f680;关机指令&#x1f680;几个常用操作 &#x1f680;zip/unzip指令&#xff1a; zip 与 unzip的安装 yum i…

Day20-【Java SE高级】单元测试 反射 注解 动态代理

一、单元测试 就是针对最小的功能单元(方法)&#xff0c;编写测试代码对其进行正确性测试。 1. 咱们之前是如何进行单元测试的?有啥问题? 只能在main方法编写测试代码&#xff0c;去调用其他方法进行测试。无法实现自动化测试&#xff0c;一个方法测试失败&#xff0c;可能…

学习在Debian系统上安装Shadowsocks教程

学习在Debian系统上安装Shadowsocks教程 安装shadowsocks-libev及其所需的依赖启动Shadowsocks服务&#xff1a;如果你想要通过代理本地流量&#xff0c;你可以使用ss-local&#xff1a;启动并设置ss-local&#xff1a;查看状态本地连接 安装shadowsocks-libev及其所需的依赖 …

量化交易为什么独宠Python

“我在学一门叫Python的语言”。“什么是Python&#xff0c;没听说过啊&#xff0c;为什么不学C啊”。这是发生在2014年&#xff0c;上海的一家量化基金&#xff0c;量化研究员和老板之间的对话。 “我想问一下关于Python的课程&#xff0c;什么时候能开班”。“Python啊&#…

数据结构-栈和队列刷题集(长期更新)

文章目录 万能计算器的实现以及源码分析1. leetcode 150 逆波兰表达式求值 万能计算器的实现以及源码分析 /*** 我们尝试写一个完整版的计算器,由于计算机不能很好的识别括号,所以一般要转换为逆波兰表达式求解* 思路解析 :* 1. 输入一个 中缀表达式* 2. 中缀表达式转化为list…

Python 数据结构和算法实用指南(一)

原文&#xff1a;zh.annas-archive.org/md5/66ae3d5970b9b38c5ad770b42fec806d 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 数据结构和算法是信息技术和计算机科学工程学习中最重要的核心学科之一。本书旨在提供数据结构和算法的深入知识&#xff0c;以及编程…

28岁转行嵌入式适合转嵌入式吗?

转行到嵌入式领域是一个很好的选择&#xff0c;特别是如果你对电子技术、嵌入式系统和软硬件交互感兴趣的话。我这里有一套嵌入式入门教程&#xff0c;不仅包含了详细的视频 讲解&#xff0c;项目实战。如果你渴望学习嵌入式&#xff0c;不妨点个关注&#xff0c;给个评论222&a…

信息系统项目管理师0054:运维和服务(4信息系统管理—4.1管理方法—4.1.4运维和服务)

点击查看专栏目录 文章目录 4.1.4运维和服务1.运行管理和控制2.IT服务管理3.运行与监控4.终端侧管理5.程序库管理6.安全管理7.介质控制8.数据管理4.1.4运维和服务 信息系统的运维和服务应从信息系统运行的视角进行整合性的统筹规划,包括对信息系统、应用程序和基础设施的日常控…

C语言的OJ判题机设计与实现

1. 接收判题入参 判题需要作答代码、测试输入和期望输出、编译器名称、时空限制。对于支持special judge的还需要传入是否为sj和sj代码。推荐使用消息队列&#xff0c;应对高并发的比赛情况会比较好。 但是消息队列是异步的&#xff0c;我为了快点实现能提交后在当前页面获得判…

Elasticsearch:(一)ES简介

搜索引擎是什么&#xff1f;在不少开发者眼中&#xff0c;ES似乎就是搜索引擎的代名词&#xff0c;然而这实际上是一种误解。搜索引擎是一种专门用于从互联网中检索信息的技术工具&#xff0c;它主要可以划分为元搜索引擎、全文搜索引擎和垂直搜索引擎几大类。其中&#xff0c;…

AIGC算法1:Layer normalization

1. Layer Normalization μ E ( X ) ← 1 H ∑ i 1 n x i σ ← Var ⁡ ( x ) 1 H ∑ i 1 H ( x i − μ ) 2 ϵ y x − E ( x ) Var ⁡ ( X ) ϵ ⋅ γ β \begin{gathered}\muE(X) \leftarrow \frac{1}{H} \sum_{i1}^n x_i \\ \sigma \leftarrow \operatorname{Var}(…

【中级软件设计师】上午题08-UML(下):序列图、通信图、状态图、活动图、构件图、部署图

上午题08-UML 1 序列图2 通信图3 状态图3.1 状态和活动3.2 转换和事件 4 活动图5 构件图&#xff08;组件图&#xff09;6 部署图 【中级软件设计师】上午题08-UML(上)&#xff1a;类图、对象图、用例图 UML图总和 静态建模&#xff1a;类图、对象图、用例图 动态建模&#xff…

【简单介绍下PostCSS】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

仿真测试的应用领域

仿真测试在各种领域中都有广泛的应用&#xff0c;以下是一些应用最广泛的场景&#xff1a; 工业制造&#xff1a;通过模拟制造过程&#xff0c;可以预测产品的质量和性能&#xff0c;优化生产流程&#xff0c;降低成本。航空航天&#xff1a;飞机、导弹、航天器等的设计和研发…

AWS Key disabler:AWS IAM用户访问密钥安全保护工具

关于AWS Key disabler AWS Key disabler是一款功能强大的AWS IAM用户访问密钥安全保护工具&#xff0c;该工具可以通过设置一个时间定量来禁用AWS IAM用户访问密钥&#xff0c;以此来降低旧访问密钥所带来的安全风险。 工具运行流程 AWS Key disabler本质上是一个Lambda函数&…

如何访问内网?

在互联网万维网上&#xff0c;我们可以轻松访问各种网站和资源。但是&#xff0c;有时我们需要访问局域网内的资源&#xff0c;例如公司内部的文件共享、打印机等。本文将介绍几种方法&#xff0c;帮助您实现访问内网的需求。 内网穿透技术 内网穿透技术是一种通过互联网将局域…

SQL表连接详解:JOIN与逗号(,)的使用及其性能影响

省流版 在这个详细的解释中&#xff0c;我们将深入探讨SQL中表连接的概念&#xff0c;特别是JOIN和逗号&#xff08;,&#xff09;在连接表时的不同用法及其对查询性能的影响。通过实际示例和背后的逻辑分析&#xff0c;我们将揭示在不同场景下选择哪种连接方式更为合适。 1.…

Mysql查询表的结构信息 把列名 数据类型 等变成列数据(适用于生成数据库表结构文档) (二)

书接上文 Mysql查询表的结构信息 把列名 数据类型 等变成列数据(适用于生成数据库表结构文档) (一) 好&#xff0c;怎么生成文档呢&#xff1f;很简单 用navicat 或者sqlyog navicat操作如下 举个例子 如下查询结果 全选查询结果&#xff0c;右键&#xff0c;复制为指标…