找回密码
 会员注册
查看: 21|回复: 0

SpinrgBoot升级总结

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
65944
发表于 2024-10-9 18:29:36 | 显示全部楼层 |阅读模式
SpinrgBoot升级总结 孙景亮 微鲤技术团队 微鲤技术团队 践行数据驱动理念,相信技术改变世界。 16篇内容 2024年08月19日 13:58 江苏 01—背景公司目前使用的Spring Boot版本为1.5.12.RELEASE,该版本较低且不支持MongoDB事务管理功能。随着公司业务的不断扩展和发展,涉及到更多复杂的业务场景,确保数据一致性和事务原子性显得更加重要。基于上述情况,本次对Spring Boot的升级变得至关重要。主要原因包括:实现数据一致性:升级Spring Boot版本以支持MongoDB事务管理功能可以有效保证数据操作的一致性和原子性,避免出现数据不一致或操作异常等问题,提升系统稳定性和可靠性。技术迭代和一致性:随着技术的不断更新和演进,保持技术栈的一致性和与其他技术组件的兼容性是非常重要的。使用更新的Spring Boot版本可以获得更多功能改进和性能优化,以及更好的支持最新的技术要求。开发效率和质量:通过升级Spring Boot版本,开发人员可以更加高效地处理事务管理,简化代码逻辑,提高开发效率和代码质量,减少潜在的错误和维护成本。基于当前的业务需求和技术发展趋势,升级Spring Boot版本以支持MongoDB事务管理是当下的紧迫任务。这将有助于提升公司的技术水平、业务发展和竞争力,同时可以降低风险并为未来的发展做好充分准备。因此,推动Spring Boot版本的升级是非常有必要的。02—版本选择Spring Boot版本支持MongoDB事务管理要求:Mongodb 4.0副本集群、Mongodb 4.2支持分片集群事务(必须)spring.data.mongodb 版本2.1以上(必须)Spring Boot版本2.1以上(必须)目前业务中使用的是Mongodb 4.0及4.0以上版本,因此只需升级Spring Boot、spring.data.mongodb即可。为了在支持MongoDB事务管理的基础上尽量减少项目代码修改范围,因此版本选择如下:spring.data.mongodb:2.1.15.RELEASEspringboot:2.1.12.RELEASE03—版本特征默认动态代理策略默认使用CGLIB动态代理,包括AOP。如果需要基于接口的动态代理, 需要设置spring.aop.proxy-target-class属性为false。WebMvcConfigurerAdapter过时WebMvcConfigurerAdapter这个抽象类已经过时,可以用WebMvcConfigurer替代。// 1.5.12.RELEASEpublic class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter { // ...}// 2.1.12.RELEASEpublic class MyWebMvcConfigurerAdapter implements WebMvcConfigurer { // ...}使用关系型数据库默认的数据库连接池由Tomcat换成HikariCP。性能方面 HikariCP > Druid > tomcat-jdbc > dbcp > c3p0如果在一个Tomcat应用中用spring.datasource.type来强制使用Hikari连接池, 则可以去掉这个override。Redis当使用spring-boot-starter-redis的时候,Lettuce现已取代Jedis作为Redis驱动。仍然支持Jedis,并且你可以任意切换依赖机制,通过排除io.lettuce:lettuce-core和添加redis.clients.jedis的方式。Servlet-specific 的关于 server 的属性一些Servlet-specific已经移动到server.servlet的server.*属性:依赖版本以下库的最低支持版本:Elasticsearch 5.6Gradle 4Hibernate 5.2Jetty 9.4Spring Framework 5Spring Security 5Tomcat 8.5更多特性:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guidehttps://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.1-Release-Notes04—升级步骤步骤1、pom文件修改(1)升级suishen-webx-parent版本 suishen-webx suishen-webx-parent 2.0-SNAPSHOT (2)完成后确认项目中的依赖版本:注意:suishen-webx-parent已将表格中的依赖升级,项目中无需再次手动引入。其他依赖相匹配的版本,请参照:https://docs.spring.io/spring-boot/docs/2.1.12.RELEASE/reference/pdf/spring-boot-reference.pdf步骤2、开启事务(1)启用mongodb事务管理引入@EnableTransactionManagement@EnableTransactionManagementpublic class MainApplication extends SuishenWebxApplication {}(2)配置mongodb事务管理器方式1:使用applicationContext-mongodb.xml配置: 方式2:使用Configuration:@Configurationpublic class TransactionConfig { @Bean public MongoTransactionManager transactionManager(MongoDatabaseFactory factory){ return new MongoTransactionManager(factory); }}步骤3、修改mongo密码由于spring.data.mongodb 2.1.15.RELEASE版本在数据库认证时,会先将密码进行URLDecoder.decode校验,因此mongo密码中的%号需要替换成%25。验证流程可参考:org.springframework.data.mongodb.config.MongoCredentialPropertyEditor.extractUserNameAndPasswordspring.data.mongodb 1.10.15.RELEASE版本spring.data.mongodb 2.1.15.RELEASE版本05—使用事务(1)声明式事务处理添加@Transactional(org.springframework.transaction.annotation.Transactional)注解,代码示例如下 @SuishenLog(logName = "添加策略") public StrategyVo addStrategy(StrategyAddReq addReq) { SuishenUser suishenUser = SecurityContextUtil.getSessionUser(); long now = System.currentTimeMillis(); Strategy strategy = Strategy.builder() .projectId(addReq.getProjectId()) .strategyName(addReq.getStrategyName()) .strategyDesc(addReq.getStrategyDesc()) .status(addReq.getStatus()) .createUser(suishenUser.getNickName()) .createTime(now) .updateUser(suishenUser.getNickName()) .updateTime(now) .build(); strategy = strategyService.addStrategy(strategy); LogContext.instance().appendLog("操作人(%s)", suishenUser.getNickName()) .appendLog("策略id(%s)", strategy.getId()); // 测试代码 if (Objects.nonNull(strategy)) { throw new BusinessException("添加策略失败"); } StrategyLog strategyLog = StrategyLog.builder() .projectId(strategy.getProjectId()) .strategyId(strategy.getId()) .createUser(suishenUser.getNickName()) .createTime(now) .updateUser(suishenUser.getNickName()) .updateTime(now) .build(); strategyLogService.addStrategyLog(strategyLog); return StrategyVo.buildVo(strategy); } @SuishenLog(logName = "添加策略事务") @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public StrategyVo addStrategyTest(StrategyAddReq addReq) { return addStrategy(addReq); }事务传播行为:当事务方法被另一个事务方法调用时,必须指定事务应该如何传播Spring 定义了如下七种传播行为,这里以A业务和B业务之间如何传播事务为例说明:PROPAGATION_REQUIRED :required , 必须。默认值,A如果有事务,B将使用该事务;如果A没有事务,B将创建一个新的事务。PROPAGATION_SUPPORTS:supports ,支持。A如果有事务,B将使用该事务;如果A没有事务,B将以非事务执行。PROPAGATION_MANDATORY:mandatory ,强制。A如果有事务,B将使用该事务;如果A没有事务,B将抛异常。PROPAGATION_REQUIRES_NEW :requires_new,必须新的。如果A有事务,将A的事务挂起,B创建一个新的事务;如果A没有事务,B创建一个新的事务。PROPAGATION_NOT_SUPPORTED :not_supported ,不支持。如果A有事务,将A的事务挂起,B将以非事务执行;如果A没有事务,B将以非事务执行。PROPAGATION_NEVER :never,从不。如果A有事务,B将抛异常;如果A没有事务,B将以非事务执行。PROPAGATION_NESTED :nested ,嵌套。A和B底层采用保存点机制,形成嵌套事务。(2)编程式事务处理代码示例如下 /** * 添加策略事务测试 */ @SuishenLog(logName = "添加策略事务测试") public StrategyVo addStrategyTest2(StrategyAddReq addReq) { // txTemplate可以和transactionManager进行相同的配置,而不需要每次new,本代码仅作为测试使用 TransactionTemplate txTemplate = new TransactionTemplate(mongoTransactionManager); return txTemplate.execute(new TransactionCallback() { @Override public StrategyVo doInTransaction(TransactionStatus transactionStatus) { try { return addStrategy(addReq); } catch (Exception e) { transactionStatus.setRollbackOnly(); } return null; } }); }(3)数据验证执行addStrategy,Strategy新增成功,StrategyLog新增失败执行addStrategyTest,Strategy新增失败,StrategyLog新增失败执行addStrategyTest2,Strategy新增失败,StrategyLog新增失败org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:873) at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:710) at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:534)作者 | 孙景亮 资深服务端开发工程师本文来自微鲤技术团队,转载请注明出处。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-31 05:10 , Processed in 0.493018 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表