基于 SpringBoot, 可以记录 Http 请求日志,根据日志可选重试补偿。
特点:侵入小,集成简单。
对外请求(第三方 API 、内部服务请求),或者被请求时( Servlet )
记录日志分析,后续根据日志重试补偿。
RestTemplate
为例支持其他( ApacheHttpClient 、OKHttp 、Feign )
<dependency>
<groupId>io.github.requestlog</groupId>
<artifactId>request-log-resttemplate-starter</artifactId>
<version>1.0</version>
</dependency>
@RequestLogEnhanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
记录日志用,不定义默认加载一个 Slf4jRequestLogRepository
@Component
public class MyRequestLogRepository implements IRequestLogRepository {
@Override
public void saveRequestLog(RequestLog requestLog) {
// save request log
}
@Override
public void saveRequestLogAndRetryJob(RequestLog requestLog, RequestRetryJob requestRetryJob) {
// save request log and retry job
}
}
包装后的代码,出现 Exception
或 http code
非 2xx
就算失败,就会记录
// 原始请求
String result = restTemplate.getForObject("url", String.class);
// 使用 LogContext 包装请求
String result = LogContext.log().execute(() -> {
return restTemplate.getForObject("url", String.class);
});
看个意思,如果感兴趣,看项目内详细文档吧。
LogContext.retry()
.retryWaitStrategy(RetryWaitStrategy.FIXED)
.retryInterval(60)
.ignoreException(RuntimeException.class, IOException.class, NumberFormatException.class)
.ignoreException(exception -> exception instanceof ClassCastException)
.successWhenResponse(requestContext -> {
return requestContext.getResponseCode() == 200;
})
.execute(() -> {
return restTemplate.getForObject("url", String.class);
});
已上传到中央仓库(阿里 mirror 可能还没有同步)
欢迎体验、提意见、提需求
项目地址:https://github.com/requestlog/request-log
RestTemplate 使用方式
ApacheHttpClient 使用方式
OKHttp 使用方式
Feign 使用方式
Servlet 使用方式