项目框架划分

项目框架

文件结构树

  1. /:根目录

    1. README.md
      • 项目说明,环境搭建、配置以及编译,启动命令
    2. Rakefile
      • 编译内容配置,引入所有配置项、lib等

根目录下文件内容分布

  • 一般包含依赖包的配置信息
  • log的配置信息
  • 各个类的路由配置……
  • 版本控制相关文件(比如pom、.git……)

属于globally的配置信息

  1. /app:组织业务逻辑(main.java)

    1. /clients:外部服务交互类
    2. /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)放继承、多态过的支持各种独立逻辑的类

  1. /bin:项目启动命令

    1. 。。。正常启动文件、debug启动文件……
  2. /builds/0 编译结果目录略,Java里面叫target

  3. /config:配置文件

    1. /initializers:外部服务交互初始化文件 #-》放app里会不会好点?
    2. /keys:本地key文件: #-》放配置中心里会不会好点?
    3. /locales: 国际化文本信息
    4. database.yml: db配置

所有配置文件的信息,基础配置

  • DB参数,如编码,超时策略等
  • 系统初始化定数(线程池初始化大小、过期时间……等有少量修改需求的数据)
  • 外部环境交互参数,数据源类型等
  1. /db:数据库相关信息,表结构定义,建表语句,DB初始化的sql文件等

  2. /doc:项目相关详细文档,数据描述,流程、时序图等,最好存放在公司内部/公共的网盘里

  3. /lib:项目的外部依赖,如不能上传公有服务器的内部jar包等

  4. /test:(optional)在这里叫/spec,UT、Integration test文件等,文件结构要和/app一致

  5. /vendor:lls里常见的外部依赖包

  6. /resource:通用资源路径,在Java Spring里默认配置文件放这里,同时还会放置包括前端页面在内的不影响后台服务启动的资源

包边界

每个服务需要有自己的职责范围,就像每个人都要有自己的职责范围一样,这样的好处在于一方面每个人的责任清晰可查,不会出现不必要的越俎代庖的行为,另一方面责任到人(文件/服务)也可以在有需要的时候尽快找到对应的责任人

每个业务模块都需要一套独立的代码逻辑

Controller Validator Validator Service Dao Service 请求合法性 请求不合法 请求合法性 请求合法 调用对应处理逻辑入口 调用自身业务模块处理逻辑以及相关业务逻辑 各种分支及验证逻辑 读写外部数据源 组织数据并返回 Controller Validator Validator Service Dao Service
  1. xxHandler/controller,只做程序出入口,可以将限流埋点等代码放在mainController做前置切片的处理

    • 每个业务线需要自己独立的controller,如billcontroller、productioncontroller
    • 每个controller应对自己业务线的数据处理
  2. validator,只被相关controller调用做请求合法性验证,可以输出日志但理论上只返回true/false,不做任何业务逻辑处理

    • 一般遵循fail fast的思想,遇到不合法的请求,记录并直接返回(异常等)
    • 如果是表单验证,或需要对所有错误进行捕获时也可以走完所有的check逻辑再返回所有错误信息
    • 分为basicCheck,businessCheck和relationCheck,每个业务模块继承并重写相应的验证逻辑
    • 只做input参数、请求的校验,分支的逻辑判断应写在service层
  3. service,固化业务流程,包含各种分支,在业务逻辑不明确或变动频率较大时,建议使用流程引擎类似组件进行动态配置

    • 主要流程分支图(if-else树及case-when-then树等)
    • 业务处理的逻辑片段,某种分支中最小的,不可分割的业务流程
    • (optional)在分支中可以完成所有的数据处理,包括外部依赖的使用时,可以直接在分支处理结束时return,而不需要走完整个流程判断
    • 作为程序总线,调用包括dao、client等组件进行数据访问、处理、整合等
  4. dao,外部数据交互

    • 主要用于外部数据持久化系统的访问
    • 负责包括数据源、链接池的初始化,事务处理等
    • 只做数据源交互用的数据组织,组装DSL命令、结果集和model的组装等
  5. config,配置读取包

    • 一般用于读取本地配置文件、交互远程配置中心等,然后将对应配置的KV信息写进当前运行内存里
    • Java里多用@PreConstruct/@PostConstruct等修饰,或者在类加载的时候做高优先级加载
  6. init,程序初始化包,包括类加载等内容,Java的main函数一般放这里

    • 但是习惯上Spring的XXApplication会放在根目录
  7. Bean/Module/Model……

    • 程序内部的数据结构定义,lls里放在vendor/protos和model里面了
    • 内容一般为结构定义,包括各字段数据类型等
    • 少数项目会有包括validate标签、接口说明标签等
    • 通用对象里可以考虑放置静态枚举值,但是不建议这样使用
  8. common/utils……

    • 公共组件包,里面一般放置包括加密解密、时间运算、字符串、集合、Map等的处理类等
    • 放置不涉及业务逻辑的公共处理逻辑
  9. constants

    • 放置系统定数
    • 几乎不会有变动的可以考虑固化成XXConstants文件,比如报错消息、连接池大小、超时时间等
    • 有可能有变动的可以通过异步任务去DB或者其他外部数据源异步同步
  10. 异步工具类

    • 放置异步工具
    • 线程池(如果存在)相关代码
    • 为了防止高并发产生的瞬时大量线程的创建,还是建议针对不同的业务使用相互独立的线程池

程序启动及调用

程序的开发是为了数据处理,简化手工操作

  1. 程序的启动方法

    1. 。。。
  2. 本地swagger调试

  3. UT/IT 测试入口

  4. 外部调用方式

。。。

编译和部署

  1. 背景知识

    • git相关
    • 编译和打包命令
    • 发布系统
  2. 发布和部署手顺

    1. 本地运行xx命令(e.g. mvn clean instll -U)

    2. git上传解决冲突

    3. 登陆xx系统进行如下操作

      1. 。。。
    4. 登陆xx系统进行如下验证

      1. 。。。
    5. 登陆xx系统进行如下监控

      1. 。。。
  3. 发布成功验证点

    1. 。。。
  4. 发布失败回滚手顺

    1. 。。。

猜你喜欢

转载自blog.csdn.net/weixin_40601534/article/details/84285228