应公司要求,使用springboot,从已有服务A中拆分出一个小服务B。
B服务现有功能很简单,所以没有什么干货。记录一下集成遇到的一些问题。水平有限,欢迎指正。
接收这个任务之后,我想了很多。
首先,是否有必要拆分?
结合一些常见的坑,我觉得有必要。因为A服务并不依赖B,B是一个业务相对独立的服务,逻辑上是可分的。如果不分,那么B服务的升级,就需要更新整个A服务,A服务是否可用,也一定程度上受B服务的影响。
直觉有了,又借鉴了一些前辈的经验(这里笔者有话叨:作为一个撸码多年的渣农,极度推崇曾经看到的一句话,大意是,自己思考,谷歌搜索,与人讨论,这三步基本可以解决一切问题。划重点,谷歌搜索。),该拆。
该拆到拆,还多个该字。是否能拆?拆的工作量有多大?拆了之后,怎么做回归测试,来验证原有功能不受影响?拆前有理论支持,拆后怎么验证其必要性?
每次总容易想很多,可是不知道从什么时候起,还很认同一句话:合格的工程师,更多的时间用于思考,少量的时间用于实现。想的越多,实现起来就越简单,安全,高效,稳定,等等。所以,该想的总还是要想。想到的,总还是要解决。
是否能拆呢?我逐一去检查了B服务所有功能涉及的相关服务及其大致的流程,感谢A服务中对B服务进行编写的前人,他们高瞻远瞩的良好设计,使得B服务虽然代码放在了A服务中,但主要逻辑基本是独立于A服务编写的。这样一来,工作量也基本有个数,那就着手开拆了。至于回归测试,肯定是要交到专业的测试人员了。拆分的必要性,我相信拆完之后,大家用几次,心里自然就明白了。
开拆之前,我列出了所能想到的拆分涉及的过程,步骤。
- 确定B服务已有的全部功能,及流程
- 列出B服务涉及的全部数据源
- 确定A服务与B服务的交集,及交集的处理方式
- 项目框架组合的选择
- 公司内部对项目配置,构建,发布,测试,监控等相关要求的处理
- 框架的搭建
- 逻辑的填充
- 测试
交集的处理方式:简单粗暴的复制,因为交集小的可怜,而且在拆分之后,没有多少公用的特征。
项目框架组合的选择:考虑到B服务目前功能相对简单,而且基本没有并发,内存基本够用,那么优先级更高的,应该是快速完成稳定的拆分。又考虑到组内没有前端支持,所以,怎么简单怎么来,要什么自行车?springboot+thymeleaf+mybatis,构建基于Maven就足够了。
框架的搭建,有几句要多念叨念叨。
因为近两年,习惯了前后端分离,忽然不分离了,总时不时有些恍惚。而且自出道以来,我也没正儿八经搞过商用的前后端不分离的项目。
那么,要搞多模块吗?怎么搞?
多模块这边考虑的有点着急,也有些乱,而且最后也没采用,所以等有空再来梳理这一段,当时的思考历程,相对专业的理论分析,以及如果要做,要怎么做的方案。
此处暂时省略n个字。
搭框架,简单的说,是为了将所有选定的技术组合起来,跑通从请求到响应的流程。比如处理好对资源的权限控制和预处理,处理好日志,接通数据源。
往细了说,我认为最少还应该重视两点。第一,制定标准。第二,方便后续的同学协同开发。
需要制定的标准有很多个。比如,统一的返回。在接口或页面资源存在的情况下,不管是否正常返回,也不管返回内容是什么,应该要有个统一的格式。这个统一的格式,对后续协同开发的同学来说,最好是透明的。要想做到统一的返回,必须要配合统一的异常处理。因为要保证抛出异常时,返回的格式不变,不管是捕获到的,还是没有捕获的。这一点,对后续同学来说,也最好是透明的。
方便后续的同学协同开发,这里最好是能实现一些工具(如Json,Date,并发工具),并对这些工具,和引入的其他三方工具库(如guava)的职责,编写一个简单的文档。这样新加入这个项目的同学,就可以避免重复造轮子。
已经这么迟了啊~手动拜托,身体扛住。
让我再记一些久了就容易模糊的小东西。
学会利用官方文档,很多东西,官网上写的很详细。比如前端模板修改了,怎么不去重启整个服务,就能动态的替换?这也是为了让后续同学在重写模板的时候,不至于骂街。方法很多地方都能搜到,第一步,引入devtools,第二步,配置前端模板的cache为false。可是我尝试之后,并不work。只能求助文档。文档太详细了。详细的介绍了devtools,应该在maven引入的时候置为optional,从而避免生产环境下,以jar文件的形式启动也会包含devtools(打成jar包的时候就不包含devtools了);详细的介绍了devtools,包含了很多的特性,用于方便开发过程;详细的介绍了上述问题的两个步骤,以及在不同IDE下触发work条件的方式。
请求依次经过我们配置的filters,然后spring查找对应的servletHandler,如果有handler,进入interceptor(如果没有,返回404。注意,即使是Get/Post不支持,也无法匹配到handler),再进入aop,交付method执行,此时才进行参数处理,发生缺失参数,参数类型不匹配,又或者是controller中抛出其他异常,都会进入controllerAdvice(API使用RestControllerAdvice)中的exceptionHandler进行统一处理。
好了,有空在接着写吧。