Extract resource ID constants and methods to ResourceIdUtils from ResourceRateLimitConfig

This commit is contained in:
zhongjie
2022-01-05 11:41:20 +08:00
parent 2cb79d938c
commit 394b9b06f8
8 changed files with 144 additions and 112 deletions

View File

@@ -33,6 +33,7 @@ import we.stats.ratelimit.ResourceRateLimitConfigService;
import we.util.Consts;
import we.util.DateTimeUtils;
import we.util.NetworkUtils;
import we.util.ResourceIdUtils;
import we.util.ThreadContext;
import javax.annotation.Resource;
@@ -113,22 +114,22 @@ public class FlowStatSchedConfig extends SchedConfig {
resourceTimeWindowStats.forEach(
rtws -> {
String resource = rtws.getResourceId();
String app = null, pi = null, node = ResourceRateLimitConfig.NODE, service = null, path = null;
String app = null, pi = null, node = ResourceIdUtils.NODE, service = null, path = null;
int type = ResourceRateLimitConfig.Type.NODE, id = 0;
ResourceRateLimitConfig c = resourceRateLimitConfigService.getResourceRateLimitConfig(resource);
if (c == null) { // _global, service, app, app+service, ip, ip+service
node = ResourceRateLimitConfig.getNode(resource);
if (node != null && node.equals(ResourceRateLimitConfig.NODE)) {
node = ResourceIdUtils.getNode(resource);
if (node != null && node.equals(ResourceIdUtils.NODE)) {
} else {
service = ResourceRateLimitConfig.getService(resource);
app = ResourceRateLimitConfig.getApp(resource);
pi = ResourceRateLimitConfig.getIp(resource);
service = ResourceIdUtils.getService(resource);
app = ResourceIdUtils.getApp(resource);
pi = ResourceIdUtils.getIp(resource);
if (service == null) {
if (app == null) {
type = ResourceRateLimitConfig.Type.IP;
} else {
ResourceRateLimitConfig appConfig = resourceRateLimitConfigService.getResourceRateLimitConfig(ResourceRateLimitConfig.APP_DEFAULT_RESOURCE);
ResourceRateLimitConfig appConfig = resourceRateLimitConfigService.getResourceRateLimitConfig(ResourceIdUtils.APP_DEFAULT_RESOURCE);
if (appConfig != null && appConfig.isEnable()) {
type = ResourceRateLimitConfig.Type.APP_DEFAULT;
} else {
@@ -183,7 +184,7 @@ public class FlowStatSchedConfig extends SchedConfig {
String r = null;
if (type == ResourceRateLimitConfig.Type.NODE) {
r = ResourceRateLimitConfig.NODE;
r = ResourceIdUtils.NODE;
} else if (type == ResourceRateLimitConfig.Type.SERVICE_DEFAULT || type == ResourceRateLimitConfig.Type.SERVICE) {
r = service;
}

View File

@@ -35,6 +35,7 @@ import we.stats.ratelimit.ResourceRateLimitConfig;
import we.util.Consts;
import we.util.DateTimeUtils;
import we.util.JacksonUtils;
import we.util.ResourceIdUtils;
import java.math.BigDecimal;
import java.util.HashMap;
@@ -72,11 +73,11 @@ public class FlowControlController {
long currentTimeSlot = flowStat.currentTimeSlotId();
long startTimeSlot = currentTimeSlot - recent * 1000;
TimeWindowStat timeWindowStat = null;
List<ResourceTimeWindowStat> wins = flowStat.getResourceTimeWindowStats(ResourceRateLimitConfig.NODE_RESOURCE, startTimeSlot, currentTimeSlot, recent);
List<ResourceTimeWindowStat> wins = flowStat.getResourceTimeWindowStats(ResourceIdUtils.NODE_RESOURCE, startTimeSlot, currentTimeSlot, recent);
if (wins == null || wins.isEmpty()) {
result.put("rps", 0);
} else {
concurrents = flowStat.getConcurrentRequests(ResourceRateLimitConfig.NODE_RESOURCE);
concurrents = flowStat.getConcurrentRequests(ResourceIdUtils.NODE_RESOURCE);
result.put("concurrents", concurrents);
timeWindowStat = wins.get(0).getWindows().get(0);
BigDecimal winrps = timeWindowStat.getRps();

View File

@@ -135,7 +135,7 @@ public class FlowControlFilter extends FizzWebFilter {
log.info("{} exceed {} flow limit, blocked by maximum QPS", traceId, blockedResourceId, LogService.BIZ_ID, traceId);
}
ResourceRateLimitConfig c = resourceRateLimitConfigService.getResourceRateLimitConfig(ResourceRateLimitConfig.NODE_RESOURCE);
ResourceRateLimitConfig c = resourceRateLimitConfigService.getResourceRateLimitConfig(ResourceIdUtils.NODE_RESOURCE);
String rt = c.responseType, rc = c.responseContent;
c = resourceRateLimitConfigService.getResourceRateLimitConfig(blockedResourceId);
if (c != null) {
@@ -192,15 +192,15 @@ public class FlowControlFilter extends FizzWebFilter {
private List<ResourceConfig> getResourceConfigItselfAndParents(ResourceConfig rc, List<ResourceConfig> rcs) {
boolean check = false;
String rcId = rc.getResourceId();
String rcApp = ResourceRateLimitConfig.getApp(rcId);
String rcIp = ResourceRateLimitConfig.getIp(rcId);
String rcApp = ResourceIdUtils.getApp(rcId);
String rcIp = ResourceIdUtils.getIp(rcId);
List<ResourceConfig> result = new ArrayList<>();
for (int i = rcs.size() - 1; i > -1; i--) {
ResourceConfig r = rcs.get(i);
String id = r.getResourceId();
String app = ResourceRateLimitConfig.getApp(id);
String ip = ResourceRateLimitConfig.getIp(id);
String path = ResourceRateLimitConfig.getPath(id);
String app = ResourceIdUtils.getApp(id);
String ip = ResourceIdUtils.getIp(id);
String path = ResourceIdUtils.getPath(id);
if (check) {
if (rcIp != null) {
if (ip != null) {
@@ -239,12 +239,12 @@ public class FlowControlFilter extends FizzWebFilter {
List<ResourceConfig> resourceConfigs = new ArrayList<>(9);
StringBuilder b = ThreadContext.getStringBuilder();
checkRateLimitConfigAndAddTo(resourceConfigs, b, null, null, ResourceRateLimitConfig.NODE, null, null, null);
checkRateLimitConfigAndAddTo(resourceConfigs, b, null, null, null, service, null, ResourceRateLimitConfig.SERVICE_DEFAULT);
checkRateLimitConfigAndAddTo(resourceConfigs, b, null, null, ResourceIdUtils.NODE, null, null, null);
checkRateLimitConfigAndAddTo(resourceConfigs, b, null, null, null, service, null, ResourceIdUtils.SERVICE_DEFAULT);
checkRateLimitConfigAndAddTo(resourceConfigs, b, null, null, null, service, path, null);
if (app != null) {
checkRateLimitConfigAndAddTo(resourceConfigs, b, app, null, null, null, null, ResourceRateLimitConfig.APP_DEFAULT);
checkRateLimitConfigAndAddTo(resourceConfigs, b, app, null, null, null, null, ResourceIdUtils.APP_DEFAULT);
checkRateLimitConfigAndAddTo(resourceConfigs, b, app, null, null, service, null, null);
checkRateLimitConfigAndAddTo(resourceConfigs, b, app, null, null, service, path, null);
}
@@ -262,7 +262,7 @@ public class FlowControlFilter extends FizzWebFilter {
}
private void checkRateLimitConfigAndAddTo(List<ResourceConfig> resourceConfigs, StringBuilder b, String app, String ip, String node, String service, String path, String defaultRateLimitConfigId) {
ResourceRateLimitConfig.buildResourceIdTo(b, app, ip, node, service, path);
ResourceIdUtils.buildResourceIdTo(b, app, ip, node, service, path);
String resourceId = b.toString();
checkRateLimitConfigAndAddTo(resourceConfigs, resourceId, defaultRateLimitConfigId);
b.delete(0, b.length());
@@ -276,21 +276,21 @@ public class FlowControlFilter extends FizzWebFilter {
rc = new ResourceConfig(resource, rateLimitConfig.concurrents, rateLimitConfig.qps);
resourceConfigs.add(rc);
} else {
String node = ResourceRateLimitConfig.getNode(resource);
if (node != null && node.equals(ResourceRateLimitConfig.NODE)) {
String node = ResourceIdUtils.getNode(resource);
if (node != null && node.equals(ResourceIdUtils.NODE)) {
rc = new ResourceConfig(resource, 0, 0);
}
if (defaultRateLimitConfigId != null) {
if (defaultRateLimitConfigId.equals(ResourceRateLimitConfig.SERVICE_DEFAULT)) {
if (defaultRateLimitConfigId.equals(ResourceIdUtils.SERVICE_DEFAULT)) {
rc = new ResourceConfig(resource, 0, 0);
rateLimitConfig = resourceRateLimitConfigService.getResourceRateLimitConfig(ResourceRateLimitConfig.SERVICE_DEFAULT_RESOURCE);
rateLimitConfig = resourceRateLimitConfigService.getResourceRateLimitConfig(ResourceIdUtils.SERVICE_DEFAULT_RESOURCE);
if (rateLimitConfig != null && rateLimitConfig.isEnable()) {
rc.setMaxCon(rateLimitConfig.concurrents);
rc.setMaxQPS(rateLimitConfig.qps);
}
}
if (defaultRateLimitConfigId.equals(ResourceRateLimitConfig.APP_DEFAULT)) {
rateLimitConfig = resourceRateLimitConfigService.getResourceRateLimitConfig(ResourceRateLimitConfig.APP_DEFAULT_RESOURCE);
if (defaultRateLimitConfigId.equals(ResourceIdUtils.APP_DEFAULT)) {
rateLimitConfig = resourceRateLimitConfigService.getResourceRateLimitConfig(ResourceIdUtils.APP_DEFAULT_RESOURCE);
if (rateLimitConfig != null && rateLimitConfig.isEnable()) {
rc = new ResourceConfig(resource, rateLimitConfig.concurrents, rateLimitConfig.qps);
}
@@ -310,7 +310,7 @@ public class FlowControlFilter extends FizzWebFilter {
prevPrev = resourceConfigs.get(sz - 2).getResourceId();
if (rateLimitConfig.type == ResourceRateLimitConfig.Type.APP) {
String app = ResourceRateLimitConfig.getApp(prev);
String app = ResourceIdUtils.getApp(prev);
if (rateLimitConfig.path == null) {
if (rateLimitConfig.service != null && app == null) {
something4(resourceConfigs, rateLimitConfig.app, null, null);
@@ -320,11 +320,11 @@ public class FlowControlFilter extends FizzWebFilter {
something4(resourceConfigs, rateLimitConfig.app, null, null);
something4(resourceConfigs, rateLimitConfig.app, null, rateLimitConfig.service);
} else {
String service = ResourceRateLimitConfig.getService(prev);
String service = ResourceIdUtils.getService(prev);
if (service == null) {
something4(resourceConfigs, rateLimitConfig.app, null, rateLimitConfig.service);
} else {
app = ResourceRateLimitConfig.getApp(prevPrev);
app = ResourceIdUtils.getApp(prevPrev);
if (app == null) {
something4(resourceConfigs, rateLimitConfig.app, null, null);
}
@@ -336,21 +336,21 @@ public class FlowControlFilter extends FizzWebFilter {
if (rateLimitConfig.service == null && rateLimitConfig.path == null) {
} else if (rateLimitConfig.path == null) {
String ip = ResourceRateLimitConfig.getIp(prev);
String ip = ResourceIdUtils.getIp(prev);
if (ip == null) {
something4(resourceConfigs, null, rateLimitConfig.ip, null);
}
} else {
String ip = ResourceRateLimitConfig.getIp(prev);
String ip = ResourceIdUtils.getIp(prev);
if (ip == null) {
something4(resourceConfigs, null, rateLimitConfig.ip, null);
something4(resourceConfigs, null, rateLimitConfig.ip, rateLimitConfig.service);
} else {
String service = ResourceRateLimitConfig.getService(prev);
String service = ResourceIdUtils.getService(prev);
if (service == null) {
something4(resourceConfigs, null, rateLimitConfig.ip, rateLimitConfig.service);
} else {
ip = ResourceRateLimitConfig.getIp(prevPrev);
ip = ResourceIdUtils.getIp(prevPrev);
if (ip == null) {
something4(resourceConfigs, null, rateLimitConfig.ip, null);
}
@@ -362,7 +362,7 @@ public class FlowControlFilter extends FizzWebFilter {
}
private void something4(List<ResourceConfig> resourceConfigs, String app, String ip, String service) {
String r = ResourceRateLimitConfig.buildResourceId(app, ip, null, service, null);
String r = ResourceIdUtils.buildResourceId(app, ip, null, service, null);
ResourceConfig rc = new ResourceConfig(r, 0, 0);
resourceConfigs.add(rc);
}

View File

@@ -19,9 +19,11 @@ package we.stats.ratelimit;
import com.fasterxml.jackson.annotation.JsonIgnore;
import org.apache.commons.lang3.StringUtils;
import we.util.Consts;
import we.util.JacksonUtils;
import we.util.Utils;
import static we.util.ResourceIdUtils.APP_DEFAULT;
import static we.util.ResourceIdUtils.NODE;
import static we.util.ResourceIdUtils.SERVICE_DEFAULT;
/**
* @author hongqiaowei
@@ -39,18 +41,6 @@ public class ResourceRateLimitConfig {
static final byte IP = 7;
}
public static final String NODE = "_global";
public static final String NODE_RESOURCE = buildResourceId(null, null, NODE, null, null);
public static final String SERVICE_DEFAULT = "service_default";
public static final String SERVICE_DEFAULT_RESOURCE = buildResourceId(null, null, null, SERVICE_DEFAULT, null);
public static final String APP_DEFAULT = "app_default";
public static final String APP_DEFAULT_RESOURCE = buildResourceId(APP_DEFAULT, null, null, null, null);
public boolean isDeleted = false;
public int id;
@@ -145,62 +135,6 @@ public class ResourceRateLimitConfig {
return resourceId;
}
public static String buildResourceId(String app, String ip, String node, String service, String path) {
StringBuilder b = new StringBuilder(32);
buildResourceIdTo(b, app, ip, node, service, path);
return b.toString();
}
public static void buildResourceIdTo(StringBuilder b, String app, String ip, String node, String service, String path) {
b.append(app == null ? Consts.S.EMPTY : app) .append(Consts.S.SQUARE);
b.append(ip == null ? Consts.S.EMPTY : ip) .append(Consts.S.SQUARE);
b.append(node == null ? Consts.S.EMPTY : node) .append(Consts.S.SQUARE);
b.append(service == null ? Consts.S.EMPTY : service) .append(Consts.S.SQUARE);
b.append(path == null ? Consts.S.EMPTY : path);
}
public static String getApp(String resource) {
int i = resource.indexOf(Consts.S.SQUARE);
if (i == 0) {
return null;
} else {
return resource.substring(0, i);
}
}
public static String getIp(String resource) {
String extract = Utils.extract(resource, Consts.S.SQUARE, 1);
if (extract.equals(Consts.S.EMPTY)) {
return null;
}
return extract;
}
public static String getNode(String resource) {
String extract = Utils.extract(resource, Consts.S.SQUARE, 2);
if (extract.equals(Consts.S.EMPTY)) {
return null;
}
return extract;
}
public static String getService(String resource) {
String extract = Utils.extract(resource, Consts.S.SQUARE, 3);
if (extract.equals(Consts.S.EMPTY)) {
return null;
}
return extract;
}
public static String getPath(String resource) {
int i = resource.lastIndexOf(Consts.S.SQUARE);
if (i == resource.length() - 1) {
return null;
} else {
return resource.substring(i);
}
}
@Override
public String toString() {
return JacksonUtils.writeValueAsString(this);

View File

@@ -0,0 +1,94 @@
/*
* Copyright (C) 2021 the original author or authors.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package we.util;
/**
* Resource ID utility
* Extracted from {@link we.stats.ratelimit.ResourceRateLimitConfig}
*
* @author zhongjie
*/
public class ResourceIdUtils {
public static final String NODE = "_global";
public static final String NODE_RESOURCE = buildResourceId(null, null, NODE, null, null);
public static final String SERVICE_DEFAULT = "service_default";
public static final String SERVICE_DEFAULT_RESOURCE = buildResourceId(null, null, null, SERVICE_DEFAULT, null);
public static final String APP_DEFAULT = "app_default";
public static final String APP_DEFAULT_RESOURCE = buildResourceId(APP_DEFAULT, null, null, null, null);
public static String buildResourceId(String app, String ip, String node, String service, String path) {
StringBuilder b = new StringBuilder(32);
buildResourceIdTo(b, app, ip, node, service, path);
return b.toString();
}
public static void buildResourceIdTo(StringBuilder b, String app, String ip, String node, String service, String path) {
b.append(app == null ? Consts.S.EMPTY : app) .append(Consts.S.SQUARE);
b.append(ip == null ? Consts.S.EMPTY : ip) .append(Consts.S.SQUARE);
b.append(node == null ? Consts.S.EMPTY : node) .append(Consts.S.SQUARE);
b.append(service == null ? Consts.S.EMPTY : service) .append(Consts.S.SQUARE);
b.append(path == null ? Consts.S.EMPTY : path);
}
public static String getApp(String resource) {
int i = resource.indexOf(Consts.S.SQUARE);
if (i == 0) {
return null;
} else {
return resource.substring(0, i);
}
}
public static String getIp(String resource) {
String extract = Utils.extract(resource, Consts.S.SQUARE, 1);
if (extract.equals(Consts.S.EMPTY)) {
return null;
}
return extract;
}
public static String getNode(String resource) {
String extract = Utils.extract(resource, Consts.S.SQUARE, 2);
if (extract.equals(Consts.S.EMPTY)) {
return null;
}
return extract;
}
public static String getService(String resource) {
String extract = Utils.extract(resource, Consts.S.SQUARE, 3);
if (extract.equals(Consts.S.EMPTY)) {
return null;
}
return extract;
}
public static String getPath(String resource) {
int i = resource.lastIndexOf(Consts.S.SQUARE);
if (i == resource.length() - 1) {
return null;
} else {
return resource.substring(i);
}
}
}

View File

@@ -17,6 +17,7 @@ import we.stats.ratelimit.ResourceRateLimitConfig;
import we.stats.ratelimit.ResourceRateLimitConfigService;
import we.util.JacksonUtils;
import we.util.ReflectionUtils;
import we.util.ResourceIdUtils;
import java.util.HashMap;
import java.util.List;
@@ -64,7 +65,7 @@ public class FlowControlFilterTests {
Map<String, ResourceRateLimitConfig> map = resourceRateLimitConfigService.getResourceRateLimitConfigMap();
ResourceRateLimitConfig config = JacksonUtils.readValue("{\"concurrents\":66,\"enable\":1,\"id\":1,\"isDeleted\":0,\"resource\":\"_global\",\"type\":1}", ResourceRateLimitConfig.class);
map.put(ResourceRateLimitConfig.NODE_RESOURCE, config);
map.put(ResourceIdUtils.NODE_RESOURCE, config);
config = JacksonUtils.readValue("{\"concurrents\":33,\"enable\":1,\"id\":2,\"isDeleted\":0, \"service\":\"xservice\", \"path\":\"/ypath\", \"type\":4}", ResourceRateLimitConfig.class);
map.put(config.getResourceId(), config);
@@ -92,12 +93,12 @@ public class FlowControlFilterTests {
// System.err.println(JacksonUtils.writeValueAsString(flowStat.resourceStats));
String xservice = ResourceRateLimitConfig.buildResourceId(null, null, null, "xservice", null);
String xservice = ResourceIdUtils.buildResourceId(null, null, null, "xservice", null);
List<ResourceTimeWindowStat> resourceTimeWindowStats = flowStat.getResourceTimeWindowStats(xservice, startTimeSlot, currentTimeSlot, 10);
TimeWindowStat win = resourceTimeWindowStats.get(0).getWindows().get(0);
assertEquals(win.getCompReqs(), 1);
String xserviceYpath = ResourceRateLimitConfig.buildResourceId(null, null, null, "xservice", "/ypath");
String xserviceYpath = ResourceIdUtils.buildResourceId(null, null, null, "xservice", "/ypath");
resourceTimeWindowStats = flowStat.getResourceTimeWindowStats(xserviceYpath, startTimeSlot, currentTimeSlot, 10);
win = resourceTimeWindowStats.get(0).getWindows().get(0);
assertEquals(win.getCompReqs(), 1);

View File

@@ -9,7 +9,7 @@ import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import we.redis.RedisProperties;
import we.redis.RedisServerConfiguration;
import we.redis.RedisTemplateConfiguration;
import we.util.JacksonUtils;
import we.util.ResourceIdUtils;
import javax.annotation.Resource;
@@ -51,7 +51,7 @@ public class ResourceRateLimitConfigServiceTests {
stringRedisTemplate.opsForHash().put("fizz_rate_limit", "2", "{\"concurrents\":66,\"enable\":1,\"id\":2,\"isDeleted\":0,\"resource\":\"service_default\",\"type\":2}");
stringRedisTemplate.opsForHash().put("fizz_rate_limit", "3", "{\"concurrents\":88,\"enable\":1,\"id\":3,\"isDeleted\":0, \"type\":6, \"app\":\"xapp\", \"service\":\"yservice\" }");
resourceRateLimitConfigService.init();
ResourceRateLimitConfig resourceRateLimitConfig = resourceRateLimitConfigService.getResourceRateLimitConfig(ResourceRateLimitConfig.SERVICE_DEFAULT_RESOURCE);
ResourceRateLimitConfig resourceRateLimitConfig = resourceRateLimitConfigService.getResourceRateLimitConfig(ResourceIdUtils.SERVICE_DEFAULT_RESOURCE);
// Map<String, ResourceRateLimitConfig> resourceRateLimitConfigMap = resourceRateLimitConfigService.getResourceRateLimitConfigMap();
// System.err.println(JacksonUtils.writeValueAsString(resourceRateLimitConfigMap));
assertEquals(resourceRateLimitConfig.concurrents, 66);

View File

@@ -2,6 +2,7 @@ package we.stats.ratelimit;
import org.junit.jupiter.api.Test;
import we.util.JacksonUtils;
import we.util.ResourceIdUtils;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -25,7 +26,7 @@ public class ResourceRateLimitConfigTests {
String resourceId = c.getResourceId();
assertEquals("^^_global^^", resourceId);
String node = ResourceRateLimitConfig.getNode(resourceId);
String node = ResourceIdUtils.getNode(resourceId);
assertEquals("_global", node);
resourceRateLimitConfigJson = "{\"concurrents\":1000,\"enable\":1,\"id\":1,\"isDeleted\":0,\"qps\":500, \"type\":2, \"resource\":\"service_default\" }";
@@ -38,10 +39,10 @@ public class ResourceRateLimitConfigTests {
resourceId = c.getResourceId();
assertEquals("^^^xservice^", resourceId);
resourceId = ResourceRateLimitConfig.buildResourceId(null, null, ResourceRateLimitConfig.NODE, null, null);
resourceId = ResourceIdUtils.buildResourceId(null, null, ResourceIdUtils.NODE, null, null);
assertEquals("^^_global^^", resourceId);
resourceId = ResourceRateLimitConfig.buildResourceId(null, "192.168.1.1", null, "xservice", null);
resourceId = ResourceIdUtils.buildResourceId(null, "192.168.1.1", null, "xservice", null);
assertEquals("^192.168.1.1^^xservice^", resourceId);
}
}