springboot2。7。6升级springboot3。0。2小结
项目脚手架
项目脚手架是基于springBoot2.7.6+jdk17的springCloud分布式微服务架构。主要组件和框架有:nacos,sentinel,springCloudGateway,kafka,elasticsearch,mysql,redis,caffeine,mapstruct,swagger2,skywalking,mybatis-plus。前段时间本来是jdk1.8的,后面升到了jdk17,jdk升级就记得启动脚本里要加:--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED。下面进入正题,升级springboot3.0.2过程。升级难点
1:版本依赖
2:springCloudGateway升级异常
3:KafkaTemplate
4:swagger改成了springdoc
5:redis配置文件改动版本依赖
springboot3升级了大部分的依赖,我拿几个重点的,当然有的可能是没必要升级,我没一个一个试,基本都是找的最新版本。代码里面主要修改就是javax改成了jakarta,这个使用idea或者其他工具全局替换就行。spring-boot-dependencies:3.0.2 spring-cloud-dependencies:2022.0.1 spring-cloud-alibaba-dependencies:2022.0.0.0-RC1 spring-cloud-starter:4.0.1 spring-cloud-starter-gateway:4.0.1 spring-boot-admin-starter-server:3.0.0 jakarta.xml.bind-api:4.0.0 ojdbc8:21.9.0.0 mysql-connector-java:8.0.32 hibernate-validator:8.0.0.Final mybatis-plus-boot-starter:3.5.3.1 mybatis-spring-boot-starter:3.0.1 dynamic-datasource-spring-boot-starter:3.6.1
有个重要的依赖,swagger2已经不适用springboot3了,我换成了springdoc com.github.xiaoymin knife4j-openapi3-jakarta-spring-boot-starter 4.0.0
javax改成jakarta,当然不止这一个,其他的就全部替换就OK。
javaxspringCloudGateway
网关在升级的时候,我碰到了两个问题,一个是说网关的依赖里面有spring-boot-starter-web的依赖,导致报错,这个我没去找具体哪个依赖了,直接在配置文件里面加了个配置搞定:spring.main.web-application-type=reactive。还有一个是说有两个CacheManager的bean。我只找到一个,直接重写覆盖LocalResponseCacheAutoConfiguration类,在gatewayCacheManager方法上加了一个注解@Primary搞定。@Primary @Bean( name = {"gatewayCacheManager"} ) public static CacheManager gatewayCacheManager(LocalResponseCacheProperties cacheProperties) { CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager(); caffeineCacheManager.setCaffeine(caffeine(cacheProperties)); return caffeineCacheManager; }
还有一个小问题,网关的sentinel报错信息有修改,原先我项目里有个方法handleBlockedRequest,我直接去掉了。现在改成了继承SentinelGatewayBlockExceptionHandler类,重写handle方法直接返回一个json数据。KafkaTemplate
项目中用的消息中间件是kafka,以前发送消息是:// 发送消息 ListenableFuture> future = kafkaTemplate .send(TOPIC_TEST, TOPIC_GROUP1, obj2String); future.thenAccept(new ListenableFutureCallback>() { @Override public void onFailure(Throwable throwable) { //发送失败的处理 log.info(TOPIC_TEST + " - 生产者 发送消息失败:" + throwable.getMessage()); } @Override public void onSuccess(SendResult stringObjectSendResult) { //成功的处理 log.info(TOPIC_TEST + " - 生产者 发送消息成功:" + stringObjectSendResult.toString()); } });
现在是// 发送消息 CompletableFuture> future = kafkaTemplate.send(TOPIC_TEST, TOPIC_GROUP1, obj2String); // 成功 future.thenAccept(result -> { log.info(TOPIC_TEST + " - 生产者 发送消息成功:" + result); }); // 失败 future.exceptionally(e -> { log.info(TOPIC_TEST + " - 生产者 发送消息失败:" + e.getMessage()); return null; });swagger
swagger改动超级大,只怪当时项目用了swagger2注解,果断改成了springdoc
依赖换成:knife4j-openapi3-jakarta-spring-boot-starter
注解改动
1:controller类注解:io.swagger.annotations.Api改成了io.swagger.v3.oas.annotations.tags.Tag;
controller类
2:controller方法注解:io.swagger.annotations.ApiOperation;改成了io.swagger.v3.oas.annotations.Operation;
controller方法
3:请求参数注解:io.swagger.annotations.ApiModel和io.swagger.annotations.ApiModelProperty都换成了io.swagger.v3.oas.annotations.media.Schema;
请求参数
注意这里以前的@ApiModelProperty 里面有个参数required换成了requiredMode,position参数没了,都要改。
还有swagger配置也要改,这是我直接从网上抄过来的配置,以前我还能分组的,现在不好使了,只有一个全部接口的分组了,打开贼慢。有时间我再试试。@Configuration public class SwaggerConfig { @Autowired private SwaggerModel docketInfos; /** * 根据@Tag 上的排序,写入x-order * * @return the global open api customizer */ @Bean public GlobalOpenApiCustomizer orderGlobalOpenApiCustomizer() { return openApi -> { if (openApi.getTags()!=null){ openApi.getTags().forEach(tag -> { Map map=new HashMap<>(); map.put("x-order", RandomUtil.randomInt(0,200)); tag.setExtensions(map); }); } if(openApi.getPaths()!=null){ openApi.addExtension("x-test123","333"); openApi.getPaths().addExtension("x-abb",RandomUtil.randomInt(1,200)); } }; } @Bean public GroupedOpenApi userApi(){ String[] paths = { "/**" }; String[] packagedToMatch = { docketInfos.getUrl() }; return GroupedOpenApi.builder().group("全部接口") .pathsToMatch(paths) .addOperationCustomizer((operation, handlerMethod) -> { return operation.addParametersItem(new HeaderParameter().name("type").example("gateway").description("报文头来源").schema(new StringSchema()._default("type").name("gateway").description("报文头来源"))); }) .packagesToScan(packagedToMatch).build(); } @Bean public OpenAPI customOpenAPI() { Info info = new Info(); info.setTitle(docketInfos.getTitle()); info.setDescription(docketInfos.getDescription()); info.setTermsOfService("www.baidu.com"); Contact contact = new Contact(); contact.setName("123456"); contact.setUrl("www.baidu.com"); contact.setEmail("123456@163.com"); info.setContact(contact); info.setVersion(docketInfos.getVersion()); info.setSummary(docketInfos.getDescription()); return new OpenAPI().info(info); } }redis
redis主要是配置文件改了,以前是spring.redis....改成了spring.data.redis....
其他暂时没发现什么改动。总结
目前我项目中遇到暂时就遇到了这些,还有些组件没去试,像skywalking,es这些,还没试功能,项目能正常启动,交易能发通,就算升级成功了。还有一点,项目中用到了xxl-job,这个没升级成功,升级之后freemarker模板有问题,让人头大,先不管了。