⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 http://www.iocoder.cn/Apollo/config-service-audit/ 「芋道源码」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

阅读源码最好的方式,是使用 IDEA 进行调试 Apollo 源码,不然会一脸懵逼。

胖友可以点击「芋道源码」扫码关注,回复 git018 关键字
获得艿艿添加了中文注释的 Apollo 源码地址。

阅读源码很孤单,加入源码交流群,一起坚持!

1. 概述

老艿艿:本系列假定胖友已经阅读过 《Apollo 官方 wiki 文档》

本文分享 Config Service 操作审计日志 Audit 。在每次在做 ConfigDB 写操作( 增、删、改 )操作时,都会记录一条 Audit 日志,用于未来的审计追溯。

老艿艿:这种实践方式,非常适用于我们做的管理平台

2. Audit

com.ctrip.framework.apollo.biz.entity.Audit ,继承 BaseEntity 抽象类,Audit 实体。代码如下:

@Entity
@Table(name = "Audit")
@SQLDelete(sql = "Update Audit set isDeleted = 1 where id = ?")
@Where(clause = "isDeleted = 0")
public class Audit extends BaseEntity {

/**
* 操作枚举
*/
public enum OP {
INSERT, UPDATE, DELETE
}

/**
* 实体名
*/
@Column(name = "EntityName", nullable = false)
private String entityName;
/**
* 实体编号
*/
@Column(name = "EntityId")
private Long entityId;
/**
* 操作名
*/
@Column(name = "OpName", nullable = false)
private String opName;
/**
* 备注
*/
@Column(name = "Comment")
private String comment;

}

  • entityName + entityId 字段,确实一个实体对象。
  • opName 字段,操作。分成 INSERT、UPDATE、DELETE 三种,在 OP 中枚举。
  • comment 字段,备注。
  • 例如:例子

老艿艿:在管理平台中,我比较喜欢再增加几个字段

  • ip 字段,请求方的 IP 。
  • ua 字段,请求的 User-Agent 。
  • extras 字段,数据结果为 Map 进行 JSON 化,存储重要字段。例如,更新用户手机号,那么会存储 mobile=15601691024extras 字段中。

3. AuditService

apollo-biz 项目中,com.ctrip.framework.apollo.biz.service.AuditService ,提供 Aduit 的 Service 逻辑给 Admin Service 和 Config Service 。

@Service
public class AuditService {

@Autowired
private AuditRepository auditRepository;

List<Audit> findByOwner(String owner) {
return auditRepository.findByOwner(owner);
}

List<Audit> find(String owner, String entity, String op) {
return auditRepository.findAudits(owner, entity, op);
}

@Transactional
void audit(String entityName, Long entityId, Audit.OP op, String owner) {
Audit audit = new Audit();
audit.setEntityName(entityName);
audit.setEntityId(entityId);
audit.setOpName(op.name());
audit.setDataChangeCreatedBy(owner);
auditRepository.save(audit);
}

@Transactional
void audit(Audit audit) {
auditRepository.save(audit);
}

}

4. AuditRepository

com.ctrip.framework.apollo.biz.repository.AuditRepository ,继承 org.springframework.data.repository.PagingAndSortingRepository 接口,提供 Audit 的数据访问 给 Admin Service 和 Config Service 。代码如下:

public interface AuditRepository extends PagingAndSortingRepository<Audit, Long> {

@Query("SELECT a from Audit a WHERE a.dataChangeCreatedBy = :owner")
List<Audit> findByOwner(@Param("owner") String owner);

@Query("SELECT a from Audit a WHERE a.dataChangeCreatedBy = :owner AND a.entityName =:entity AND a.opName = :op")
List<Audit> findAudits(@Param("owner") String owner, @Param("entity") String entity, @Param("op") String op);

}

666. 彩蛋

水更一小篇,美滋滋。

知识星球

文章目录
  1. 1. 1. 概述
  2. 2. 2. Audit
  3. 3. 3. AuditService
  4. 4. 4. AuditRepository
  5. 5. 666. 彩蛋