springboot2.0.3升级记录

前言:最近公司在要求进行微服务的框架升级,搭了一个开发骨架,写了一个使用手册。突然发觉好久没有写博客了,就把手册的东西整理下分享给大家,。微服务基础框架2.0是基于springboot 2.0.3.RELEASE及springcloud Finchley.RELEASE版本搭建的,在从1.x至2.x升级过程中会存在一些版本差异,为了让大家少踩一些坑,本文将主要针对升级过程中存在的问题及注意事项进行罗列说明。

  • 注意事项
  • 服务注册与发现

2.0之后我们暂不继续使用Eureka作为服务注册与发现组件,将使用Consul进行替换,启动类上的注解只能使用@EnableDiscoveryClient,配置信息如下图:

springboot2.0.3升级记录

  • 属性配置变动
  • 一些servlet特有的server.* 的属性已经被移至server.servlet:下,如下图:

springboot2.0.3升级记录

  • security节点已挂载至spring节点下,并且大部分属性已不再建议使用,主要保留用户验证所需的属性,如下图:

springboot2.0.3升级记录

  • endpoints配置更新,Actuator不再有单独的安全自动配置(management.security.*属性消失),如下图:

springboot2.0.3升级记录

  • 文件上传的相关配置调整,节点为spring.servlet.multipart

springboot2.0.3升级记录

  • 客户端获取ip的配置,springcloud Finchley.RELEASE是spring.cloud.client.ip-address
  • Basic验证方式

升级2.0之后,如果需要在服务间的请求调用时进行baisc验证,需要引入spring-boot-starter-security依赖,并且需要通过重新进行HttpSecurity的配置,以达到basic验证的效果,具体操作如下:

  • 在配置文件中配置认证信息(用户名和密码自定义),如下图:

springboot2.0.3升级记录

  • 新增配置类,如下图:

springboot2.0.3升级记录

  • 数据库操作问题

Springboot2.0.2.RELEASE之后的版本默认的数据源并不是org.apache.tomcat.jdbc.pool.DataSource,而是:com.zaxxer.hikari.HikariDataSource,后者号称性能最好,当然我们也可以根据业务需要去引入不同的数据源。在升级2.x之后,数据库的操作主要都出现在JPA的使用上,如下:

  1. JPA的方法变动,JPA中findone==>getOne,save(Collection)==>saveAll(Collection),delete(id)==>deleteById(id)等等,在引入2.x的包后,重新编译就会产生错误提示,通过查看源码不难发现新的替代方法
  2. JPA主键自增需要指定策略,可以选择在对应Entity的主键上加入@GeneratedValue(strategy= GenerationType.IDENTITY)注解,或者使用统一配置spring.Jpa.Hibernate.use-new-id-generator-mappings: false,否则会出现hibernate_sequence doesn't exist 的相关问题
  3. 通过源码查看,JPA的getOne存在延迟加载,会新增一些hibernate的延迟加载属性,例如:"hibernateLazyInitializer", "handler"等。在使用jackson进行json对象转换时会出现转换异常,可以通过在实体类上注解来解决该问题,如果还有发现类似情况,欢迎补充

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})

  • Redis缓存机制

在2.x中,springboot已经为我们默认了缓存配置,若需要进行自定义redis缓存相关的配置可以通过注入RedisCacheManager,详细代码如下图:

springboot2.0.3升级记录

  • 服务请求问题

引入security后, 原本正常的服务出现请求403服务问题;这是因为,security中默认启用csrf,所有http请求都被会CsrfFilter拦截。如下图,有一个私有类DefaultRequiresCsrfMatcher实现了该接口,只有GET|HEAD|TRACE|OPTIONS这4类方法会被放行,其它Method的http请求,都要验证_csrf的token是否正确,而通常post方式调用rest服务时,又没有_csrf的token,所以校验失败

springboot2.0.3升级记录

 

 

小结

同分享,共进步。以上是我在进行2.0升级工程中的一个简单总结,希望对大家使用2.0开发会有所帮助,如果有出现文档中所未提及的问题点,也请积极告知于我。有好的想法或建议,欢迎与我咬舌,一起为版本升级添砖加瓦。Thks!