1 需求拆解
博文将始终围绕着一个Target进行论述:如何记录接口处理过程的URI、接口调用方、接口提供方、入参、接口响应状态(即成功或失败)以及异常日志。
- 可以借助Spring AOP 实现。
- 思路:自定义注解,此处记为 @ApiInvokeRecord。那么只要Controller层的method标注了 @ApiInvokeRecord,将会触发 AOP 处理,将接口调用过程信息记录下来,保存至DataBase。
- 步骤细化:前置通知 负责收集 接口调用方、接口提供方、接口URL、处理时间、参数列表 这5个数据项,返回通知 和 异常通知 负责收集接口的响应状态和异常信息。
2 自定义注解 @ApiInvokeRecord
- @ApiInvokeRecord 作用:手动指定接口调用方和接口提供方。
@Target({
ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiInvokeRecord {
/**
* 接口调用方。例如 InvokeSourceEnum.MICRO_SERVICE_A
*
* @see com.itbounds.dev.apiinvokelog.common.enums.InvokeSourceEnum
*/
InvokeSourceEnum caller();
/**
* 接口提供方。例如 InvokeSourceEnum.MICRO_SERVICE_B
*
* @see com.itbounds.dev.apiinvokelog.common.enums.InvokeSourceEnum
*/
InvokeSourceEnum callee() default InvokeSourceEnum.MICRO_SERVICE_B;
}
3 定义切面 ApiInvokeAspect
3.1 Maven Dependency
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
3.2 @EnableAspectJAutoProxy 开启Aop
@SpringBootApplication
@EnableAspectJAutoProxy
public class ApiInvokeLogApplication {
public static void main(String[] args) {
SpringApplication.run(ApiInvokeLogApplication.class, args);
}
}
3.3 定义切面 ApiInvokeAspect
/**
* @Description 接口调用切面定义
* @Author blake
* @Date 2019/9/29 2:37 下午
* @Version 1.0
*/
@Component
@Aspect
@Slf4j
public class