|
|
@@ -2,7 +2,6 @@ package cn.reghao.tnb.gateway.limiter;
|
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
-import cn.reghao.tnb.gateway.log.GatewayLogService;
|
|
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
@@ -23,33 +22,32 @@ import reactor.core.publisher.Mono;
|
|
|
import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.setResponseStatus;
|
|
|
|
|
|
/**
|
|
|
+ * 继承 org.springframework.cloud.gateway.filter.factory.RequestRateLimiterGatewayFilterFactory
|
|
|
+ *
|
|
|
* @author reghao
|
|
|
- * @date 2024-11-21 14:44:23
|
|
|
+ * @date 2025-07-16 10:02:14
|
|
|
*/
|
|
|
@Slf4j
|
|
|
-//@Primary
|
|
|
-//@Component
|
|
|
-public class MyLimiterFilterFactory extends RequestRateLimiterGatewayFilterFactory {
|
|
|
+@Primary
|
|
|
+@Component
|
|
|
+public class MyRequestRateLimiterGatewayFilterFactory extends RequestRateLimiterGatewayFilterFactory {
|
|
|
private static final String EMPTY_KEY = "____EMPTY_KEY__";
|
|
|
private final ObjectMapper objectMapper;
|
|
|
- private final GatewayLogService gatewayLogService;
|
|
|
|
|
|
- public MyLimiterFilterFactory(RateLimiter defaultRateLimiter, KeyResolver defaultKeyResolver,
|
|
|
- ObjectMapper objectMapper, GatewayLogService gatewayLogService) {
|
|
|
+ public MyRequestRateLimiterGatewayFilterFactory(RateLimiter defaultRateLimiter,
|
|
|
+ KeyResolver defaultKeyResolver,
|
|
|
+ ObjectMapper objectMapper) {
|
|
|
super(defaultRateLimiter, defaultKeyResolver);
|
|
|
this.objectMapper = objectMapper;
|
|
|
- this.gatewayLogService = gatewayLogService;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public GatewayFilter apply(RequestRateLimiterGatewayFilterFactory.Config config) {
|
|
|
KeyResolver resolver = getOrDefault(config.getKeyResolver(), super.getDefaultKeyResolver());
|
|
|
- @SuppressWarnings("unchecked")
|
|
|
RateLimiter<Object> limiter = getOrDefault(config.getRateLimiter(), super.getDefaultRateLimiter());
|
|
|
boolean denyEmpty = getOrDefault(config.getDenyEmptyKey(), super.isDenyEmptyKey());
|
|
|
- HttpStatusHolder emptyKeyStatus = HttpStatusHolder
|
|
|
- .parse(getOrDefault(config.getEmptyKeyStatus(), super.getEmptyKeyStatusCode()));
|
|
|
-
|
|
|
+ HttpStatusHolder emptyKeyStatus = HttpStatusHolder.parse(getOrDefault(config.getEmptyKeyStatus(), super.getEmptyKeyStatusCode()));
|
|
|
+
|
|
|
return (exchange, chain) -> resolver.resolve(exchange).defaultIfEmpty(EMPTY_KEY).flatMap(key -> {
|
|
|
if (EMPTY_KEY.equals(key)) {
|
|
|
if (denyEmpty) {
|
|
|
@@ -64,11 +62,11 @@ public class MyLimiterFilterFactory extends RequestRateLimiterGatewayFilterFacto
|
|
|
assert route != null;
|
|
|
routeId = route.getId();
|
|
|
}
|
|
|
+
|
|
|
return limiter.isAllowed(routeId, key).flatMap(response -> {
|
|
|
for (Map.Entry<String, String> header : response.getHeaders().entrySet()) {
|
|
|
exchange.getResponse().getHeaders().add(header.getKey(), header.getValue());
|
|
|
}
|
|
|
-
|
|
|
if (response.isAllowed()) {
|
|
|
return chain.filter(exchange);
|
|
|
}
|
|
|
@@ -79,7 +77,6 @@ public class MyLimiterFilterFactory extends RequestRateLimiterGatewayFilterFacto
|
|
|
log.warn("Unable to set status code to " + serverHttpResponse + ". Response already committed.");
|
|
|
}
|
|
|
serverHttpResponse.getHeaders().setContentType(MediaType.APPLICATION_JSON);
|
|
|
- gatewayLogService.setGatewayLog(exchange);
|
|
|
return serverHttpResponse.writeWith(Mono.create(monoSink -> {
|
|
|
try {
|
|
|
String body = "REQUEST_RATE_LIMIT";
|