SpringCloud 微服务集群升级记录(1.5.x-2.7.18)

前言

前段时间,因项目被扫出大量漏洞,全是因为依赖版本过低,存在高中危漏洞需要升级。正好本来也有规划集群升级,因为工作量大迟迟落实不了,正好有这次修漏洞的机会,升级微服务集群。这篇文章主要记录了本人的升级记录,遇到的问题解决方法,仅供参考。

项目背景

项目微服务技术栈:Spring Boot 1.5.x 、Spring Cloud、Kafka、RabbitMq、Mysql、Eureka、Apollo、Nacos。Spring Boot 是1.5.x 版本非常老旧,Spring Cloud 版本也早就停更。根据Nacos的兼容情况,Spring Boot 的版本为2.6.13,但目前最新版是2.7.18,由于3.x跟2.x区别较大,因此决定使用2.7.18试试,Spring Cloud 版本为2021.0.5.0。

在这里插入图片描述

升级记录

在xml中加入依赖,过期的配置会提示:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-properties-migrator</artifactId><scope>runtime</scope>
</dependency>

1、Loading class com.mysql.jdbc.Driver'. This is deprecated. The new driver class is com.mysql.cj.jdbc.Driver’

  • 需要更新Mysql驱动

2、Caused by: java.lang.IllegalStateException: Could not resolve element type of Iterable type @。。。。。web.bind.annotation.RequestParam java.util.List. Not declared?

  • @RequestParam(value = "Long[]") List projectIds 此类的代码不能再使用

3、spring.rabbitmq.publisher-confirms 过期

4、Canonical names should be kebab-case (‘-’ separated)

  • 不能使用驼峰形式,用- 隔开

5、import org.springframework.cloud.netflix.feign 修改为 import org.springframework.cloud.openfeign

6、2.6以后不允许循环依赖

spring:main:# Spring Boot 2.6以后 默认不允许循环依赖allow-circular-references: true#允许bean覆盖allow-bean-definition-overriding: true

7、spring.cloud.client.ipAddress 都修改为 spring.cloud.client.ip-address

8、跨域头修改
由原来的修改为

corsConfiguration.setAllowCredentials(true);
corsConfiguration.addAllowedOriginPattern("*");

9、gateway 升级要注意去掉重复跨域头
spring.cloud.gateway.default-filters[0] = DedupeResponseHeader=Access-Control-Allow-Origin Access-Control-Allow-Credentials, RETAIN_FIRST

10、database配置过期

The use of configuration keys that have been renamed was found in the environment:Property source 'ApolloBootstrapPropertySources':Key: spring.datasource.dataReplacement: spring.sql.init.data-locationsKey: spring.datasource.platformReplacement: spring.sql.init.platformKey: spring.datasource.schemaReplacement: spring.sql.init.schema-locations

修改:

  sql:init:platform: mysql#执行的sql语句data-locations: classpath:data.sql#执行的建表语句schema-locations: classpath:schema.sql

11、Eureka 配置的修改

instance-id: ${spring.cloud.client.ip-address}:${server.port}metadata-map:user-name: ${spring.security.user.name}user-password: ${spring.security.user.password}

12、上传配置的修改

spring:servlet:#最大上传大小,MBmultipart:max-file-size: 1000MBmax-request-size: 1000MB

13、原有zuul适配
org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.choose(Ljava/lang/String;Lorg/springframework/cloud/client/loadbalancer/Request;)Lorg/springframework/cloud/client/ServiceInstance

增加如下Bean

@Bean
public LoadBalancerClient blockingLoadBalancerClient(LoadBalancerClientFactory loadBalancerClientFactory) {return new BlockingLoadBalancerClient(loadBalancerClientFactory);
}

14、调用接口报NoSuchMethodError: org.springframework.boot.web.servlet.error.ErrorController.getErrorPath

增加如下类


@Configuration
public class ZuulConfiguration {/*** The path returned by ErrorController.getErrorPath() with Spring Boot < 2.5* (and no longer available on Spring Boot >= 2.5).*/private static final String ERROR_PATH = "/error";private static final String METHOD = "lookupHandler";/*** Constructs a new bean post-processor for Zuul.** @param routeLocator    the route locator.* @param zuulController  the Zuul controller.* @param errorController the error controller.* @return the new bean post-processor.*/@Beanpublic ZuulPostProcessor zuulPostProcessor(@Autowired RouteLocator routeLocator,@Autowired ZuulController zuulController,@Autowired(required = false) ErrorController errorController) {return new ZuulPostProcessor(routeLocator, zuulController, errorController);}private enum LookupHandlerCallbackFilter implements CallbackFilter {INSTANCE;@Overridepublic int accept(Method method) {if (METHOD.equals(method.getName())) {return 0;}return 1;}}private enum LookupHandlerMethodInterceptor implements MethodInterceptor {INSTANCE;@Overridepublic Object intercept(Object target, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {if (ERROR_PATH.equals(args[0])) {// by entering this branch we avoid the ZuulHandlerMapping.lookupHandler method to trigger the// NoSuchMethodErrorreturn null;}return methodProxy.invokeSuper(target, args);}}private static final class ZuulPostProcessor implements BeanPostProcessor {private final RouteLocator routeLocator;private final ZuulController zuulController;private final boolean hasErrorController;ZuulPostProcessor(RouteLocator routeLocator, ZuulController zuulController, ErrorController errorController) {this.routeLocator = routeLocator;this.zuulController = zuulController;this.hasErrorController = (errorController != null);}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (hasErrorController && (bean instanceof ZuulHandlerMapping)) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(ZuulHandlerMapping.class);enhancer.setCallbackFilter(LookupHandlerCallbackFilter.INSTANCE); // only for lookupHandlerenhancer.setCallbacks(new Callback[] {LookupHandlerMethodInterceptor.INSTANCE, NoOp.INSTANCE});Constructor<?> ctor = ZuulHandlerMapping.class.getConstructors()[0];return enhancer.create(ctor.getParameterTypes(), new Object[] {routeLocator, zuulController});}return bean;}}
}

15、负责均衡找不到下游服务的问题
增加如下类:


public class RibbonEurekaClientConfig {@Autowiredprivate DiscoveryClient discoveryClient;@Bean@Lazypublic IPing ribbonPing() {return new DummyPing();}@Bean@Lazypublic IRule ribbonRule(IClientConfig clientConfig) {AvailabilityFilteringRule rule = new AvailabilityFilteringRule();rule.initWithNiwsConfig(clientConfig);return rule;}@Bean@Lazypublic ServerList<?> ribbonServerList(IClientConfig clientConfig) {return new ServerList<Server>() {@Overridepublic List<Server> getInitialListOfServers() {return new ArrayList<>();}@Overridepublic List<Server> getUpdatedListOfServers() {List<Server> serverList = new ArrayList<>();List<ServiceInstance> instances = discoveryClient.getInstances(clientConfig.getClientName());if (instances != null && instances.size() == 0) {return serverList;}for (ServiceInstance instance : instances) {if (instance.isSecure()) {serverList.add(new Server("https", instance.getHost(), instance.getPort()));} else {serverList.add(new Server("http", instance.getHost(), instance.getPort()));}}return serverList;}};}}

在Spring Boot 启动类上配置
@RibbonClients(defaultConfiguration = RibbonEurekaClientConfig.class)

基于Spring Boot 3.1.0 系列文章

  1. Spring Boot 源码阅读初始化环境搭建
  2. Spring Boot 框架整体启动流程详解
  3. Spring Boot 系统初始化器详解
  4. Spring Boot 监听器详解
  5. Spring Boot banner详解
  6. Spring Boot 属性配置解析
  7. Spring Boot 属性加载原理解析
  8. Spring Boot 异常报告器解析
  9. Spring Boot 3.x 自动配置详解

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

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

相关文章

Java操作Excel之 POI介绍和入门

POI是Apache 提供的一个开源的Java API&#xff0c;用于操作Microsoft文档格式&#xff0c;如Excel、Word和PowerPoint等。POI是Java中处理Microsoft文档最受欢迎的库。 截至2023/12&#xff0c; 最新版本时 POI 5.2.5。 JDK版本兼容 POI版本JDK版本4.0及之上版本> 1.83.…

【2】PyQt创建窗口

1. 第一个PyQt窗口 from PyQt5.QtWidgets import QApplication,QWidget import sys# 1.创建应用程序 app QApplication(sys.argv)# 2.创建窗口 w QWidget()# 3.显示窗口 w.show()# 4.等待窗口停止 sys.exit(app.exec()) 执行代码,就会显示PyQt窗口: 2. PyQt模块简介 PyQt中…

Java参数验证@Validated

就以登录接口为例&#xff0c;如果用户传参的时候没有传递帐号或者密码&#xff0c;会报错&#xff0c;但是报错的信息不够全面&#xff0c;前端人员不好判断是什么问题&#xff0c;这个时候就需要对参数进行一个校验 引入依赖 <dependency><groupId>org.hibernat…

JAVAEE初阶相关内容第十八弹--网络原理之TCP_IP【续集】

写在前 上一篇博客的重点内容主要讲了关于传输层的TCP协议、UDP协议。 点击跳转上一篇博客 重点介绍了协议的特点、协议端格式、需要重点理解并掌握TCP的工作机制&#xff08;十条&#xff09;。 TCP与UDP对比&#xff1f; TCP用于可靠传输的情况&#xff0c;应用于文件传输&am…

客服系统优化:薪人薪事无代码开发与API连接简化电商平台集成

无代码开发的革新意义 在数字化时代&#xff0c;企业持续寻求提高效率与竞争力的解决方案。无代码开发技术应运而生&#xff0c;为电商平台与客服系统之间的集成提供了全新的可能。薪人薪事通过其先进的无代码开发能力和灵活的API连接&#xff0c;使得电商平台的集成过程变得前…

一. 初识数据结构和算法

数据结构与算法是一个达到高级程序员的敲门砖。当你脱离了语言的应用层面&#xff0c;去思考他的设计层面时&#xff0c;你就依旧已经开始初识数据结构与算法了 数据结构 什么是数据结构 对于数据结构的定义官方并没有统一的解释&#xff0c;在各个百科以及算法的书中&#xf…

类和对象——(7)this指针

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 人生就像骑单车&#xff0c;想保持平衡…

性能测试流程、指标及常见问题!

1.介绍性能测试流程 a.性能需求分析&#xff08;评审&#xff09; 基于接口或者场景&#xff08;全链路&#xff09;的性能测试指标&#xff0c;一般是tps&#xff08;每秒事务数&#xff0c;这里都是通过的事务&#xff09;及art&#xff08;平均响应时间&#xff09; b.了解…

Lombok的踩坑系列之@Builder

背景&#xff1a; Lombok 这个插件大家日常工作中几乎是必备的&#xff0c;几个简单的注解就可以帮助我们减少一大坨get/set方法等&#xff1b;其中Builder注解使用的也很广泛&#xff0c;使用了建造者模式帮助我们构建出个性化的对象&#xff0c;本次踩坑点就在这个地方。 先…

2D与3D图形的基本变换

1. 2d transformations 1.1缩放(Scaling) 其实这个转换非常简单&#xff0c;如图所示就是把x与y进行s倍的缩放&#xff0c;而我们图中的这个矩阵正好满足这一算法。 1.2镜像(Reflection) 这个镜像变换可以和上面的做类比&#xff0c;简单看一下就行。 1.3错切(Shearing) 当然…

【c】16进制数转化为10进制数(计算方法在最后,大家也可以上网搜索视频,视频更详细,谢谢)

#include<stdio.h> #include<math.h> void trans(char arr1[],int arr[],int n) {puts("请输入16进制的数");for(int i0;i<n;i){scanf("%c",&arr1[i]);arr[i](int)arr1[i];}for(int k0;k<n;k){if(arr[k]>65&&arr[k]<7…

大数据技术1:大数据架构设计理论

1、传统数据处理系统存在的问题 随着信息时代互联网技术爆炸式的发展&#xff0c;人们对于网络的依赖程度日渐加深&#xff0c;在业务中需要处理的数据量快速增加&#xff0c;逐渐飙升到了一个惊人的数量级。并且数据产生的速度随着采集与 处理技术的更新仍在加快。 数据量从兆…

C# 雪花算法生成Id工具类

写在前面 传说自然界中并不存在两片完全一样的雪花的&#xff0c;每一片雪花都拥有自己漂亮独特的形状、独一无二&#xff1b;雪花算法也表示生成的ID如雪花般独一无二&#xff0c;该算法源自Twitter。 雪花算法主要用于解决分布式系统的唯一Id生成问题&#xff0c;在生产环境…

装修流程篇

装修流程 https://www.xiaohongshu.com/explore/627ba70d00000000210357b3 https://www.xiaohongshu.com/explore/63b6bc0c000000002203776f 半包装修流程 https://www.xiaohongshu.com/explore/64e5ea3b0000000003021711 户型图 效果 https://www.xiaohongshu.com/ex…

JVM之GC垃圾收集器(六)

GC 垃圾收集器 Java 堆内存被划分为新生代和年老代两部分&#xff0c;新生代主要使用复制和标记-清除垃圾回收算法&#xff1b;年老代主要使用标记-整理垃圾回收算法&#xff0c;因此 java 虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器&#xff0c;JDK1.6 中 Sun …

FluxMQ—2.0.8版本更新内容

FluxMQ—2.0.8版本更新内容 前言 FLuxMQ是一款基于java开发&#xff0c;支持无限设备连接的云原生分布式物联网接入平台。FluxMQ基于Netty开发&#xff0c;底层采用Reactor3反应堆模型&#xff0c;具备低延迟&#xff0c;高吞吐量&#xff0c;千万、亿级别设备连接&#xff1…

调试GMS应用,报错“此设备未获得play保护机制认证”问题解决

不少同学在调试GMS相关应用时&#xff0c;需登录Google账号&#xff0c;有时会弹出如下通知。 Google登录界面也会出现如下提示 这个报错的原因是设备未通过Google认证&#xff0c;google服务器未配置荣耀设备的型号白名单导致 国内网页有一些指导方法在鸿蒙\荣耀的设备上消除这…

07、pytest指定要运行哪些用例

官方用例 # 目录结构 | |----test_mod.py | |----testing||----test_dir.py# content of test_mod.py import pytestdef func(x):return x 1def test_mod():print("test_mod function was invoked")assert func(3) 5def test_func():print("test_func was in…

【机器学习】聚类(三):原型聚类:高斯混合聚类

文章目录 一、实验介绍1. 算法流程2. 算法解释3. 算法特点4. 应用场景5. 注意事项 二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. 全局调试变量2. 调试函数3. 高斯密度函数&#xff08;phi&#xff09;4. E步&#xff08;getExpectation&#xff09…

ssm农业信息管理系统源码和论文

摘 要 网络的广泛应用给生活带来了十分的便利。所以把农业信息管理与现在网络相结合&#xff0c;利用java技术建设农业信息管理系统&#xff0c;实现农业信息管理的信息化。则对于进一步提高农业信息管理发展&#xff0c;丰富农业信息管理经验能起到不少的促进作用。 农业信息…