首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringCloud 微服务集群升级记录(1.5.x-2.7.18)

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

作者头像
阿提说说
发布于 2023-12-02 02:41:32
发布于 2023-12-02 02:41:32
46500
代码可运行
举报
文章被收录于专栏:Java技术进阶Java技术进阶
运行总次数:0
代码可运行

前言

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

项目背景

项目微服务技术栈: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中加入依赖,过期的配置会提示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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以后不允许循环依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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、跨域头修改

由原来的修改为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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配置过期

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
The use of configuration keys that have been renamed was found in the environment:

Property source 'ApolloBootstrapPropertySources':
	Key: spring.datasource.data
		Replacement: spring.sql.init.data-locations
	Key: spring.datasource.platform
		Replacement: spring.sql.init.platform
	Key: spring.datasource.schema
		Replacement: spring.sql.init.schema-locations

修改:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  sql:
    init:
      platform: mysql
      #执行的sql语句
      data-locations: classpath:data.sql
      #执行的建表语句
      schema-locations: classpath:schema.sql

11、Eureka 配置的修改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
instance-id: ${spring.cloud.client.ip-address}:${server.port}

metadata-map:
  user-name: ${spring.security.user.name}
  user-password: ${spring.security.user.password}

12、上传配置的修改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  servlet:
  #最大上传大小,MB
    multipart:
      max-file-size: 1000MB
      max-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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Bean
public LoadBalancerClient blockingLoadBalancerClient(LoadBalancerClientFactory loadBalancerClientFactory) {
   return new BlockingLoadBalancerClient(loadBalancerClientFactory);
}

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

增加如下类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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.
     */
    @Bean
    public 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;

        @Override
        public int accept(Method method) {
            if (METHOD.equals(method.getName())) {
                return 0;
            }
            return 1;
        }
    }

    private enum LookupHandlerMethodInterceptor implements MethodInterceptor {
        INSTANCE;

        @Override
        public 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
                // NoSuchMethodError
                return 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);
        }

        @Override
        public 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 lookupHandler
                enhancer.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、负责均衡找不到下游服务的问题

增加如下类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class RibbonEurekaClientConfig {

    @Autowired
    private DiscoveryClient discoveryClient;

    @Bean
    @Lazy
    public IPing ribbonPing() {
        return new DummyPing();
    }

    @Bean
    @Lazy
    public IRule ribbonRule(IClientConfig clientConfig) {
        AvailabilityFilteringRule rule = new AvailabilityFilteringRule();
        rule.initWithNiwsConfig(clientConfig);
        return rule;
    }

    @Bean
    @Lazy
    public ServerList<?> ribbonServerList(IClientConfig clientConfig) {

        return new ServerList<Server>() {
            @Override
            public List<Server> getInitialListOfServers() {
                return new ArrayList<>();
            }

            @Override
            public 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 自动配置详解
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringCloud之zuul源码解析 原
    zuul各版本实现存在一些微小的变化,总的实现思想未改变,以spring-cloud-netflix-core-1.3.6.RELEASE为例
用户2603479
2018/08/16
6780
扩展Zuul实现ignored-patterns的byPass功能
zuul可以设置zuul:ignored-patterns 用于设置屏蔽的url,
温安适
2019/01/25
2K0
扩展Zuul实现ignored-patterns的byPass功能
Zuul源码分析之 网关处理流程
1.Spring Cloud对Netflix Zuul做了封装集成, 使得在Spring Cloud环境中使用Zuul更方便,只需添加spring-cloud-starter-zuul maven依赖及启动类上添加@EnableZuulProxy就可创建一个zuul应用。
全栈开发Dream
2021/05/25
7260
Zuul源码分析之 网关处理流程
Springcloud之zuul的ZuulController
    Springcloud的版本是Greenwich.SR2,Springboot版本是2.1.6.release.
克虏伯
2019/07/04
1.6K0
Springcloud之zuul的ZuulController
SpringCloud 服务调用
​ https://github.com/Netflix/ribbon/wiki/Getting-Started
OY
2022/03/17
4460
SpringCloud 服务调用
SpringCloud 微服务实现方式 原
消费启动服务,注意EnableFeginClients 一定要加basePackages,要不然扫不到单独作为api的jar包里面接口
用户2603479
2018/08/15
4930
SpringCloud组件:Eureka的服务发现与消费
在之前的章节我们已经把服务注册到Eureka Server,那么我们该怎么调用已经注册后的服务呢? 我们本章来简单的介绍我们具体该怎么调用服务节点请求内容。
恒宇少年
2018/10/10
1.1K0
Spring项目如何集成Gateway和Nacos服务
在本文中,我们将探讨如何在Spring项目中集成Gateway和Nacos服务,帮助初学者成功地完成这些存在解决方案。通过本文,您将了解完整的集成流程和具体实现方法,以提高项目性能和拓展性。
默 语
2025/01/20
3300
SpringCloud:spring-cloud-loadbalancer自定义负载均衡策略实现
网上的视频、博客基本都是使用spring-cloud-starter-netflix-ribbon这个依赖实现的,但springcloud在2020.0.0之后,移除掉了netflix-ribbon 使用eureka-client中的loadbalancer,使用自定义负载均衡不使用IRule接口,所以就遇到了很多问题,但这里也会复盘一下传统的实现!之后再讲新方法的实现,当然,也可以直接跳到二、使用LoadBalancer实现直接阅读新方法的使用
Freedom123
2024/03/29
1.6K0
SpringCloud(三)-应用间通信(慕课网廖师兄SpringCloud微服务实战)
1. RestTemplate直连消费服务 核心依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--HttpClient--> <dependency> <groupId>org.ap
Meet相识
2018/09/12
1.8K0
SpringCloud(三)-应用间通信(慕课网廖师兄SpringCloud微服务实战)
我23岁那年才搞懂微服务网关Zuul的主要工作原理,我真的落伍了吗
Zuul对HTTP请求的处理核心就是ZuulServlet类,而ZuulServlet本质上是符合Java EE规范的Servlet实现类。Zuul的核心处理逻辑由一系列Filter组成,而这些Filter全部封装在ZuulServlet类的Runner中 , Runner 在 接 收 到 HTTP 请 求 后 会 依 次 调 用 ZuulFilter , 而ZuulFilter则是Zuul在初始化时加载到FilterProcessor的Filter实例。
愿天堂没有BUG
2022/10/28
1.5K0
我23岁那年才搞懂微服务网关Zuul的主要工作原理,我真的落伍了吗
Spring-Boot:Spring Cloud构建微服务架构
概述:   从上一篇博客《Spring-boot:5分钟整合Dubbo构建分布式服务》 过度到Spring Cloud,我们将开始学习如何使用Spring Cloud 来搭建微服务。继续采用上一篇博客
九灵
2018/03/09
2.3K0
Spring-Boot:Spring Cloud构建微服务架构
服务注册与发现组件 Eureka 客户端实现原理解析
在前面的文章介绍了,如何使用服务注册发现组件:Eureka,并给出使用示例。本文在此基础上,将会讲解 Eureka 客户端实现的内幕,结合源码深入实现的细节,知其所以然。客户端需要重点关注以下几点:
aoho求索
2019/09/25
2.3K0
服务注册与发现组件 Eureka 客户端实现原理解析
【SpringCloud】深入探究Eureka:构建微服务架构中的高效服务发现系统
小尘要自信
2023/10/10
7730
【SpringCloud】深入探究Eureka:构建微服务架构中的高效服务发现系统
SpringCloud 微服务分布式 笔记(二)
微服务在消费远程API时总是使用本地缓存中的数据。 因此一般来说,即使Eureka Server发生宕机,也不会影响到服务之间的调用。
Java_慈祥
2024/08/06
2180
SpringCloud 微服务分布式 笔记(二)
SpringCloud之Eureka
Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理。
shaoshaossm
2022/12/27
2860
SpringCloud之Eureka
相关推荐
SpringCloud之zuul源码解析 原
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档