DTO、VO、Entity 分不清会带来什么麻烦
这篇我想按“排查记录”来写,主题是 DTO、VO、Entity 分不清会带来什么麻烦。这种写法比纯概念文更适合我自己回看。 现象先别急着解释对象分层是为了隔离变化,不是为了多写几个类。 先把现象钉住,比急着下结论有用。很多时候真正的关键不是“答案是什么”,而是“我是怎么一步步排到这里的”。 我会先看哪几件事 Entity 对应持久化结构 DTO 承载接口入参 VO 面向页面展示 转换逻辑要集中 带入一个排查场景给用户列表接口设计...
Controller 层到底该写多少逻辑
这篇按踩坑笔记来写,因为 Controller 层到底该写多少逻辑 我现在更容易记住“错在哪”,而不是“定义长什么样”。 先记住这句话Controller 只做参数接收、校验触发和响应转换。 很多问题不是不会用,而是用得太顺手了,顺手到把边界条件给省掉了。 这类问题一般怎么出现我脑子里会先放这个场景:把一个臃肿 Controller 方法拆回 service。 一开始看着都像是个小问题,真正麻烦的是它往往不是立刻报错,而是跑一阵子...
Spring Boot 项目目录怎么分层
今天不想写长文,先把 Spring Boot 项目目录怎么分层 这块拆成几条短一点的问答。面试里经常会被连续追问,如果只背一句定义,第二问基本就卡住了。 先说我自己的结论让包结构反映业务边界,而不是机械地按技术名词堆文件。 我现在会先把这类题分成“定义是什么、为什么这样设计、代码里怎么用、容易翻车在哪”四层去答。这样比死背一段话稳很多。 快问快答 controller 处理协议。我现在的理解:先记结论,再回到代码里找一个能验证它的...
并发场景下如何减少共享状态
今天把 并发场景下如何减少共享状态 补成一篇正常一点的学习笔记,不写大而全,就记我这轮最想吃透的部分。 一句话先立住很多并发问题不是靠加锁解决,而是靠减少共享。 我这次真正记住的点 不可变对象天然更安全 局部变量优先于成员变量 队列能把并发写变成串行消费 为什么我会专门记这块因为它很容易出现一种错觉:看资料的时候觉得自己会了,真到写接口、改 SQL、配事务、看线程池参数时又开始发虚。 我现在尽量把知识点挂到一个具体场景上:把批量...
ThreadLocal 使用不当会留下什么问题
这篇我想按“排查记录”来写,主题是 ThreadLocal 使用不当会留下什么问题。这种写法比纯概念文更适合我自己回看。 现象先别急着解释ThreadLocal 适合线程内上下文,但在线程池里必须清理。 先把现象钉住,比急着下结论有用。很多时候真正的关键不是“答案是什么”,而是“我是怎么一步步排到这里的”。 我会先看哪几件事 请求结束要 remove 不要保存大对象 异步线程不会自动继承上下文 带入一个排查场景实现 traceI...
CompletableFuture 的一次异步编排练习
这篇按踩坑笔记来写,因为 CompletableFuture 的一次异步编排练习 我现在更容易记住“错在哪”,而不是“定义长什么样”。 先记住这句话把互不依赖的远程调用并行化,同时控制异常和超时。 很多问题不是不会用,而是用得太顺手了,顺手到把边界条件给省掉了。 这类问题一般怎么出现我脑子里会先放这个场景:并行查询用户信息、积分和优惠券,再组装首页卡片。 一开始看着都像是个小问题,真正麻烦的是它往往不是立刻报错,而是跑一阵子、数据...
线程池拒绝策略和业务兜底
今天不想写长文,先把 线程池拒绝策略和业务兜底 这块拆成几条短一点的问答。面试里经常会被连续追问,如果只背一句定义,第二问基本就卡住了。 先说我自己的结论拒绝不是异常情况,而是容量设计的一部分。 我现在会先把这类题分成“定义是什么、为什么这样设计、代码里怎么用、容易翻车在哪”四层去答。这样比死背一段话稳很多。 快问快答 AbortPolicy 适合快速暴露问题。我现在的理解:先记结论,再回到代码里找一个能验证它的场景。 Calle...
线程池参数应该怎么设置
今天把 线程池参数应该怎么设置 补成一篇正常一点的学习笔记,不写大而全,就记我这轮最想吃透的部分。 一句话先立住从任务类型、响应时间和资源限制倒推线程池。 我这次真正记住的点 CPU 密集和 IO 密集思路不同 队列长度决定堆积方式 线程命名便于排查 为什么我会专门记这块因为它很容易出现一种错觉:看资料的时候觉得自己会了,真到写接口、改 SQL、配事务、看线程池参数时又开始发虚。 我现在尽量把知识点挂到一个具体场景上:给导出任务...