
基于 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 使用方式