文章目录
1、项目背景
项目背景:todo
面临的挑战:**
①
- 使用异步限流处理
②影响面广
- 控制好调用频率和消费速率
- 评估影响面,制定开发接口
2、主要技术
SSM+Maven+Springboot+Git+Dubbo+RocketMQ+Redis+Apollo
- ①主要用maven构建项目模块和管理项目,控制jar包版本;
- ②用Dubbo+zookeeper搭建分布式SOA架构;
- ③查询商品详情接口ES,提升系统查询性能;
- ④使用批量任务(Redis+MQ)避免大量数据变更对系统稳定性的影响
- ⑤用Redis实现分布式锁+记录任务数量;
- ⑥使用RateLimiter + Apollo动态调整限流数量;
- ⑦使用策略模式提升系统可扩展性
3、项目职责
- ①使用Spring AOP切面记录日志;
4、项目实现
整体流程图:
表结构:
Action2:在这个项目中的收获?
- ①创新点:
- ②拓展性:
- ③大数据量:
Action3:可以优化的地方?
- ①
4.1、操作日志使用场景
操作日志:主要是对某个对象进行新增操作或者修改操作后记录下这个新增或者修改,操作日志要求可读性比较强,因为它主要是给用户看的,比如对商品的操作信息,用户需要知道在什么时间发生了什么事情。再比如,运营对底层数据的处理记录信息。
在商品中心的使用:
- 改造
操作日志的记录格式大概分为下面几种:
1、单纯文案记录,比如:2021-09-16 10:00 商品发布。
2、修改表单,一次会修改多个字段。
问题:1、如何优雅地查看操作日志?
问题:2、需要跟旧数据比对得出多个修改记录,该如何优雅的搞定?
- object 对象多字段 diff 的功能,可以生成多字段修改的操作日志文案
问题 3、有什么办法保证和主线程的上下文继承,除了手动传参这种侵入性太强的方法以外?
- 使用阿里 TransmittableThreadLocal
4.2、实现方式
2.1、使用 Canal 监听数据库记录操作日志
优点:这种方式的优点是和业务逻辑完全分离,dbChange也能监听
缺点:修改了其他团队的RPC调用,就没法监听数据库了
2.2 通过日志文件的方式记录
2.3、通过 LogUtil 的方式记录日志
2.4、方法注解实现操作日志
public class LogRecordContext {
private static final InheritableThreadLocal<Stack<Map<String, Object>>> variableMapStack = new InheritableThreadLocal<>();
// 其他省略 ....
}
-
如果支持线程池可以使用阿里巴巴开源的 TTL 框架。
-
那这里 为什么不直接设置一个 ThreadLocal 对象,而是要设置一个 Stack 结构呢?
-
@LogRecord(content = " 修改了订单的配送员:从 "{deveryUser{#oldDeliveryUserId}}", 修改到 "{deveryUser{#request.getUserId()}}"",bizNo="#request.getDeliveryOrderNo()") public void modifyAddress(updateDeliveryRequest request){ // 查询出原来的地址是什么 LogRecordContext.putVariable("oldDeliveryUserId", DeliveryService.queryOldDeliveryUserId(request.getDeliveryOrderNo())); // 更新派送信息 电话,收件人、地址 doUpdate(request); }
-
使用 LogRecordAnnotation 的方法里面嵌套了另一个使 用 LogRecordAnnotation 方法的时候,流程就变成下面的形式
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xfSaRcck-1644977793313)(/Users/qiwenjie/Library/Application Support/typora-user-images/image-20220205121323575.png)]
-
4.3、使用AOP生成日志
4.3.1 支持字段级别对比 **
– 我是怎么做的呢?
4.4、代码实现
4.4.1、代码结构
4.4.2、模块介绍
5、项目结果
这篇文章介绍了操作日志的常见写法,以及如何让操作日志的实现更加简单、易懂,通过组件的四个模块,介绍了组件的具体实现。