研发全流程规范

技术方案阶段:

 

一、产品方案文档和评审

1.项目背景和目标,评估价值,可以否决该需求

2.梳理外部依赖

3.系统架构

4.流程图

5.功能点

6.数据字典

7.接口文档

8.兼容性

老版本APP+新数据格式

新版本APP+老数据格式

 

 

二、技术选型的成本意识

1.研发成本:技术选型、架构设计、开发耗时

2.运维成本:自动化运维>人工运维

3.资源成本:服务器数量,数据库资源,redis>mysql>es>hase

 

 

三、测试用例评审

 

 

 

  

 

开发阶段:

 

零、开发编码规范

1.制定规范,拉齐团队人员认知,减少代码和CR问题

 

 

一、存储

1.mysql加索引、主从分离、读写分离、事务、连接池

2.mysql换成ES,宽表

3.mysql冗余存储

 

 

二、缓存

1. redis缓存

2.本地缓存

3.持久化数据,缓存故障

4.缓存击穿、缓存穿透

5.大key

6.热key

 

 

三、接口定义

API包保持清爽,尽量不依赖别的包

 

 

四、参数处理

1. controller接口,利用spring自带的拦截器HandlerInterceptor,和参数解析器

a. 实现登录拦截器

LoginInterceptor extends HandlerInterceptorAdapter

b. 把登录拦截器添加到配置里

InterceptorConfig implements WebMvcConfigurer

c. 自定义注解+反射判断哪些接口需要登录后才能调用

public @interface NeedLogin

d. 参数解析器填充基础用户数据

ColorParamArgResolver implements HandlerMethodArgumentResolver

 

 

2. RPC接口,不是Controller接口,不能使用HandlerInterceptor,改为使用AOP

 

 

五、traceID

1. 分布式跟踪

2. 子线程traceId

 

 

六、AOP打印日志参数/返回值/耗时/监控点/trace ID

1.调用RPC层

2.调用数据库层

3.提供PRC层或HTTP网关层

 

 

七、公用参数考虑范型+反射

 

 

八、安全性

1.管理端和用户端,接口权限控制

2.通过ID查询的接口,校验权限

 

 

九、单元测试bamboo平台

1.测试用例成功数量

2.覆盖代码行数

 

 

十、预热

1.在项目启动时,调用一次接口,优化第一次调用的性能

2.把数据预先加载到redis中

 

 

十一、循环单个替换为批量

1.关注循环代码

2.接口调用单个替换为批量

3.数据库操作单个替换为批量

 

 

 

十二、前端参数校验

1.必填参数校验

2.参数格式校验

 

 

十三、日志

1. 开启动态日志,控制日志级别

2.日志定时清理

3.加上错误日志和日志关键字报警

4.打印error日志到单独的文件里

5.异步日志

 

 

 

十四、自定义业务异常

 

1. 继承RuntimeException

public class BusinessException extends RuntimeException

public final class BusinessExceptionCollection {

 

    private BusinessExceptionCollection(){}

    public static final BusinessException SKU_INVALID_EXCEPTION = new BusinessException("商品无效");

}

 2. 处理BusinessException

public class BusinesExceptionHandler implements HandlerExceptionResolver

 

3.异常提示信息,要清晰明确,既要用户体验好,又能减少或者方便研发进行问题排查

 

 

十五、配置化,隔离不变与变化

1.改代码,走一遍完整上线流程,最复杂

2.改配置,重启应用:动态线程池

3.改配置,不重启应用

 

 

十六、代码边界

1.同一个类里,尽量提取公共方法,让整个类可以共用

2.同一个包里,尽量提取util类,让整个包可以共用

3.同一个项目里,尽量提取common包,让其他包,甚至其他项目也可以用

4.同一个流程,对不同的场景,最基础的实现逻辑是在同一个类里if-else

5.同一个流程,对不同的场景,尽量把if-else改成策略模式、工厂模式,此时通用逻辑和业务逻辑都是自己实现,但不同场景有单独的类去实现,互不影响

6.同一个流程,对不同的场景,尽量使用DDD,自己实现通用流程,业务方自己实现业务场景,扩展性更好,此时是平台开发思维

 

 

十七、架构分层

1.流程清楚

2.代码复用

3.监控定位

 

 

 

 

上线前:

 

一、检查代码

1.sonar静态扫描

2.安全扫描,主要是外部依赖,是否有安全性问题,例如slf4j, fastjson等

3.CR

感谢CR,而不是恐惧CR,因为让生产环境出问题的几率变小了;

对事不对人,不要认为CR出问题了,是一件可耻的事情,就要被钉到耻辱柱上;

从CR中总结经验,加入CR常见问题列表,下次不要再犯

 

 

二、UAT用户体验

 

 

三、制定上线checklist

1.不遗漏

2.操作顺序正确

 

 

四、灰度

1.服务器灰度

2.用户灰度,黑名单、白名单

 

 

 

上线中:

 

一、观察日志,有问题及时回滚

二、及时回滚 优先级大于 排查原因

三、验证上线功能,回归核心流程

 

 

 

上线后:

 

一、监控报警

1.接口监控点

2.秒级监控

3.jvm监控

4.监控面板

5.机器监控

6.应用健康度

7.自定义业务报警

8.color接口监控

9.红绿灯服务监控

10.日志关键字报警

 

 

 

二、指标

1.事故数量和级别

2.单元测试成功数量和覆盖率

3.代码sonar扫描违规数量

4.客户端崩溃率

5.系统不可用时长,SLA 99.99%

6.接口区分级别 P0/P1/P2

7.客户端/前端埋点,进行数据统计

 

 

三、线上调优JVM

1.GC

2.参数

 

四、线上调优慢SQL

1.索引

2.拆分SQL,避免复杂查询

 

 

五、运营机制

1.每天早值班

2.节假日值班

3.大促值班

4.运营群

5.自动化巡检

 

 

六、大促活动

1.弱依赖服务,降级

2.强依赖服务,限流

 

 

七、研发价值量化

1.关注业务运营数据

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2022-06-03 11:43  牧云文仔  阅读(1010)  评论(0编辑  收藏  举报