SpringBootSpringCloud升级可能会出现的问题

news2024/11/27 14:30:20

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数组。
    解决方案:指明泛型

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

js进阶 事件循环(持续更新)

导入 js是单线程&#xff0c;同一时间只能做一件事&#xff0c;事件循环(EventLoop)来打破这个局面 异步任务 ajax网络请求setTimeout定时函数 简易粗糙的事件循环 同步任务进入主线程主执行栈异步任务进入任务队列主任务栈任务执行完毕&#xff0c;从任务队列读取对应任务…

npm怎么迁移到pnpm

下载的vue3模板用到了pnpm&#xff0c;就安装了一下 但是安装之后使用pnpm install 就发现包全被移动到ignored文件夹下面了,还报错 PS G:\Projects\gitProeject\TS_front> pnpm installWARN  Moving commitlint/config-conventional that was installed by a different …

中兴F7607P自启动程序,关闭JAVA插件

本文目的&#xff1a;关闭光猫内自动运行的JAVA插件&#xff0c;并实现开机自动调用用户的程序启动 移动定制版F7607P不带LXC容器&#xff0c;取而代之的是JAVA虚拟机&#xff0c;内置多个插件&#xff0c;包括名为CMCCDPI的插件&#xff0c;用途可以从名字上窥见。机器rootfs分…

快速上手Linux核心命令

Linux 的重要性不用我多说了吧&#xff0c;大多数互联网公司&#xff0c;服务器都是采用的Linux操作系统 Linux是一个主要通过命令行来进行管理的操作系统。 只有熟练掌握Linux核心命令&#xff0c;在使用起来我们才会得心应手 这里给大家整理了Linux一些核心命令&#xff0…

一些docker安装配置以及常见命令

​常用命令 docker 命令 //进去容器内部&#xff0c;找到需要拷贝的文件及目录 docker exec -it 2c2600fb60f8 /bin/bash ​ //将container id为4db8edd86202的容器内elasticsearch.yml文件拷贝到宿主机指定目录下&#xff1a; docker cp 4db8edd86202:/usr/share/elasticsea…

Spring Boot:Web应用开发之登录与退出的实现

Spring Boot 前言实现登录功能配置拦截器 实现退出功能 前言 登录与退出功能作为 Web 应用中的基础且重要的组成部分&#xff0c;直接关系到用户的安全和隐私保护。通过实现登录与退出功能&#xff0c;可以对用户的身份进行验证和授权&#xff0c;确保只有合法的用户才能访问特…

数据链路层(上):以太网、二层交换机和网络风暴

目录 数据链路层知识概览 数据链路层设备 1、二层交换机 2、拓展&#xff1a;二层交换机与三层交换机有啥区别&#xff1f; 3、广播风暴 4、交换机以太网接口的工作模式 数据链路层的功能 数据链路层--以太网 1、以太网是什么&#xff1f; 2、以太网地址 数据链路层知…

MediaStream使用webRtc多窗口传递

最近在做音视频通话&#xff0c;有个需求是把当前会话弄到另一个窗口单独展示&#xff0c;但是会话是属于主窗口的&#xff0c;多窗口通信目前不能直接传递对象&#xff0c;所以想着使用webRtc在主窗口和兄弟窗口建立连接&#xff0c;把主窗口建立会话得到的MediaStream传递给兄…

系统稳定性建设

说到系统稳定性&#xff0c;不知道大家会想起什么&#xff1f;大多数人会觉得这个词挺虚的&#xff0c;不知道系统稳定性指的是什么。 一年前看到这个词&#xff0c;也是类似于这样的感受&#xff0c;大概只知道要消除单点、做好监控报警&#xff0c;但却并没有一个体系化的方…

ChatGLM-6B的部署步骤

2022年8月&#xff0c;清华背景的智谱AI基于GLM框架&#xff0c;正式推出拥有1300亿参数的中英双语稠密模型 GLM-130B(论文地址、代码地址&#xff0c;论文解读之一&#xff0c;GLM-130B is trained on a cluster of 96 DGX-A100 GPU (840G) servers with a 60-day&#xff0c;…

【Excel如何在表格中筛选重复的值之条件格式】

在使用excel进行统计时经常会遇到&#xff0c;数据统计出现重复的现象&#xff0c;为了确保数据的唯一性&#xff0c;可以用到条件格式筛选出重复值&#xff0c;以确保数据的正确性。 筛选重复值&#xff1a; 选中要筛选的范围&#xff0c;行或列或整个表选中【开始】-【条件…

记录一次k8s pod之间ip无法访问,问题排查与定位

记录一次k8s pod之间ip无法访问&#xff0c;问题排查与定位 问题展现现象 node之间通信正常 部分node上的pod无法通信 排查有问题node 使用启动网络测试工具 环境准备 docker 数据库mysql 使用有状态副本集合 --- apiVersion: apps/v1 kind: StatefulSet metadata:anno…

MATLAB实现图片栅格化

MATLAB实现图片栅格化 1.读取图片&#xff1a;首先&#xff0c;你需要使用imread函数读取要栅格化的图片。 2.设置栅格大小&#xff1a;确定你希望将图片划分成的栅格大小&#xff0c;即每个栅格的宽度和高度。 3.计算栅格数量&#xff1a;根据图片的总尺寸和栅格大小&#…

pycharm 更换Eclipse 的按键模式 keymap

流程 整体来说比较简单&#xff0c;其实只要下载一个eclipse keymap插件就可以完成 首先 ctrl alt s 打开设置页面&#xff0c;找到 plugin 安装完成后还是在 settings 下切换到 keymap即可以看到eclipse 的按键设置出现了&#xff0c;应用后ok 即可完成 再去试试&#x…

绿色自适应网址发布页源码

源码介绍 绿色自适应网址发布页源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果截图 源码下载 绿色自适应网址…

Adobe Bridge 2024 v14.0.3 (macOS, Windows) - 集中管理创意资源

Adobe Bridge 2024 v14.0.3 (macOS, Windows) - 集中管理创意资源 Acrobat、After Effects、Animate、Audition、Bridge、Character Animator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、Lightroom Classic、Media Encoder、Photoshop、Premiere Pro、Adobe XD…

51单片机入门_江协科技_31~32_OB记录的自学笔记_LCD1602液晶显示屏

31. LCD1602 31.1. LCD1602介绍 •LCD1602&#xff08;Liquid Crystal Display&#xff09;液晶显示屏是一种字符型液晶显示模块&#xff0c;可以显示ASCII码的标准字符和其它的一些内置特殊字符&#xff0c;还可以有8个自定义字符 •显示容量&#xff1a;162个字符&#xff0c…

【VIC水文模型】准备工作:平台软件安装

VIC水文模型所需平台软件安装 1 Arcgis安装2 Cygwin安装&#xff08;Linux系统&#xff09;3 Matlab/R/Fortran的安装Notepad 4 VIC模型程序代码获取参考 由于VIC模型的编程语言为C语言&#xff0c;交互方式为控制台输指令&#xff0c;需要在Linux系统上运行。Windows 上使用 …

Linux--进程间的通信-命名管道

前文&#xff1a; Linux–进程间的通信-匿名管道 Linux–进程间的通信–进程池 命名管道的概念 命名管道是一种进程间通信&#xff08;IPC&#xff09;机制&#xff0c;运行不同进程之间进行可靠的、单向或双向的数据通信。 特点和作用&#xff1a; 跨平台性&#xff1a;在W…

Vanna-ai 大模型开源项目 基于RAG的TextToSql框架 安装和使用教程

github项目地址&#xff1a;vanna-ai/vanna: &#x1f916; 与 SQL 数据库聊天&#x1f4ca;。通过 LLMs使用RAG进行准确的TextToSQL的生成工作 &#x1f504; 。 Vanna 是 MIT 许可的开源 Python RAG&#xff08;检索增强生成&#xff09;框架&#xff0c;用于 SQL 生成和相关…