由于业务需要,决定将项目中Spring boot版本从1.5升级到2.0。期间遇到一些集成问题,我将一一列举:
1. 项目构建失败
由于spring boot升级,对应的spring cloud版本也从Dalston.SR4升级到了Finchley.RELEASE,保存配置,构建失败错误信息如下:
Could not find method dependencyManagement() for arguments [build_f1mchnmdf23hoatv2p2nvuqwn$_run_closure3@4b87f40] on root project 'authorize' of type org.gradle.api.Project.
解决方案为:在构建脚本中添加插件:
applyplugin:'io.spring.dependency-management'
2. Redis集成问题
2.1 依赖包问题
Spring boot 1.5和2.0依赖的Redis starter 包不一致,需要替换:
1.5: 'org.springframework.boot:spring-boot-starter-redis'
2.0: 'org.springframework.boot:spring-boot-starter-data-redis'
2.2 CacheManager问题
Spring boot删除了原来使用RedisTemplate构建CacheManager的实现,添加了新的使用RedisConnectionFactory构建的方式:
CacheManager的实现2.3 配置参数问题:
Spring boot 1.5 和 2.0版本,Redis的配置参数也发生了变化,对比图如下:
升级前后配置对比说明:Jedis和Lettuce的比较:
Jedis:直连模式,在多个线程间共享一个 Jedis 实例时,是线程不安全的,如果想要在多线程环境下使用 Jedis,需要使用连接池,每个线程都去拿自己的 Jedis 实例,当连接数量增多时,物理连接成本较高。
Lettuce:连接是基于Netty的,连接实例可以在多个线程间共享,所以,一个多线程的应用可以使用同一个连接实例,而不用担心并发线程的数量。当然这个也是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。通过异步的方式可以让我们更好的利用系统资源,而不用浪费线程等待网络或磁盘I/O。
3. 获取配置问题
升级后,注解@ConfigurationProperties的prefix属性不在支持驼峰命名,需要修改为蛇形命名(配置文件中写法不限,oss-info和ossInfo都有效):
正确示例 错误示例Exception encountered during context initialization - cancelling refresh attempt: org.springframework.boot.context.properties.ConfigurationPropertiesBindException: Error creating bean with name 'ossConfig': Could not bind properties to 'OssConfig' : prefix=ossInfo, ignoreInvalidFields=false, ignoreUnknownFields=true; nested exception is org.springframework.boot.context.properties.source.InvalidConfigurationPropertyNameException: Configuration property name 'ossInfo' is not valid
其他坑持续更新……
网友评论