美文网首页微服务架构和实践
Spring Cloud升级Finchley版本小结及遇到的坑

Spring Cloud升级Finchley版本小结及遇到的坑

作者: 暴走的初号机 | 来源:发表于2018-11-21 13:20 被阅读17次

    Finchley正式RELEASE版本发布也有段时间了,如果想体验spring boot2.0的魅力以及spring 5.0的新功能,自然是要把Spring Cloud升级至F版。升级过程小结如下

    准备工作

    升级步骤非常简单,修改一下pom依赖项即可,maven会自动下载所有的对应依赖(注意jdk必须为1.8以上版本),这也是我喜欢spring boot的原因,清爽不紧绷~
    原来的配置为

    <version.spring-boot>1.5.14.RELEASE</version.spring-boot>
    <version.spring-cloud>Edgware.SR3</version.spring-cloud>
    

    直接修改为F版的依赖配置(此处按照官方文档的配置,第一个坑)

    <version.spring-boot>2.0.1.RELEASE</version.spring-boot>
    <version.spring-cloud>Finchley.SR2</version.spring-cloud>
    

    趟坑之旅

    下载完更新依赖之后,发现有一个地方报错,找不到eureka-client组件,原配置为

    <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    

    F版中spring cloud对这个组件的命名规范做了调整,增加了公司名,个人感觉是为了以后接入更多的注册中心做准备,比如 spring-cloud-alibaba-nacos这类的,修改配置如下:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    

    依赖项解决,启动服务,发现起不来-_-#,系统报错有循环依赖

    ***************************
    APPLICATION FAILED TO START
    ***************************
    Description:
    The dependencies of some of the beans in the application context form a cycle:
        servletEndpointRegistrar defined in class path resource [org/springframework/boot/actuate/autoconfigure/endpoint/web/ServletEndpointManagementContextConfiguration.class]
        ↓
        healthEndpoint defined in class path resource [org/springframework/boot/actuate/autoconfigure/health/HealthEndpointConfiguration.class]
        ↓
    

    在百度一顿谷歌之后,发现是 actuate组件的健康检测和我自己注入的数据库连接池产生了循环依赖。因为spring boot2的默认数据库连接池改成了 Hikari,官方文档显示这是spring boot2的一个早期bug...(要不怎么叫趟坑之旅呢),把spring boot依赖升级到最新的2.0.6.RELEASE,应用可以正常启动了
    启动完成后,发现eureka注册中心里面注册的服务显示不了正确的ip地址了,一顿查之后发现是配置又改了...,原来是

    ${spring.cloud.client.ipAddress}
    

    现在要改成

    ${spring.cloud.client.ip-address}
    

    之后又发现项目里面有很多报错,因为我项目里用到jpa的语法做数据库查询(正常项目里应该都会用到),没错,spring boot2的jpa语法又改了...
    原来的写法

    Service service = serviceRepository.findOne(id);
    

    需要改成

    Service service = serviceRepository.findById(id).get();
    

    同理还有 existsdelete方法都要改成 existsByIddeleteById,所幸项目本身还在起步阶段,要改的地方不多,改完之后项目终于不报错了,启动完验证接口测试成功。

    总结一下:前几步都是配置问题,耐心修改完即可,最后一步因为涉及到代码的修改,需要慎重评估,如果有项目中已经在大量使用原spring boot1.5的jpa,建议慎重考虑(当然还有一种方法可以单独降级jpa的版本至1.x版本,但不确定是否会和spring boot2有兼容性问题)。另外实测spring boot2的应用去连老版本的eureka和config server都没有问题,应该是对应服务的restful接口并没有修改,所以基础组件也可以不升级。针对 SpringCloudGateway2.0 以及 spring boot2的新特性,待后续分享。

    相关文章

      网友评论

        本文标题:Spring Cloud升级Finchley版本小结及遇到的坑

        本文链接:https://www.haomeiwen.com/subject/eqzqqqtx.html