搭建一个java项目的脚手架总结
最近一个月在公司经历了两个项目的从零到一的过程,都涉及到了从最初的只有需求,没有代码仓库的情况。一般情况下,迫于时间压力,我们一直都期望在一个比较完善项目上做小的修改,但是,往往天不随人愿,这里我整理一下一个新项目搭建的普遍方法,作为后续的工作之用,从而提高效率。
1.reade.md
编写readme文档,其如要内容需要包括,但不限于如下内容:
- 项目简介:用一两句话简单描述该项目所实现的业务功能;
- 技术选型:列出项目的技术栈,包括语言、框架和中间件等;
- 本地构建:列出本地开发过程中所用到的工具命令;
- 领域模型:核心的领域概念,比如对于示例电商系统来说有Order、Product等;
- 测试策略:自动化测试如何分类,哪些必须写测试,哪些没有必要写测试;
- 技术架构:技术架构图;
- 部署架构:部署架构图;
- 外部依赖:项目运行时所依赖的外部集成方,比如订单系统会依赖于会员系统;
- 环境信息:各个环境的访问方式,数据库连接等;
- 编码实践:统一的编码实践,比如异常处理原则、分页封装等;
- FAQ:开发过程中常见问题的解答。
注意:readme文档,一定要持续更新,否则,会造成文档和代码的不一致
2.便携的脚本
尽可能多的提供自动化脚本,能够也能降低新人的上手难度和恐惧感,使其更加自信
- 打开idea
- 本地运行
- 本地构建
3.代码分布
经过查看网上的相关资料,关于代码结构,我在考虑是否可以可以放弃按照controller,service,dao,entity的分包方式,而采用按照业务分包的方式(如business1,business2)。
- 1.前者是按照技术的方式分包,后者是按照业务的方式分包
- 2.前者会导致业务代码比较分散,后者能保证同业务内的代码尽可能的聚合
- 3.在代码的日常维护修改中,前者的修改往往也会比较分散,而后者往往能够聚合在一起
- 4.当项目需要进行拆分的时候,前者的耦合会比较紧密,拆分可能会比较困难,而后者可能会比较容易
4.自动化测试
4.1 自动化测试的分类
- 单元测试(src/test/java):核心的领域模型,包括领域对象(比如Order类),Factory类,领域服务类等;
- 组件测试(src/componentTest/java):不适合写单元测试但是又必须测试的类,比如Repository类,在有些项目中,这种类型测试也被称为集成测试;
- API测试(src/apiTest/java):模拟客户端测试各个API接口,需要启动程序。
5.日志处理
关于日志记录重点需要考虑两个问题:
- 链路追踪,比如MDC(Mapped Diagnostic Context)
- 多节点下,日志集中记录,使用elk达到es中
6.异常处理
异常处理需要考虑的问题:
- 格式统一
- 上下文和结构化信息
- 异常的唯一标识
7.定时任务
定时任务主要考虑的问题是分布式锁,可以使用的技术包括Shedlock、Redis、ZooKeeper和Hazelcast等的分布式锁实现机制
8.编码风格
google、alibaba、唯品会
9.静态代码检查
- Checkstyle:用于检查代码格式,规范编码风格
- Spotbugs:Findbugs的继承者(用过)
- Dependency check:OWASP提供的Java类库安全性检查
- Sonar:用于代码持续改进的跟踪(用过)
- 健康检查
健康检查的主要作用:
- 初步检查程序是否运行正常
- 负载均衡软件会通过一个健康检查URL判断节点的可达性
11.接口文档
swagger
12.数据库迁移
flyway
13.多环境(profile)
- local:用于开发者本地开发
- ci:用于持续集成
- dev:用于前端开发联调
- qa:用于测试人员
- uat:类生产环境,用于功能验收(有时也称为staging环境)
- prod:正式的生产环境
14.跨域处理(CORS)
前后端应用分别部署在两个不同的域名下是,需要进行跨域处理
- 常用的第三方库
- Guava:来自Google的常用类库
- Apache Commons:来自Apache的常用类库
- Mockito:主要用于单元测试的mock
- DBUnit:测试中管理数据库测试数据
- Rest Assured:用于Rest API测试
- Jackson 2:Json数据的序列化和反序列化
- jjwt:Jwt token认证(暂时未使用过)
- Lombok:自动生成常见Java代码,比如equals()方法,getter和setter等;
- Feign:声明式Rest客户端
- Tika:用于准确检测文件类型(暂时未使用过)
- itext:生成Pdf文件等(暂时未使用过)
- zxing:生成二维码
- Xstream:比Jaxb更轻量级的XML处理库(暂时未使用过)