如何解决设备突然炸裂的问题?
摘要:大家好,我是晓凡。 写在前面 一到月初或者月末(某些业务操作大规模爆发的时候),手机狂震,生产告警狂轰滥炸:xxx接口超时、用户中心 CPU 飙到 98%…… 运维在群里疯狂 @ 你,你却只能回一句“我本地是好的”。 别问,问就是接口设计欠
大家好,我是晓凡。
写在前面
一到月初或者月末(某些业务操作大规模爆发的时候),手机狂震,生产告警狂轰滥炸:xxx接口超时、用户中心 CPU 飙到 98%……
运维在群里疯狂 @ 你,你却只能回一句“我本地是好的”。
别问,问就是接口设计欠下的技术债。
下面,晓凡总结成 18 条可落地的接口设计“军规”。每条都配上“作死写法”与“保命写法”。
军规 1:路径必须永久不变
反面教材
@RestController
@RequestMapping("/getUserInfoByIdV2.3_beta")
public class UserController { ... }
产品说“V2.3_beta”只是临时版本,结果半年后,死活不敢下线。
正面写法
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{uid}")
public UserDTO get(@PathVariable Long uid) { ... }
}
版本号放到 Header:Accept: application/vnd.myapp.v2+json
路由一旦上线,就是“墓碑”,永远不许动,哪怕老板喊重构。
军规 2:命名只准用名词,禁止动词
反面教材
@PostMapping("/createOrder")
@PostMapping("/addOrder")
@PostMapping("/insertOrder")
同一个业务三个入口,新人入职三天就开始迷路。
正面写法
@PostMapping("/orders")
public OrderDTO create(@RequestBody CreateOrderCommand cmd) { ... }
HTTP 动词已经表达“创建”语义,别再动词叠 buff。
军规 3:统一用复数
反面教材
@GetMapping("/order/{id}")
@GetMapping("/orders")
单复数混用,前端拼接 URL 得写 if/else,特别容易出错。
正面写法
@GetMapping("/orders/{id}")
@GetMapping("/orders")
集合与成员保持一致,前端直接模板字符串 ${host}/orders/${id},代码干净又整洁。
军规 4:分页参数必须“三件套”
反面教材
@GetMapping("/orders")
public List<Order> list(@RequestParam int offset,
@RequestParam int limit) { ... }
参数名随心所欲,前端封装 不知道骂了你多少次。
正面写法
@GetMapping("/orders")
public PageResult<OrderDTO> list(
@RequestParam(defaultValue = "1") @Min(1) int page,
@RequestParam(defaultValue = "20") @Min(1) @Max(100) int perPage) {
long total = orderMapper.count();
List<OrderDTO> data = orderMapper.selectPage((page - 1) * perPage, perPage);
return PageResult.<OrderDTO>builder()
.data(data)
.totalCount(total)
.hasNext(page * perPage < total)
.build();
}
返回统一包装:
@Data
@Builder
public class PageResult<T> {
private List<T> data;
private long totalCount;
private boolean hasNext;
}
军规 5:字段命名一律小写加下划线
反面教材
{"userName":"Jack","userAge":18}
前端 axios 自动把下划线转小驼峰,结果文档对不上,联调 2 小时。
