项目框架
文件结构树
-
/:根目录
- README.md
- 项目说明,环境搭建、配置以及编译,启动命令
- Rakefile
- 编译内容配置,引入所有配置项、lib等
- README.md
根目录下文件内容分布
- 一般包含依赖包的配置信息
- log的配置信息
- 各个类的路由配置……
- 版本控制相关文件(比如pom、.git……)
属于globally的配置信息
-
/app:组织业务逻辑(main.java)
- /clients:外部服务交互类
- /controller/handler:服务的出入口
每一个包的内容相互独立,协同工作,高内聚低耦合
- 服务自己的转发控制类(filter/interrupter)
- 包含程序出入口(handler/controller)
- 程序dateflow处理包(service)
- 程序本身的初始化/静态启动(init)
- 程序配置载入及初始化(config)
- 数据model(modole/module/……)
- 公共方法(common/utils……)
- 公共系统定数、静态变量(xxConstants)可以放一起也可以拆开按不同业务分别命名
- validate相关组件
- db交互(dao data access object),二级可以分层,比如mysqlDao,oracleDao……
- 缓存交互
- ……各种外部系统的交互包
- 异步工作类
每个包建议第一层interface,第二层(/impl)放继承、多态过的支持各种独立逻辑的类
-
/bin:项目启动命令
- 。。。正常启动文件、debug启动文件……
-
/builds/0 编译结果目录略,Java里面叫target
-
/config:配置文件
- /initializers:外部服务交互初始化文件 #-》放app里会不会好点?
- /keys:本地key文件: #-》放配置中心里会不会好点?
- /locales: 国际化文本信息
- database.yml: db配置
- …
所有配置文件的信息,基础配置
- DB参数,如编码,超时策略等
- 系统初始化定数(线程池初始化大小、过期时间……等有少量修改需求的数据)
- 外部环境交互参数,数据源类型等
-
/db:数据库相关信息,表结构定义,建表语句,DB初始化的sql文件等
-
/doc:项目相关详细文档,数据描述,流程、时序图等,最好存放在公司内部/公共的网盘里
-
/lib:项目的外部依赖,如不能上传公有服务器的内部jar包等
-
/test:(optional)在这里叫/spec,UT、Integration test文件等,文件结构要和/app一致
-
/vendor:lls里常见的外部依赖包
-
/resource:通用资源路径,在Java Spring里默认配置文件放这里,同时还会放置包括前端页面在内的不影响后台服务启动的资源
包边界
每个服务需要有自己的职责范围,就像每个人都要有自己的职责范围一样,这样的好处在于一方面每个人的责任清晰可查,不会出现不必要的越俎代庖的行为,另一方面责任到人(文件/服务)也可以在有需要的时候尽快找到对应的责任人
每个业务模块都需要一套独立的代码逻辑
-
xxHandler/controller,只做程序出入口,可以将限流埋点等代码放在mainController做前置切片的处理
- 每个业务线需要自己独立的controller,如billcontroller、productioncontroller
- 每个controller应对自己业务线的数据处理
-
validator,只被相关controller调用做请求合法性验证,可以输出日志但理论上只返回true/false,不做任何业务逻辑处理
- 一般遵循fail fast的思想,遇到不合法的请求,记录并直接返回(异常等)
- 如果是表单验证,或需要对所有错误进行捕获时也可以走完所有的check逻辑再返回所有错误信息
- 分为basicCheck,businessCheck和relationCheck,每个业务模块继承并重写相应的验证逻辑
- 只做input参数、请求的校验,分支的逻辑判断应写在service层
-
service,固化业务流程,包含各种分支,在业务逻辑不明确或变动频率较大时,建议使用流程引擎类似组件进行动态配置
- 主要流程分支图(if-else树及case-when-then树等)
- 业务处理的逻辑片段,某种分支中最小的,不可分割的业务流程
- (optional)在分支中可以完成所有的数据处理,包括外部依赖的使用时,可以直接在分支处理结束时return,而不需要走完整个流程判断
- 作为程序总线,调用包括dao、client等组件进行数据访问、处理、整合等
-
dao,外部数据交互
- 主要用于外部数据持久化系统的访问
- 负责包括数据源、链接池的初始化,事务处理等
- 只做数据源交互用的数据组织,组装DSL命令、结果集和model的组装等
-
config,配置读取包
- 一般用于读取本地配置文件、交互远程配置中心等,然后将对应配置的KV信息写进当前运行内存里
- Java里多用@PreConstruct/@PostConstruct等修饰,或者在类加载的时候做高优先级加载
-
init,程序初始化包,包括类加载等内容,Java的main函数一般放这里
- 但是习惯上Spring的XXApplication会放在根目录
-
Bean/Module/Model……
- 程序内部的数据结构定义,lls里放在vendor/protos和model里面了
- 内容一般为结构定义,包括各字段数据类型等
- 少数项目会有包括validate标签、接口说明标签等
- 通用对象里可以考虑放置静态枚举值,但是不建议这样使用
-
common/utils……
- 公共组件包,里面一般放置包括加密解密、时间运算、字符串、集合、Map等的处理类等
- 放置不涉及业务逻辑的公共处理逻辑
-
constants
- 放置系统定数
- 几乎不会有变动的可以考虑固化成XXConstants文件,比如报错消息、连接池大小、超时时间等
- 有可能有变动的可以通过异步任务去DB或者其他外部数据源异步同步
-
异步工具类
- 放置异步工具
- 线程池(如果存在)相关代码
- 为了防止高并发产生的瞬时大量线程的创建,还是建议针对不同的业务使用相互独立的线程池
程序启动及调用
程序的开发是为了数据处理,简化手工操作
-
程序的启动方法
- 。。。
-
本地swagger调试
-
UT/IT 测试入口
-
外部调用方式
。。。
编译和部署
-
背景知识
- git相关
- 编译和打包命令
- 发布系统
-
发布和部署手顺
-
本地运行xx命令(e.g. mvn clean instll -U)
-
git上传解决冲突
-
登陆xx系统进行如下操作
- 。。。
-
登陆xx系统进行如下验证
- 。。。
-
登陆xx系统进行如下监控
- 。。。
-
-
发布成功验证点
- 。。。
-
发布失败回滚手顺
- 。。。