From 1ee2f38575b907a680979db9812473e82bea32e7 Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Tue, 11 Apr 2023 11:22:15 +0800 Subject: [PATCH 1/7] Debug github action --- .github/workflows/maven.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 1862d18..8d5ef6e 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -85,6 +85,7 @@ jobs: push: true tags: fizzgate/fizz-gateway-community:${{ steps.releaseVersion.outputs.substring }} - name: Publish to Apache Maven Central + run: mvn -X -e deploy if: startsWith(github.ref, 'refs/tags/') uses: samuelmeuli/action-maven-publish@v1 with: From 4039e31fd4b2aa445b4b7174fb312b8be00803ae Mon Sep 17 00:00:00 2001 From: Francis Dong Date: Sun, 25 Jun 2023 10:09:52 +0800 Subject: [PATCH 2/7] Add emptyList/emptyMap functions #477 --- .../fizzgate/fizz/function/CommonFunc.java | 23 +++++++++++ .../fizzgate/fizz/function/FuncExecutor.java | 20 +++++++++ .../com/fizzgate/fizz/function/ListFunc.java | 10 +++++ .../fizz/function/CommonFuncTests.java | 41 +++++++++++++++++++ .../fizzgate/fizz/function/ListFuncTests.java | 23 +++++++++++ 5 files changed, 117 insertions(+) diff --git a/fizz-core/src/main/java/com/fizzgate/fizz/function/CommonFunc.java b/fizz-core/src/main/java/com/fizzgate/fizz/function/CommonFunc.java index 9b59ffc..4ce0827 100644 --- a/fizz-core/src/main/java/com/fizzgate/fizz/function/CommonFunc.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/function/CommonFunc.java @@ -18,7 +18,10 @@ package com.fizzgate.fizz.function; import java.lang.reflect.Array; +import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; +import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; @@ -65,6 +68,8 @@ public class CommonFunc implements IFunc { FuncExecutor.register(NAME_SPACE_PREFIX + "common.and", this); FuncExecutor.register(NAME_SPACE_PREFIX + "common.or", this); FuncExecutor.register(NAME_SPACE_PREFIX + "common.not", this); + FuncExecutor.register(NAME_SPACE_PREFIX + "common.emptyMap", this); + FuncExecutor.register(NAME_SPACE_PREFIX + "common.emptyList", this); } /** @@ -174,4 +179,22 @@ public class CommonFunc implements IFunc { return !(obj == null ? false : obj); } + /** + * Return an empty map + * + * @return + */ + public Map emptyMap() { + return new HashMap<>(); + } + + /** + * Return an empty list + * + * @return + */ + public List> emptyList() { + return new ArrayList<>(); + } + } diff --git a/fizz-core/src/main/java/com/fizzgate/fizz/function/FuncExecutor.java b/fizz-core/src/main/java/com/fizzgate/fizz/function/FuncExecutor.java index 4292196..e2e5fab 100644 --- a/fizz-core/src/main/java/com/fizzgate/fizz/function/FuncExecutor.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/function/FuncExecutor.java @@ -312,6 +312,26 @@ public class FuncExecutor { argsStrContainer = this.trimArgStr(argsStrContainer, 5, isVarArgs, paramTypes.length, funcExpression); argsStr = argsStrContainer.getArgsStr(); i = argsStrContainer.getIndex(); + } else if (argsStr.matches("^\\[\\]\\s*,.*") || argsStr.matches("^\\[\\]\\s*\\).*")) { // [] + if (isVarArgs && i == paramTypes.length - 1) { + varArgs.add(new ArrayList()); + args[i] = varArgs.toArray(new ArrayList[varArgs.size()]); + } else { + args[i] = new ArrayList(); + } + argsStrContainer = this.trimArgStr(argsStrContainer, 2, isVarArgs, paramTypes.length, funcExpression); + argsStr = argsStrContainer.getArgsStr(); + i = argsStrContainer.getIndex(); + } else if (argsStr.matches("^\\{\\}\\s*,.*") || argsStr.matches("^\\{\\}\\s*\\).*")) { // {} + if (isVarArgs && i == paramTypes.length - 1) { + varArgs.add(new HashMap()); + args[i] = varArgs.toArray(new HashMap[varArgs.size()]); + } else { + args[i] = new HashMap(); + } + argsStrContainer = this.trimArgStr(argsStrContainer, 2, isVarArgs, paramTypes.length, funcExpression); + argsStr = argsStrContainer.getArgsStr(); + i = argsStrContainer.getIndex(); } else if (argsStr.startsWith("{")) { // reference value int pos = argsStr.indexOf("}", 1); if (pos != -1) { diff --git a/fizz-core/src/main/java/com/fizzgate/fizz/function/ListFunc.java b/fizz-core/src/main/java/com/fizzgate/fizz/function/ListFunc.java index 7c41a49..2ceeb67 100644 --- a/fizz-core/src/main/java/com/fizzgate/fizz/function/ListFunc.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/function/ListFunc.java @@ -62,6 +62,7 @@ public class ListFunc implements IFunc { FuncExecutor.register(NAME_SPACE_PREFIX + "list.join", this); FuncExecutor.register(NAME_SPACE_PREFIX + "list.rename", this); FuncExecutor.register(NAME_SPACE_PREFIX + "list.removeFields", this); + FuncExecutor.register(NAME_SPACE_PREFIX + "list.emptyList", this); } /** @@ -227,5 +228,14 @@ public class ListFunc implements IFunc { } return data; } + + /** + * Return an empty list + * + * @return + */ + public List> emptyList() { + return new ArrayList<>(); + } } diff --git a/fizz-core/src/test/java/com/fizzgate/fizz/function/CommonFuncTests.java b/fizz-core/src/test/java/com/fizzgate/fizz/function/CommonFuncTests.java index a195e6a..339fc35 100644 --- a/fizz-core/src/test/java/com/fizzgate/fizz/function/CommonFuncTests.java +++ b/fizz-core/src/test/java/com/fizzgate/fizz/function/CommonFuncTests.java @@ -16,6 +16,7 @@ */ package com.fizzgate.fizz.function; +import static org.junit.Assert.assertNull; import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.ArrayList; @@ -116,6 +117,46 @@ class CommonFuncTests { assertEquals(true, result); } + @Test + void testIif6() { + // test [] + String funcExpression = "fn.common.iif(false, \"abc\", [])"; + List result = (List)FuncExecutor.getInstance().exec(null, funcExpression); + assertEquals(true, result.size() == 0); + } + + @Test + void testIif7() { + // test {} + String funcExpression = "fn.common.iif(false, \"abc\", {})"; + Map result = (Map)FuncExecutor.getInstance().exec(null, funcExpression); + assertEquals(true, result.size() == 0); + } + + @Test + void testIif8() { + // test [] + String funcExpression = "fn.common.iif(false, \"abc\", fn.common.emptyList())"; + List result = (List)FuncExecutor.getInstance().exec(null, funcExpression); + assertEquals(true, result.size() == 0); + } + + @Test + void testIif9() { + // test {} + String funcExpression = "fn.common.iif(false, \"abc\", fn.common.emptyMap())"; + Map result = (Map)FuncExecutor.getInstance().exec(null, funcExpression); + assertEquals(true, result.size() == 0); + } + + @Test + void testIif10() { + // test null + String funcExpression = "fn.common.iif(false, \"abc\", null)"; + Map result = (Map)FuncExecutor.getInstance().exec(null, funcExpression); + assertNull(result); + } + @Test void testEquals() { String funcExpression = "fn.common.equals(\"abc\", true)"; diff --git a/fizz-core/src/test/java/com/fizzgate/fizz/function/ListFuncTests.java b/fizz-core/src/test/java/com/fizzgate/fizz/function/ListFuncTests.java index 81957fa..c2be563 100644 --- a/fizz-core/src/test/java/com/fizzgate/fizz/function/ListFuncTests.java +++ b/fizz-core/src/test/java/com/fizzgate/fizz/function/ListFuncTests.java @@ -106,6 +106,29 @@ class ListFuncTests { assertEquals("a2", ((Map) result.get(1)).get("a").toString()); assertEquals("a4", ((Map) result.get(3)).get("a").toString()); } + + @Test + void testMerge2() { + List subList1 = new ArrayList<>(); + subList1.add(createRecord("a", "a1")); + subList1.add(createRecord("a", "a2")); + subList1.add(createRecord("a", "a3")); + + List subList2 = new ArrayList<>(); + subList2.add(createRecord("a", "a4")); + subList2.add(createRecord("a", "a5")); + subList2.add(createRecord("a", "a6")); + + ONode ctxNode = ONode.load(new HashMap()); + PathMapping.setByPath(ctxNode, "test.data1", subList1, true); + PathMapping.setByPath(ctxNode, "test.data2", subList2, true); + + String funcExpression = "fn.list.merge({test.data1}, [] , {test.data2})"; + List result = (List) FuncExecutor.getInstance().exec(ctxNode, funcExpression); + assertEquals(6, result.size()); + assertEquals("a2", ((Map) result.get(1)).get("a").toString()); + assertEquals("a4", ((Map) result.get(3)).get("a").toString()); + } @Test void testExtract() { From e138e380bdf8d22d7b0542b7a17aa0c640dad16e Mon Sep 17 00:00:00 2001 From: Francis Dong Date: Mon, 26 Jun 2023 15:19:49 +0800 Subject: [PATCH 3/7] update gateway prefix to / --- fizz-bootstrap/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fizz-bootstrap/src/main/resources/application.yml b/fizz-bootstrap/src/main/resources/application.yml index 9bd105e..28f67c1 100644 --- a/fizz-bootstrap/src/main/resources/application.yml +++ b/fizz-bootstrap/src/main/resources/application.yml @@ -93,7 +93,7 @@ flow-stat-sched: queue: fizz_resource_access_stat gateway: - prefix: /proxy + prefix: / aggr: # set headers when calling the backend API proxy_set_headers: X-Real-IP,X-Forwarded-Proto,X-Forwarded-For From a90c7358182c0e279eff49fb77d9988e9b809e98 Mon Sep 17 00:00:00 2001 From: Francis Dong Date: Wed, 28 Jun 2023 16:59:08 +0800 Subject: [PATCH 4/7] support rejecting all requests by ratelimit --- fizz-core/src/main/java/com/fizzgate/stats/FlowStat.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fizz-core/src/main/java/com/fizzgate/stats/FlowStat.java b/fizz-core/src/main/java/com/fizzgate/stats/FlowStat.java index 919177a..b87c81d 100644 --- a/fizz-core/src/main/java/com/fizzgate/stats/FlowStat.java +++ b/fizz-core/src/main/java/com/fizzgate/stats/FlowStat.java @@ -161,10 +161,10 @@ public class FlowStat { for (ResourceConfig resourceConfig : resourceConfigs) { long maxCon = resourceConfig.getMaxCon(); long maxQPS = resourceConfig.getMaxQPS(); - if (maxCon > 0 || maxQPS > 0) { + if (maxCon >= 0 || maxQPS >= 0) { ResourceStat resourceStat = getResourceStat(resourceConfig.getResourceId()); // check concurrent request - if (maxCon > 0) { + if (maxCon >= 0) { long n = resourceStat.getConcurrentRequests().get(); if (n >= maxCon) { resourceStat.incrBlockRequestToTimeSlot(curTimeSlotId); @@ -184,7 +184,7 @@ public class FlowStat { } // check QPS - if (maxQPS > 0) { + if (maxQPS >= 0) { long total = resourceStat.getTimeSlot(curTimeSlotId).getCounter(); if (total >= maxQPS) { resourceStat.incrBlockRequestToTimeSlot(curTimeSlotId); From d7b5fb784a3109aecbec656ff4f13b7dc2e37e49 Mon Sep 17 00:00:00 2001 From: Francis Dong Date: Thu, 29 Jun 2023 11:27:25 +0800 Subject: [PATCH 5/7] Fix repeated read issue of request body of CallbackFilter #478 --- .../com/fizzgate/filter/CallbackFilter.java | 68 +++++++++++-------- .../com/fizzgate/proxy/CallbackService.java | 9 ++- 2 files changed, 45 insertions(+), 32 deletions(-) diff --git a/fizz-core/src/main/java/com/fizzgate/filter/CallbackFilter.java b/fizz-core/src/main/java/com/fizzgate/filter/CallbackFilter.java index 212f9ed..51ae47c 100644 --- a/fizz-core/src/main/java/com/fizzgate/filter/CallbackFilter.java +++ b/fizz-core/src/main/java/com/fizzgate/filter/CallbackFilter.java @@ -27,6 +27,8 @@ import com.fizzgate.proxy.CallbackService; import com.fizzgate.proxy.DiscoveryClientUriSelector; import com.fizzgate.proxy.ServiceInstance; import com.fizzgate.service_registry.RegistryCenterService; +import com.fizzgate.spring.http.server.reactive.ext.FizzServerHttpRequestDecorator; +import com.fizzgate.spring.web.server.ext.FizzServerWebExchangeDecorator; import com.fizzgate.util.Consts; import com.fizzgate.util.NettyDataBufferUtils; import com.fizzgate.util.ThreadContext; @@ -36,9 +38,6 @@ import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.annotation.Order; -import org.springframework.core.io.buffer.DataBuffer; -import org.springframework.core.io.buffer.DataBufferUtils; -import org.springframework.core.io.buffer.PooledDataBuffer; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -90,33 +89,47 @@ public class CallbackFilter extends FizzWebFilter { private GatewayGroupService gatewayGroupService; @Override - public Mono doFilter(ServerWebExchange exchange, WebFilterChain chain) { + public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { + String traceId = WebUtils.getTraceId(exchange); + org.apache.logging.log4j.ThreadContext.put(Consts.TRACE_ID, traceId); - FilterResult pfr = WebUtils.getPrevFilterResult(exchange); - if (!pfr.success) { - return WebUtils.getDirectResponse(exchange); + ServerHttpRequest req = exchange.getRequest(); + if (req instanceof FizzServerHttpRequestDecorator) { + return doFilter(exchange, chain); } - + return + NettyDataBufferUtils.join(req.getBody()).defaultIfEmpty(NettyDataBufferUtils.EMPTY_DATA_BUFFER) + .flatMap( + body -> { + FizzServerHttpRequestDecorator requestDecorator = new FizzServerHttpRequestDecorator(req); + if (body != NettyDataBufferUtils.EMPTY_DATA_BUFFER) { + try { + requestDecorator.setBody(body); + } finally { + NettyDataBufferUtils.release(body); + } + } + ServerWebExchange mutatedExchange = exchange.mutate().request(requestDecorator).build(); + ServerWebExchange newExchange = mutatedExchange; + MediaType contentType = req.getHeaders().getContentType(); + if (MediaType.APPLICATION_FORM_URLENCODED.isCompatibleWith(contentType)) { + newExchange = new FizzServerWebExchangeDecorator(mutatedExchange); + } + return doFilter(newExchange, chain); + } + ); + } + + public Mono doFilter(ServerWebExchange exchange, WebFilterChain chain) { + String traceId = WebUtils.getTraceId(exchange); + org.apache.logging.log4j.ThreadContext.put(Consts.TRACE_ID, traceId); + ApiConfig ac = WebUtils.getApiConfig(exchange); if (ac != null && ac.type == ApiConfig.Type.CALLBACK) { CallbackConfig cc = ac.callbackConfig; - ServerHttpRequest req = exchange.getRequest(); - return - DataBufferUtils.join(req.getBody()).defaultIfEmpty(NettyDataBufferUtils.EMPTY_DATA_BUFFER) - .flatMap( - b -> { - DataBuffer body = null; - if (b != NettyDataBufferUtils.EMPTY_DATA_BUFFER) { - if (b instanceof PooledDataBuffer) { - try { - body = NettyDataBufferUtils.copy2heap(b); - } finally { - NettyDataBufferUtils.release(b); - } - } else { - body = b; - } - } + FizzServerHttpRequestDecorator req = (FizzServerHttpRequestDecorator) exchange.getRequest(); + return req.getBody().defaultIfEmpty(NettyDataBufferUtils.EMPTY_DATA_BUFFER).single().flatMap(b -> { + String body = b.toString(StandardCharsets.UTF_8); HashMap service2instMap = getService2instMap(ac); HttpHeaders headers = WebUtils.mergeAppendHeaders(exchange); pushReq2manager(exchange, headers, body, service2instMap, cc.id, ac.gatewayGroups.iterator().next()); @@ -175,7 +188,7 @@ public class CallbackFilter extends FizzWebFilter { private static final String _receivers = "\"receivers\":"; private static final String _gatewayGroup = "\"gatewayGroup\":"; - private void pushReq2manager(ServerWebExchange exchange, HttpHeaders headers, DataBuffer body, HashMap service2instMap, int callbackConfigId, + private void pushReq2manager(ServerWebExchange exchange, HttpHeaders headers, Object body, HashMap service2instMap, int callbackConfigId, String gatewayGroup) { ServerHttpRequest req = exchange.getRequest(); @@ -215,7 +228,8 @@ public class CallbackFilter extends FizzWebFilter { if (body != null) { b.append(Consts.S.COMMA); - String bodyStr = body.toString(StandardCharsets.UTF_8); + // String bodyStr = body.toString(StandardCharsets.UTF_8); + String bodyStr = body.toString(); MediaType contentType = req.getHeaders().getContentType(); if (contentType != null && contentType.getSubtype().equalsIgnoreCase(json)) { b.append(_body); b.append(JSON.toJSONString(bodyStr)); diff --git a/fizz-core/src/main/java/com/fizzgate/proxy/CallbackService.java b/fizz-core/src/main/java/com/fizzgate/proxy/CallbackService.java index dd14621..5440a98 100644 --- a/fizz-core/src/main/java/com/fizzgate/proxy/CallbackService.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/CallbackService.java @@ -19,7 +19,6 @@ package com.fizzgate.proxy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.core.io.buffer.DataBuffer; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.server.reactive.ServerHttpRequest; @@ -81,7 +80,7 @@ public class CallbackService { aggrConfigPrefix = systemConfig.getGatewayPrefix() + '/'; } - public Mono requestBackends(ServerWebExchange exchange, HttpHeaders headers, DataBuffer body, CallbackConfig cc, Map service2instMap) { + public Mono requestBackends(ServerWebExchange exchange, HttpHeaders headers, String body, CallbackConfig cc, Map service2instMap) { ServerHttpRequest req = exchange.getRequest(); String traceId = WebUtils.getTraceId(exchange); HttpMethod method = req.getMethod(); @@ -140,21 +139,21 @@ public class CallbackService { ; } - private Function> crError(ServerWebExchange exchange, Receiver r, HttpMethod method, HttpHeaders headers, DataBuffer body) { + private Function> crError(ServerWebExchange exchange, Receiver r, HttpMethod method, HttpHeaders headers, String body) { return t -> { log(exchange, r, method, headers, body, t); return Mono.just(new FizzFailClientResponse(t)); }; } - private Function> arError(ServerWebExchange exchange, Receiver r, HttpMethod method, HttpHeaders headers, DataBuffer body) { + private Function> arError(ServerWebExchange exchange, Receiver r, HttpMethod method, HttpHeaders headers, String body) { return t -> { log(exchange, r, method, headers, body, t); return Mono.just(new FailAggregateResult(t)); }; } - private void log(ServerWebExchange exchange, Receiver r, HttpMethod method, HttpHeaders headers, DataBuffer body, Throwable t) { + private void log(ServerWebExchange exchange, Receiver r, HttpMethod method, HttpHeaders headers, String body, Throwable t) { StringBuilder b = ThreadContext.getStringBuilder(); WebUtils.request2stringBuilder(exchange, b); b.append(Consts.S.LINE_SEPARATOR).append(callback).append(Consts.S.LINE_SEPARATOR); From 9ddd5848312cbec95a87611c96b41ea452dbb319 Mon Sep 17 00:00:00 2001 From: Francis Dong Date: Thu, 29 Jun 2023 11:28:47 +0800 Subject: [PATCH 6/7] support rejecting all requests by ratelimit --- .../main/java/com/fizzgate/stats/ResourceConfig.java | 8 ++++---- .../stats/ratelimit/ResourceRateLimitConfig.java | 4 ++-- .../com/fizzgate/proxy/CallbackServiceTests.java | 3 ++- .../test/java/com/fizzgate/stats/FlowStatTests.java | 12 ++++++------ 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/fizz-core/src/main/java/com/fizzgate/stats/ResourceConfig.java b/fizz-core/src/main/java/com/fizzgate/stats/ResourceConfig.java index 8c2b22f..651a185 100644 --- a/fizz-core/src/main/java/com/fizzgate/stats/ResourceConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/stats/ResourceConfig.java @@ -46,14 +46,14 @@ public class ResourceConfig { // Flow control rule //--------------------------------------------------------------------- /** - * Maximum concurrent request, zero or negative for no limit + * Maximum concurrent request, negative for no limit */ - private long maxCon; + private long maxCon = -1L; /** - * Maximum QPS, zero or negative for no limit + * Maximum QPS, negative for no limit */ - private long maxQPS; + private long maxQPS = -1L; //--------------------------------------------------------------------- diff --git a/fizz-core/src/main/java/com/fizzgate/stats/ratelimit/ResourceRateLimitConfig.java b/fizz-core/src/main/java/com/fizzgate/stats/ratelimit/ResourceRateLimitConfig.java index 9eaf39b..24453e1 100644 --- a/fizz-core/src/main/java/com/fizzgate/stats/ratelimit/ResourceRateLimitConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/stats/ratelimit/ResourceRateLimitConfig.java @@ -63,9 +63,9 @@ public class ResourceRateLimitConfig { public byte type; - public long qps; + public long qps = -1L; - public long concurrents; + public long concurrents = -1L; public String responseType; diff --git a/fizz-core/src/test/java/com/fizzgate/proxy/CallbackServiceTests.java b/fizz-core/src/test/java/com/fizzgate/proxy/CallbackServiceTests.java index b0e16e4..1327577 100644 --- a/fizz-core/src/test/java/com/fizzgate/proxy/CallbackServiceTests.java +++ b/fizz-core/src/test/java/com/fizzgate/proxy/CallbackServiceTests.java @@ -23,6 +23,7 @@ import com.fizzgate.util.ReflectionUtils; import reactor.core.publisher.Mono; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; @@ -62,7 +63,7 @@ public class CallbackServiceTests { HttpHeaders headers = new HttpHeaders(); headers.add("h1", "v1"); - DataBuffer body = null; + String body = null; CallbackConfig callbackConfig = new CallbackConfig(); callbackConfig.receivers = new ArrayList<>(); diff --git a/fizz-core/src/test/java/com/fizzgate/stats/FlowStatTests.java b/fizz-core/src/test/java/com/fizzgate/stats/FlowStatTests.java index 0b797cc..95ac803 100644 --- a/fizz-core/src/test/java/com/fizzgate/stats/FlowStatTests.java +++ b/fizz-core/src/test/java/com/fizzgate/stats/FlowStatTests.java @@ -115,8 +115,8 @@ public class FlowStatTests { // Note: use different resource ID to avoid being affected by previous test data FlowRuleCase c5 = new FlowRuleCase(); - c5.resourceConfigs.add(new ResourceConfig("_global5", 0, 0)); - c5.resourceConfigs.add(new ResourceConfig("service5", 0, 0)); + c5.resourceConfigs.add(new ResourceConfig("_global5", -1L, -1L)); + c5.resourceConfigs.add(new ResourceConfig("service5", -1L, -1L)); c5.resourceExpects.add(new ResourceExpect(c5.totalReqs, c5.totalReqs, c5.totalReqs, 0)); c5.resourceExpects.add(new ResourceExpect(c5.totalReqs, c5.totalReqs, c5.totalReqs, 0)); c5.expectResult = IncrRequestResult.success(); @@ -124,8 +124,8 @@ public class FlowStatTests { // Note: use different resource ID to avoid being affected by previous test data FlowRuleCase c6 = new FlowRuleCase(); - c6.resourceConfigs.add(new ResourceConfig("_global6", 20, 0)); - c6.resourceConfigs.add(new ResourceConfig("service6", 20, 0)); + c6.resourceConfigs.add(new ResourceConfig("_global6", 20, -1L)); + c6.resourceConfigs.add(new ResourceConfig("service6", 20, -1L)); c6.resourceExpects.add(new ResourceExpect(20, 20, 20, c6.totalReqs - 20)); c6.resourceExpects.add(new ResourceExpect(20, 20, 20, 0)); c6.expectResult = IncrRequestResult.block("_global6", BlockType.CONCURRENT_REQUEST); @@ -133,8 +133,8 @@ public class FlowStatTests { // Note: use different resource ID to avoid being affected by previous test data FlowRuleCase c7 = new FlowRuleCase(); - c7.resourceConfigs.add(new ResourceConfig("_global7", 0, 0)); - c7.resourceConfigs.add(new ResourceConfig("service7", 0, 20)); + c7.resourceConfigs.add(new ResourceConfig("_global7", -1L, -1L)); + c7.resourceConfigs.add(new ResourceConfig("service7", -1L, 20)); c7.resourceExpects.add(new ResourceExpect(20, 20, 20, 0)); c7.resourceExpects.add(new ResourceExpect(20, 20, 20, c7.totalReqs - 20)); c7.expectResult = IncrRequestResult.block("service7", BlockType.QPS); From 37149cd82c45ec87a3059e70613446d4f05d1bd6 Mon Sep 17 00:00:00 2001 From: Francis Dong Date: Thu, 29 Jun 2023 17:46:58 +0800 Subject: [PATCH 7/7] support rejecting all requests by ratelimit --- .../java/com/fizzgate/filter/FlowControlFilter.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/fizz-core/src/main/java/com/fizzgate/filter/FlowControlFilter.java b/fizz-core/src/main/java/com/fizzgate/filter/FlowControlFilter.java index 8eb7bd3..e68843a 100644 --- a/fizz-core/src/main/java/com/fizzgate/filter/FlowControlFilter.java +++ b/fizz-core/src/main/java/com/fizzgate/filter/FlowControlFilter.java @@ -360,7 +360,7 @@ public class FlowControlFilter extends FizzWebFilter { if (hasHost) { // String resourceId = ResourceIdUtils.buildResourceId(app, ip, node, service, path); String resourceId = ResourceIdUtils.buildResourceId(null, null, node, null, null); - ResourceConfig resourceConfig = new ResourceConfig(resourceId, 0, 0); + ResourceConfig resourceConfig = new ResourceConfig(resourceId, -1L, -1L); resourceConfigs.add(resourceConfig); } checkRateLimitConfigAndAddTo(resourceConfigs, b, null, null, ResourceIdUtils.NODE, null, null, null); @@ -407,11 +407,11 @@ public class FlowControlFilter extends FizzWebFilter { } else { String node = ResourceIdUtils.getNode(resource); if (node != null && node.equals(ResourceIdUtils.NODE)) { - rc = new ResourceConfig(resource, 0, 0); + rc = new ResourceConfig(resource, -1L, -1L); } if (defaultRateLimitConfigId != null) { if (defaultRateLimitConfigId.equals(ResourceIdUtils.SERVICE_DEFAULT)) { - rc = new ResourceConfig(resource, 0, 0); + rc = new ResourceConfig(resource, -1L, -1L); rateLimitConfig = resourceRateLimitConfigService.getResourceRateLimitConfig(ResourceIdUtils.SERVICE_DEFAULT_RESOURCE); if (rateLimitConfig != null && rateLimitConfig.isEnable()) { rc.setMaxCon(rateLimitConfig.concurrents); @@ -441,7 +441,7 @@ public class FlowControlFilter extends FizzWebFilter { } }*/ if (cb != null) { - rc = new ResourceConfig(resource, 0, 0); + rc = new ResourceConfig(resource, -1L, -1L); resourceConfigs.add(rc); } } @@ -508,7 +508,7 @@ public class FlowControlFilter extends FizzWebFilter { private void something4(List resourceConfigs, String app, String ip, String service) { String r = ResourceIdUtils.buildResourceId(app, ip, null, service, null); - ResourceConfig rc = new ResourceConfig(r, 0, 0); + ResourceConfig rc = new ResourceConfig(r, -1L, -1L); resourceConfigs.add(rc); }