Spring AOP 进阶实战:从日志到权限/链路追踪/限流(真正企业用法)
一、前言上一篇Spring AOP 从原理到实战结合事务彻底搞懂我们已经搞懂了✔ AOP 原理✔ Before / After / Around 的区别✔ 事务为什么用 AOP但是很多人学完之后会有一个问题AOP 到底在项目里怎么用这一篇我们不再讲“语法”而是讲企业项目中AOP 真正用在哪些地方什么时候用二、AOP 的本质再理解关键先记住一句话AOP 把“非业务逻辑”从业务代码里抽离比如类型是否业务下单、注册✅ 业务打日志❌ 非业务权限校验❌ 非业务限流❌ 非业务链路追踪❌ 非业务 所以AOP 专门处理所有“横切关注点”三、企业中 AOP 常见 4 大场景这一节是重点 1️⃣ 日志 AOP必备 使用时机所有接口调用都要记录 ✔ 参数 ✔ 返回值 ✔ 耗时 ✔ 异常 为什么用 AOP不可能每个 Controller 都写 log✅ 推荐写法AroundAspect Component Slf4j public class LogAspect { Around(execution(* com.xxx.modules..controller..*(..))) public Object log(ProceedingJoinPoint jp) throws Throwable { long start System.currentTimeMillis(); String method jp.getSignature().toShortString(); try { Object result jp.proceed(); long cost System.currentTimeMillis() - start; log.info(接口{}耗时{}ms返回{}, method, cost, result); return result; } catch (Throwable e) { log.error(接口异常{}, method, e); throw e; } } }什么时候用✔ 所有项目必须 ✔ 第一个 AOP2️⃣ TraceId链路追踪 使用时机当日志“看不懂”的时候例如多个用户同时请求 → 日志混在一起✅ 解决方案给每个请求一个唯一 ID示例Aspect Component public class TraceIdAspect { Around(execution(* com.xxx.modules..*(..))) public Object trace(ProceedingJoinPoint jp) throws Throwable { String traceId UUID.randomUUID().toString().replace(-, ); MDC.put(traceId, traceId); try { return jp.proceed(); } finally { MDC.remove(traceId); } } }logback 配置pattern%d{HH:mm:ss} [%X{traceId}] %-5level %logger - %msg%n/pattern什么时候用✔ 有多个接口 ✔ 有并发 ✔ 开始调试问题 ✔ 面试加分项3️⃣ 权限控制 AOPRBAC 基础 使用时机接口需要权限控制❌ 不推荐写法if (!isAdmin()) { throw new RuntimeException(没权限); } 到处都是权限判断 ❗✅ AOP 写法定义注解Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface CheckPermission { String value(); }AOPAspect Component public class PermissionAspect { Around(annotation(checkPermission)) public Object check(ProceedingJoinPoint jp, CheckPermission checkPermission) throws Throwable { String permission checkPermission.value(); if (!hasPermission(permission)) { throw new RuntimeException(没有权限 permission); } return jp.proceed(); } }使用CheckPermission(user:add) PostMapping(/add) public String addUser() { return ok; }什么时候用✔ 有登录系统 ✔ 有角色权限admin/user ✔ 企业项目必备4️⃣ 限流 AOP高并发保护 使用时机接口被频繁调用 / 防刷 / 防攻击示例Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface RateLimit { int limit(); }Aspect Component public class RateLimitAspect { private final MapString, AtomicInteger counter new ConcurrentHashMap(); Around(annotation(rateLimit)) public Object limit(ProceedingJoinPoint jp, RateLimit rateLimit) throws Throwable { String key jp.getSignature().toShortString(); counter.putIfAbsent(key, new AtomicInteger(0)); int count counter.get(key).incrementAndGet(); if (count rateLimit.limit()) { throw new RuntimeException(请求过多); } return jp.proceed(); } }⚠ 实际生产必须用 Redis 令牌桶什么时候用✔ 秒杀 ✔ 登录接口 ✔ 高频接口四、AOP 使用优先级你该怎么学第一阶段你现在✔ 日志 AOP必须 ✔ Around 用法第二阶段建议马上✔ TraceId ⭐⭐⭐⭐ ✔ 全局异常处理 ✔ 统一返回结构第三阶段进阶✔ 权限控制 ✔ 限流 ✔ 分布式链路追踪SkyWalking五、AOP 使用误区面试会问❌ 误区1AOP 写业务逻辑AOP 不处理业务只处理“通用能力”❌ 误区2滥用 Before很多逻辑必须用 Around❌ 误区3所有东西都用 AOP能不用就不用AOP是增强不是主流程六、总结 一句话总结AOP 企业级“能力插件系统” 常见使用场景日志 → 必用 TraceId → 强烈推荐 权限控制 → 企业必备 限流 → 高并发场景 最关键认知你不是在学 AOP而是在搭建“基础设施能力”七、下一步建议你可以继续做✔ AOP TraceId Logback 打通 ✔ 全局异常处理ControllerAdvice ✔ 统一返回结构 Result 这一套做完 中级后端工程能力
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2556841.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!