前提,笔者是一名PHP开发,负责项目也一直是PHP项目,公司近期要对PHP项目用Java重构改造升级,最近一年的时间从Java基础知识储备,到项目搭建,再到项目上线,经历了两个“0-1”过程,也在这个时间点对自己一年的工作做一个小结。
业务层的代码仓库-------“0-1”
老古人说,工欲善其事,必先利其器。在开始敲代码前其实我们还有很多要做的准备工作,这一步包括但不局限于:
1、技术选型:列出项目初期的技术栈,包括语言、框架和中间件等;以及未来两年在此基础上迭代更新的技术体系
2、部署架构:一份能根据公司整体架构延伸出来的部署架构设计,实现业务之余也应该保持与公司的整体一致性,方便后期维护
3、异常处理机制:前后端异常机制的统一、后端的上下文异常处理统一等
4、编码风格:采用alibaba编码风格,因为是java届的新人,所以直接用阿里大佬的已有经验较为稳妥
5、静态代码检查:由弱类型语言php转到强类型语言,在编码习惯上肯定有多多稍稍的差异,为了避免这种硬件化的差异可以引入第三方的检查工具,包括且不限于,IDE中的Alibaba Java Coding Guidelines plugin以及Sonar等
6、开发文档:后期维护的重要一环,我想各位多多少少都有因为文档信息的缺失变得很躁动2333。这里推荐Yapi和Swagger,Yapi优势就是可视化界面友好,可兼容swagger导入,并且可以给前端提供mock数据,缺点也是显而易见,多一步导入操作,也会产生版本不一致的问题;而Swagger则是需要编写很多注解,这对开发者的自律性要求还是很高的,当然公司强制要求可忽略,我们最后采用的是Yapi
之前的总体架构模式是“前端层--业务层--服务层--DB”,服务层在最近几年已经陆陆续续开始升级为Java项目,其实也积累了一定的代码仓库,但是由于前期没有一个合理的规划,大部分服务设计都较为贫血,没有为后期升级做过多的冗余思考。交互规范、异常处理规范、通用的返回值封装都不适用与前端与业务的交互,所以要结合公司已有的仓库和业界大佬的已有方案设计一套属于业务层的代码仓库。
业务层的代码-------“0-1”
当前期工具都准备或者大致敲定了,那么现在已然开始写代码了,业务的难点不同于服务的“三高”,而在于聚合数据以及业务本身的逻辑上面,又有一堆重要的问题浮现上来:
7、代码该如何分布?之前在写PHP代码,至少我负责的项目是一个老旧的PHP项目,像是一坨shi。MVC,视图层有大量逻辑,甚至直接调用控制器层代码;控制器层的逻辑看不同人的风格,有的逻辑多,有的逻辑少,甚至还有控制器调用控制器的极限操作;模型层更不用说了,如果你们想理解一下“混沌模型”,我想来看一眼这个shi,肯定能瞬间理解。感谢重构给我这一次机会。
言归正传,有两套模型摆在我面前传统的controller、service、mapper、DAO代码分布模型,或者选用根据业务划分模块的模型,前者每一层代码可以得到很好的复用,后期的阅读难度也较低,但是后者更容易随着业务扩大进行垂直拆分,emmmmm好纠结,不过还是采用了第一种的方案

现在是站在重构完的角度又重新审视了一遍当初的选择,这样的分包模式久而久之必然会使得体系变得庞大,导致部分包过于臃肿,如果再有一次机会,可能会根据业务进行模块的划分进行开发。
8、跨域:本次重构还有一个重大的命题就是前后端分离,不同的项目必然会产生跨域问题。业界解决方案还是挺多的,我这里是采用过滤器,统一设置头。
9、多环境配置:
local:本地开发环境
dev:开发环境
qa:测试环境,交付给测试
huidu:预发布环境,蓝绿发布
prod:线上生产环境
多环境配置也要根据公司的实际情况进行选择,我现在这家公司代码已经隔离,并不能在本地完成所有开发,基本上local和dev是一套环境
10、日志处理:
log4j、Logging、commons-logging、slf4j、logback这些都是常用的日志框架,可能经验丰富的Java大牛都不太分的清楚这些日志框架的关系,对于第一次接触Java的小白来说更是天书,不过在前辈的指引和对这几种日志框架了解后,选择了logback,原因也很简单,业界主流的框架,相对比log4j家族来说速度更快占用内存更少,当然各位如果觉得其他更适合自己也可以酌情选用。
框架啰嗦了一大堆废话,比起选择框架,更重要的应该是制定一套日志使用规范,开发PHP的时候,我遇到过一位开发,他在封装好的http client里打印了一个日志,而且没去掉还上线了,导致了当天日志量惊人,而且没有任何价值。所以,对于一个优秀的开发工程师来说,正确的打印日志的姿势才是最正确的,这种思想应该是高于语言高于框架。日常接触最多的日志级别应该error、warn、info、debug,一般情况下前三者在任意环境都可以输出日志,而debug级别需要开启配置才能开启(一般在local、dev、qa开启),再比如error记录逻辑bug,warn记录参数错误bug,info记录耗时、开始结束、入参等有价值的信息,还有就是打印日志要在最上层的try catch块中打印,不要又抛出异常又打印日志,等等,还有很多细节,下次整理后再一同分享。
最后再啰嗦两句,公司引入了CAT监控,也是对日志、链路的一种收集和监控,下次一起分享
11、常用的第三方库:这里给大家列举几个这次在我开发过程中常用的类库,包括但不局限于
Guava:来自Google的常用类库,令牌桶,削峰限流手段
Apache Commons:来自Apache的常用类库
Jackson 2:Json数据的序列化和反序列化,需了解
jjwt:Jwt token认证,后期需考虑jwt安全性升级,比如在使用令牌的同时加入唯一性校验等等
Lombok:自动生成常见Java代码,比如equals()方法,getter和setter等;
Feign:声明式Rest客户端
easyexcel:生成excel
12、自动化脚本:这里推荐 mybatis-generator github地址,自动化脚本很重要,这为后期维护提供了很大的便利
13、单元测试等等不一一列举了
小结
第一次接触Java开发,不免会代入一些曾经PHP开发的思想,设计思路也受限于个人的天花板,可能没有太多的前瞻性,也会根据业界的设计不断丰富自己的设计,也欢迎各位前来讨论
网友评论