前言:最近公司在要求进行微服务的框架升级,搭了一个开发骨架,写了一个使用手册。突然发觉好久没有写博客了,就把手册的东西整理下分享给大家,。微服务基础框架2.0是基于springboot 2.0.3.RELEASE及springcloud Finchley.RELEASE版本搭建的,在从1.x至2.x升级过程中会存在一些版本差异,为了让大家少踩一些坑,本文将主要针对升级过程中存在的问题及注意事项进行罗列说明。
- 注意事项
- 服务注册与发现
2.0之后我们暂不继续使用Eureka作为服务注册与发现组件,将使用Consul进行替换,启动类上的注解只能使用@EnableDiscoveryClient,配置信息如下图:
- 属性配置变动
- 一些servlet特有的server.* 的属性已经被移至server.servlet:下,如下图:
- security节点已挂载至spring节点下,并且大部分属性已不再建议使用,主要保留用户验证所需的属性,如下图:
- endpoints配置更新,Actuator不再有单独的安全自动配置(management.security.*属性消失),如下图:
- 文件上传的相关配置调整,节点为spring.servlet.multipart
- 客户端获取ip的配置,springcloud Finchley.RELEASE是spring.cloud.client.ip-address
- Basic验证方式
升级2.0之后,如果需要在服务间的请求调用时进行baisc验证,需要引入spring-boot-starter-security依赖,并且需要通过重新进行HttpSecurity的配置,以达到basic验证的效果,具体操作如下:
- 在配置文件中配置认证信息(用户名和密码自定义),如下图:
- 新增配置类,如下图:
- 数据库操作问题
Springboot2.0.2.RELEASE之后的版本默认的数据源并不是org.apache.tomcat.jdbc.pool.DataSource,而是:com.zaxxer.hikari.HikariDataSource,后者号称性能最好,当然我们也可以根据业务需要去引入不同的数据源。在升级2.x之后,数据库的操作主要都出现在JPA的使用上,如下:
- JPA的方法变动,JPA中findone==>getOne,save(Collection)==>saveAll(Collection),delete(id)==>deleteById(id)等等,在引入2.x的包后,重新编译就会产生错误提示,通过查看源码不难发现新的替代方法
- JPA主键自增需要指定策略,可以选择在对应Entity的主键上加入@GeneratedValue(strategy= GenerationType.IDENTITY)注解,或者使用统一配置spring.Jpa.Hibernate.use-new-id-generator-mappings: false,否则会出现hibernate_sequence doesn't exist 的相关问题
- 通过源码查看,JPA的getOne存在延迟加载,会新增一些hibernate的延迟加载属性,例如:"hibernateLazyInitializer", "handler"等。在使用jackson进行json对象转换时会出现转换异常,可以通过在实体类上注解来解决该问题,如果还有发现类似情况,欢迎补充
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
- Redis缓存机制
在2.x中,springboot已经为我们默认了缓存配置,若需要进行自定义redis缓存相关的配置可以通过注入RedisCacheManager,详细代码如下图:
- 服务请求问题
引入security后, 原本正常的服务出现请求403服务问题;这是因为,security中默认启用csrf,所有http请求都被会CsrfFilter拦截。如下图,有一个私有类DefaultRequiresCsrfMatcher实现了该接口,只有GET|HEAD|TRACE|OPTIONS这4类方法会被放行,其它Method的http请求,都要验证_csrf的token是否正确,而通常post方式调用rest服务时,又没有_csrf的token,所以校验失败
小结
同分享,共进步。以上是我在进行2.0升级工程中的一个简单总结,希望对大家使用2.0开发会有所帮助,如果有出现文档中所未提及的问题点,也请积极告知于我。有好的想法或建议,欢迎与我咬舌,一起为版本升级添砖加瓦。Thks!