feat:限流+重试+

This commit is contained in:
xiang
2025-07-29 20:50:07 +08:00
parent 3d8010f460
commit 6eabd62cb0
5 changed files with 114 additions and 0 deletions

View File

@@ -14,6 +14,7 @@
<module>xservice-third-part</module> <module>xservice-third-part</module>
<module>xservice-mysql-starter</module> <module>xservice-mysql-starter</module>
<module>xservice-schedule-starter</module> <module>xservice-schedule-starter</module>
<module>xservice-http-starter</module>
</modules> </modules>
<properties> <properties>

View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.xiang</groupId>
<artifactId>xservice-basic</artifactId>
<version>1.1-SNAPSHOT</version>
</parent>
<artifactId>xservice-http-starter</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.github.rholder</groupId>
<artifactId>guava-retrying</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,25 @@
package com.xiang.xservice.http.config;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ConfigurationProperties(prefix = "http")
public class HttpConfig {
/**
* 最大重试次数
*/
private int maxAttempts;
/**
* 重试等待时间 ms
*/
private long sleepMs;
}

View File

@@ -0,0 +1,56 @@
package com.xiang.xservice.http.helper;
import com.github.rholder.retry.Retryer;
import com.github.rholder.retry.RetryerBuilder;
import com.github.rholder.retry.StopStrategies;
import com.github.rholder.retry.WaitStrategies;
import com.xiang.xservice.http.config.HttpConfig;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.Objects;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
@Slf4j
@Component
@RequiredArgsConstructor
public class HttpRequestHelper {
private final HttpConfig httpConfig;
/**
* 封装带重试和延迟的请求调用
*
* @param supplier 实际请求的逻辑
* @param logTag 日志标识(便于排查)
* @param <T> 返回值类型
* @return 请求结果,如果失败则返回 null
*/
public <T> T fetchWithRetry(Supplier<T> supplier, String logTag) {
Retryer<T> retryer = RetryerBuilder.<T>newBuilder()
.retryIfException()
.retryIfResult(Objects::isNull)
// 重试等待间隔
.withWaitStrategy(WaitStrategies.fixedWait(httpConfig.getSleepMs(), TimeUnit.MILLISECONDS))
// 最大重试次数
.withStopStrategy(StopStrategies.stopAfterAttempt(httpConfig.getMaxAttempts()))
.build();
Callable<T> callable = () -> {
T result = supplier.get();
// 每次请求后固定等待,用于限速
Thread.sleep(httpConfig.getSleepMs());
return result;
};
try {
return retryer.call(callable);
} catch (Exception e) {
log.warn("[{}] 请求失败,重试 {} 次后仍未成功,错误: {}", logTag, httpConfig.getMaxAttempts(), e.getMessage(), e);
return null;
}
}
}

View File

@@ -0,0 +1,2 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.xiang.xservice.http.config.HttpConfig