diff --git a/guide/notice/则一后端开发注意事项.md b/guide/notice/则一后端开发注意事项.md new file mode 100644 index 0000000..1eaf2c7 --- /dev/null +++ b/guide/notice/则一后端开发注意事项.md @@ -0,0 +1,207 @@ +## 则一后端开发注意事项 + +### 数据库 + +目前数据库1个主库,2个读库,应用服务使用写库以及读库1,报表服务使用读库2 + +#### 创建表 + +必须字段 + +主键: id varchar(36) + +删除标识: delete_flag tinyint(1) + +创建时间:create_time datetime + +创建人:create_user varchar(255) 创建人 + +修改时间:modify_time datetime 修改时间 + +修改人: modify_user varchar(255)修改人 + +一般还需要业务主键、状态、备注等字段 + +#### 索引 + +创建表必须加一个主键索引id + +一般需要加一个业务主键,索引类型为唯一索引,保证数据不能重复添加(例如派车单号,运单号,账单号) + +where后面查询字段要设置索引 + +SQL写完一定要在生产环境执行一下,看下执行计划有没有走索引,执行时间一般控制在1-2秒以内 + +大量数据的查询要控制时间范围,例如运单,派车单一次最多查询3个月的数据据 + +事务内的查询会走主库 + +#### 常见生产问题⭐⭐⭐⭐⭐ + +- 慢SQL导致大量会话阻塞,系统查询慢或者无法查询 +- 关联查询或主子查询创建了大数据量临时表,导致数据库临时表空间暴增,数据库无法读写 +- 事务中的查询SQL直接走主库,SQL的where条件没加索引,大数据量查询导致了主库的CPU飙高 +- 数据更新事务长时间未提交,导致其他事务无法操作,造成数据库死锁 例如开启事务之后http请求超时未响应 + +### 后台接口 + +#### 接口设计 + +##### 命名规范⭐⭐⭐⭐ + +类名需要使用大驼峰命名法(UpperCamelCase) 风格 + +方法名、参数名、成员变量、局部变量需要使用小驼峰命名法(lowerCamelCase) + +常量、枚举名称需要使用蛇形命名法(snake_case),常量以及枚举名称需要全部大写 例如:OUT_INVITE + +包名统一使用小写,尽量使用单个单词作为包名,各个单词通过"."分隔符连接,并且各个单词必须为单数 + +POJO类中布尔类型的变量,都不要加is前缀,否则部分框架解析会引起序列化错误 + +如果模块、接口、类、方法使用了设计模式,在命名时需体现出具体模式 + +抽象类命名使用Abstract开头 + +异常类命名使用Exception结尾 + +测试类命名以它要测试的类的名称开始,以Test结尾 + +##### 接口定义⭐⭐⭐⭐ + +单一职责原则(Single Responsibility Principle) +开闭原则(Open Closed Principle) +里氏替换原则(Liskov Substitution Principle) +迪米特法则(Law of Demeter)又叫"最少知道法则" +接口隔离原则(Interface Segregation Principle) +依赖倒置原则(Dependence Inversion Principle) + +##### 方法定义⭐⭐⭐⭐ + +方法名的第一个单词应该是动词,首字母应小写。参数的名字必须和变量的命名规范一致。使用有意义的参数命名。参数尽量简化,不要定义方法中用不到的参数。超过5个则定义成对象类型 + +注意:方法职责一定要拎清楚 + +##### 注释⭐⭐⭐ + +接口方法注释一定要写清楚 + +#### 缓存⭐⭐⭐ + +基础数据最好加缓存,减小数据库压力,提高查询效率 + +#### 事务⭐⭐⭐⭐ + +增删改方法一定要加事务注解 + +嵌套事务注意用try catch包住内部事务方法的异常 + +###### 常见问题⭐⭐⭐⭐⭐ + +未加事务注解导致数据不一致 + +```java +@Override +@Transactional +public String createDispatch(CreateDispatchRequestDto createDispatchRequestDto) { + waybillService.createWaybill(dispatchCode, waybillCode); + dispatchStopOverStationService.createDispatchStation(createDispatchStationRequestDto); + dispatchVehicleService.createDispatchVehicle(createDispatchRequestDto); + dispatchPriceService.createDispatchPrice(createDispatchRequestDto); + dispatchSupplierPriceService.createDispatchSupplierPrice(createDispatchRequestDto); + try { + //带事务方法 + dispatchOperationRecordService.createDispatchOperationRecord(createDispatchRequestDto); + } catch (Exception e) { + log.error("创建派车单异常!"); + } +} +``` + + + +##### 异常 + +检查性异常处理一定要打日志 + +###### 常见问题⭐⭐⭐⭐⭐ + +直接catch掉异常,异常信息无法定位 + +```java +try { + //业务逻辑 +} catch (Exception e) { + log.error("钉钉审批回调消费异常!"); + throw new BusinessException("钉钉审批回调消费异常!"); +} +``` + +正确示例 + +```java +try { + //业务逻辑 +} catch (Exception e) { + log.error("钉钉审批回调消费异常!", e); + throw new BusinessException("钉钉审批回调消费异常!", e); +} +``` + +#### 版本兼容 + +APP后台开发要注意版本兼容问题,APP前端版本上线后不一定所有用户都能及时更新版本。要保证老版本使用的接口也能做出准确的响应 + +外部正在调用或者二方库依赖的接口,不允许修改方法签名,避免对接口调用方造成影响。接口过时加@Deprecated注解,并清晰地说明新接口或新服务是什么 + +###### 常见问题⭐⭐⭐⭐⭐ + +APP未做版本兼容,导致老版本APP无法正常使用 + +直接改外部正在调用的接口,导致别的服务不可用 + +废弃的接口直接抛业务异常 + +```java +@PostMapping("/add") +public Response addDriverVehicleLicense(@RequestBody @Validated DriverVehicleLicenseAddRequestDto driverVehicleLicenseAddRequestDto) { + throw new BusinessException("请下载最新APP版本!"); +} +``` + +新老版本并行的接口加版本区分 + +```java +/** +* 新增 +*/ +@PostMapping("/add") +public Response addDriverVehicleLicense(@RequestBody @Validated DriverVehicleLicenseDiscernAddRequestDto driverVehicleLicenseAddRequestDto) { + driverVehicleLicenseService.addDriverVehicleLicense(driverVehicleLicenseAddRequestDto); + return returnSuccess(); +} + +/** +* 新增(接口兼容:增加行驶证背面传递到副页字段) +*/ +@PostMapping("/add/v1") +public Response addDriverVehicleLicenseV1(@RequestBody @Validated DriverVehicleLicenseDiscernAddRequestDto driverVehicleLicenseAddRequestDto) { + driverVehicleLicenseService.addDriverVehicleLicenseV1(driverVehicleLicenseAddRequestDto); + return returnSuccess(); +} +``` + +#### git + +分支:开发分支,测试分支,上线分支,master + +开发分支: 开发功能时要创建自己的开发分支 +测试分支: 测试环境部署的分支,功能开发完通过单元测试后就可以把代码合并到测试分支进行测试 +上线分支: 每周会有一个上线版本,上线之前需要把要上线的代码合并到上线分支 +master: 生产环境部署分支 + +__push之前一定拉下代码,push时一定要看下是不是自己的代码。如果把不上线的代码push到上线分支,所有人都得重新合代码了,直接影响上线。一定要注意!!!!!__ + +##### 常见问题⭐⭐⭐⭐⭐ + +push时把别人不上线的代码push到上线分支 \ No newline at end of file -- libgit2 0.21.0