如何解决设备突然炸裂的问题?

摘要:大家好,我是晓凡。 写在前面 一到月初或者月末(某些业务操作大规模爆发的时候),手机狂震,生产告警狂轰滥炸: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 小时。
阅读全文