实战性设计规范!!!
内容分类 | 编号 | 系统性分类 | 规范明细 | 建议项 |
模块设计 | 1.1 | 扩展性、健壮性 | 模块不互相依赖 | 互相依赖部分抽取成公共的模块 |
1.2 | 可用性 | 每个逻辑实体(独立部署的组件)必须考虑冗余备份策略 | ||
1.3 | 扩展性 | 服务端必须支持集群部署,不允许出现单点情况 | ||
1.4 | 扩展性 | 应保证横向扩展(通过增加主机数量扩展处理能力)时对客户端透明,无需对客户端做变更 | ||
关联调用 | 2.1 | 可维护性 | 接口文档中须明确定义异常情况的错误码、错误说明 | |
2.2 | 可维护性 | 接口文档中须明确定义接口方法的输入输出 | ||
2.3 | 扩展性、健壮性 | 接口实现必须考虑新老版本的兼容性或多版本并行,做到服务更新对关联方的影响最小化 | ||
2.4 | 可维护性 | 服务接口必须具有可测试性(依赖第三方服务是否可mock或者有可用联调测试环境) | ||
2.5 | 健壮性 | 接口调用必须支持服务降级、限流与熔断。支持开关控制对外部接口的调用 | ||
2.6 | 健壮性 | 接口设计必须考虑是否支持幂等(重试) | 数据一致性考虑 | |
2.7 | 扩展性、健壮性 | 系统或服务之间不能存在循环依赖 | ||
2.8 | 扩展性、健壮性 | 应用层之间不能调用 | ||
2.9 | 健壮性 | 数据同步必须有相应的机制检测同步的数据是否一致 | ||
2.10 | 健壮性 | 数据同步程序须支持补同步,支持人工干预同步 | ||
日志规范 | 3.1 | 扩展性 | 应用中不可直接使用日志系统(Log4j、Log4j2、 Logback) 中的 API,应使用日志框架SLF4J 中的 API | 日志按天滚动 |
3.2 | 性能 | 对 trace/debug/info 级别的日志输出,必须使用条件输出形式或者使用占位符的方式 | 避免重复打印日志,浪费磁盘空间,务必设置 additivity=false | |
3.3 | 可维护性、安全性 | 日志必须分级、关键操作必须添加审计日志 | ||
3.4 | 可维护性 | 记录日志必须采用统一的日志格式 | 稳定项目日志级别可只记录info/error级别即可 | |
3.5 | 灵活性 | 必须支持日志级别可动态调整 | 谨慎地记录日志。生产环境禁止输出 debug 日志; 有选择地输出 info 日志; 如果使 用 warn 来记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免把服务器磁盘 撑爆,并记得及时删除这些观察日志 | |
3.6 | 可维护性 | 运行时异常的日志记录中必须包含堆栈信息 | ||
3.7 | 安全性 | 记录的日志中不能记录敏感信息,如密码等,如有敏感信息必须进行屏蔽处 | ||
3.8 | 其他 | 其它遵循《IT服务中心日志记录规范》,《安全日志规范》 | ||
数据库规范 | 4.1 | 扩展性 | 前期容量规划必须包含一年的数据量预估 | |
4.2 | 安全性 | 敏感信息不能明文存放数据库,参见《信息安全规范》 | ||
4.3 | 安全性 | 禁止在sql语句中使用拼接参数以防sql注入 | ||
4.4 | 扩展性 | 数据量如果超过千万级别必须考虑进行数据分片 | 分库分表shardingkey及hash策略考虑:业务查询是否都能带上之分片key、一个处理业务最小单元是否能落在同一个库保证单库事务; | |
4.5 | 健壮性 | 新系统必须采用公司统一规定的字符集UTF8mb4 | ||
4.6 | 扩展性 | 禁止在数据库中使用存储过程、数据库定时任务、触发器 | ||
4.7 | 健壮性 | 查询结必须有最大记录条数限制,建议不超过2000条,大量的数据查询必须分页查询 | 阿里druid数据源可添加selectLimit=2000配置,详见https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE-wallfilter | |
4.8 | 可用性 | 以下情况都不允许共用数据库: 1.重叠维护窗口低于2小时的子系统 2.外购子系统与自开发子系统 3.跨业务线 4.OLAP和OLTP子系统 | ||
4.9 | 可用性 | 不同子系统共用数据库,不允许共用用户 | ||
4.10 | 可靠性 | 使用Mysql必须使用Innodb引擎 | ||
4.11 | 可用性 | 含有业务数据、订单数据、用户数据等具有唯一性、时间戳性、不可再造等特征的数据库,必须搭建容灾库并配置同步 | ||
4.12 | 其他 | 其它请遵循公司DBA规范 | ||
中间件 | 5.1 | 可维护性 | JVM启动参数中须配置HeapDumpOnOutOfMemory参数 | jvm内存大小 |
5.2 | 健壮性 | Dubbo的服务定义中必须配置timeout accepts actives参数 | ||
5.3 | 灵活性、健壮性 | 消息中间件的使用必须考虑消息的优先级、消息顺序。消费消息必须考虑消息的重复处理(是否支持幂等) | ||
5.4 | 可维护性 | 必须优先使用公司标准中间件,新引入中间件必须经过架构评审 | ||
配置 | 6.1 | 灵活性 | 环境相关配置(如依赖的服务调用地址、APPID、APPSECRET)禁止写在代码中 | 写入统一配置中心如disconf等 |
6.2 | 灵活性 | 可能经常变化的参数需支持动态修改 | ||
6.3 | 安全性 | 敏感信息必须进行加密处理 | ||
6.4 | 其他 | 其它遵循《IT服务中心应用配置规范》 | ||
多线程 | 7.1 | 健壮性 | 线程池必须有大小限制,禁止使用无界队列 | 队列长度合理、拒绝策略关注业务数据丢失 |
7.2 | 可维护性 | 线程池大小必须可动态配置 | ||
7.3 | 健壮性 | 多线程使用中须避免产生线程安全问题 | 线程安全问题、类属性变量、SimpleDateFormat HashMap非线程安全类使用时多加注意 | |
7.4 | 健壮性 | 防止无限制创建线程,防止线程不回收 | ||
锁、事务 | 8.1 | 性能 | 禁止在一个事务中采用for循环处理大量数据(避免长事务) | 须考虑MySQL锁成本(行锁升级至表锁,MySQL锁其实是锁索引) |
8.2 | 健壮性 | 须有最终一致性方案处理跨系统事务 | ||
8.3 | 健壮性 | 防止产生死锁 | 优先使用cas原子操作,锁粒度尽可能小 注意解锁顺序及异常情况避免死锁等 | |
定时任务 | 9.1 | 可维护性 | 须支持手动立即触发、错过重次执行、查看任务的执行状态 | 推荐当当的分步式任务elastic-job |
9.2 | 可用性 | 必须防止存在单点故障 | ||
9.3 | 健壮性 | 多实例并发运行时需考虑同一数据重复执行多次问题 | 并发运行控制 | |
缓存 | 10.1 | 性能、可用性 | 缓存使用必须有前期的容量规划(key大小、数量级) | 是否要引用代理层如codis等 |
10.2 | 性能、可用性 | 必须根据实际场景选择采用分布式(redis)/本地(ehcache/guava cache)或联合使用的缓存方案 | 数据量很小但访问非常频繁的数据建议优先使用本地缓存,如数据字典、国家行政区划分等; 具体业务相关的、数据量大的优先使用分布式缓存; | |
10.3 | 安全性 | 缓存数据必须设置过期策略 | 防止不必要的占用空间,防止数据不一致导致问题 | |
10.4 | 健壮性 | 临时存储与持久存储的key一定要分开实例 | ||
文件传输与存储 | 11.1 | 可维护性 | 临时读写可使用本地文件,如果是长久保存(如文件上传这些的)须使用公司标准存储方案 | 1、生命周期与session 同步的临时文件可选择不在instance 间共享; 2、生命周期大于session 的临时文件必须在instance 间共享 |
11.2 | 安全性 | 禁止跨网络区域共享文件 | ||
11.3 | 安全性 | 文件访问必须有访问权限控制,记录操作日志 | ||
11.4 | 灵活性 | 文件存放路径必须可配置 | ||
11.5 | 健壮性 | 防止因多个instance 同时处理一个文件产生错误数据 | ||
11.6 | 可用性 | 长久存储文件必须避免单点丢失数据 | ||
其他 | 12.1 | 安全性 | 系统必须防止SQL注入、XSS、CSRF等漏洞 | |
12.2 | 安全性 | 敏感数据必须加密传输、防篡改、防重放 | ||
12.3 | 安全性 | 系统必须防止越权操作 | ||
12.4 | 安全性 | 登录信息必须加密传输 | ||
12.5 | 安全性 | 必须使用CAS进行统一登录控制 | ||
12.6 | 安全性 | 所有业务系统的APP,必须部署在DCN区 | ||
12.7 | 安全性 | 所有外联单位、终端用户、互联网用户,不允许直接访问DCN区 | ||
12.8 | 安全性 | 除DCN区APP外,不允许访问业务数据的DB | ||
12.9 | 安全性 | 所有存放业务数据的DB,必须部署在DCN区 | ||
12.10 | 可用性 | 在程序中,打开的资源对象、流对象须及时关闭释放 | 建议使用Java7新特性try-with-resources | |
12.11 | 可维护性 | 系统代码必须使用统一的代码风格,遵守公司统一的《编码规范》 | 查看阿里巴巴java开发指南 | |
12.12 | 性能,可用性,可维护性 | 关键接口必须有性能TP99、curl访问存活、系统心跳存活监控报警 | 端口存活监控、多地区访问监控 | |
12.13 | 安全性 | 遵循其他《安全规范》要求 |