diff --git a/fizz-common/src/main/java/we/util/ThreadContext.java b/fizz-common/src/main/java/we/util/ThreadContext.java index d237aad..def8156 100644 --- a/fizz-common/src/main/java/we/util/ThreadContext.java +++ b/fizz-common/src/main/java/we/util/ThreadContext.java @@ -20,6 +20,7 @@ package we.util; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; /** @@ -30,11 +31,17 @@ public abstract class ThreadContext { private static ThreadLocal> tl = new ThreadLocal<>(); - private static final int mapCap = 32; + private static final int mapCap = 32; - private static final String sb = "$sb"; + private static final String sb = "$sb"; - private static final int sbCap = 256; + private static final int sbCap = 256; + + private static final String arrayListT = "arlstT"; + + private static final String hashMapT = "hsMapT"; + + private static final String hashSetT = "hsSetT"; private ThreadContext() { } @@ -116,6 +123,10 @@ public abstract class ThreadContext { return getMap().remove(key); } + public static ArrayList getArrayList() { + return getArrayList(arrayListT, true); + } + public static ArrayList getArrayList(String key) { return getArrayList(key, true); } @@ -131,6 +142,10 @@ public abstract class ThreadContext { return l; } + public static HashMap getHashMap() { + return getHashMap(hashMapT, true); + } + public static HashMap getHashMap(String key) { return getHashMap(key, true); } @@ -145,4 +160,23 @@ public abstract class ThreadContext { } return m; } + + public static HashSet getHashSet() { + return getHashSet(hashSetT, true); + } + + public static HashSet getHashSet(String key) { + return getHashSet(key, true); + } + + public static HashSet getHashSet(String key, boolean clear) { + HashSet s = (HashSet) get(key); + if (s == null) { + s = new HashSet(); + set(key ,s); + } else if (clear) { + s.clear(); + } + return s; + } } diff --git a/fizz-core/src/main/java/we/filter/PreprocessFilter.java b/fizz-core/src/main/java/we/filter/PreprocessFilter.java index 2faa9c8..93cb324 100644 --- a/fizz-core/src/main/java/we/filter/PreprocessFilter.java +++ b/fizz-core/src/main/java/we/filter/PreprocessFilter.java @@ -28,18 +28,19 @@ import org.springframework.web.server.WebFilterChain; import reactor.core.publisher.Mono; import we.plugin.FixedPluginFilter; import we.plugin.FizzPluginFilterChain; +import we.plugin.PluginConfig; import we.plugin.auth.ApiConfig; import we.plugin.auth.AuthPluginFilter; +import we.plugin.auth.GatewayGroupService; import we.plugin.stat.StatPluginFilter; import we.proxy.Route; import we.util.ReactorUtils; import we.util.Result; +import we.util.ThreadContext; import we.util.WebUtils; import javax.annotation.Resource; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.Function; /** @@ -57,10 +58,13 @@ public class PreprocessFilter extends FizzWebFilter { private static final FilterResult succFr = FilterResult.SUCCESS(PREPROCESS_FILTER); @Resource(name = StatPluginFilter.STAT_PLUGIN_FILTER) - private StatPluginFilter statPluginFilter; + private StatPluginFilter statPluginFilter; @Resource(name = AuthPluginFilter.AUTH_PLUGIN_FILTER) - private AuthPluginFilter authPluginFilter; + private AuthPluginFilter authPluginFilter; + + @Resource + private GatewayGroupService gatewayGroupService; @Override public Mono doFilter(ServerWebExchange exchange, WebFilterChain chain) { @@ -78,16 +82,18 @@ public class PreprocessFilter extends FizzWebFilter { .thenReturn(ReactorUtils.Void) .flatMap( v -> { - Result authRes = (Result) WebUtils.getFilterResultDataItem(exchange, AuthPluginFilter.AUTH_PLUGIN_FILTER, AuthPluginFilter.RESULT); - if (authRes.code == Result.FAIL) { - return WebUtils.responseError(exchange, HttpStatus.FORBIDDEN.value(), authRes.msg); + Result auth = (Result) WebUtils.getFilterResultDataItem(exchange, AuthPluginFilter.AUTH_PLUGIN_FILTER, AuthPluginFilter.RESULT); + if (auth.code == Result.FAIL) { + return WebUtils.responseError(exchange, HttpStatus.FORBIDDEN.value(), auth.msg); } - ApiConfig ac = authRes.data; + ApiConfig ac = auth.data; if (ac == null) { afterAuth(exchange, null, null); return executeFixedPluginFilters(exchange).thenReturn(ReactorUtils.Void).flatMap(checkDirectRespOrChainFilter(exchange, chain)); } - Route route = ac.getRoute(exchange); + + List gatewayGroupPluginConfigs = gatewayGroupService.get(ac.firstGatewayGroup).pluginConfigs; + Route route = ac.getRoute(exchange, gatewayGroupPluginConfigs); eas.put(WebUtils.ROUTE, route); afterAuth(exchange, ac, route); @@ -95,7 +101,7 @@ public class PreprocessFilter extends FizzWebFilter { executeFixedPluginFilters(exchange).thenReturn(ReactorUtils.Void) .flatMap( e -> { - if (CollectionUtils.isEmpty(route.pluginConfigs)) { + if (route.pluginConfigs.isEmpty()) { return checkDirectRespOrChainFilter(exchange, chain).apply(ReactorUtils.NULL); } else { eas.put(FizzPluginFilterChain.WEB_FILTER_CHAIN, chain); @@ -107,6 +113,7 @@ public class PreprocessFilter extends FizzWebFilter { ); } + // ? private void afterAuth(ServerWebExchange exchange, ApiConfig ac, Route route) { String bs = null, bp = null; if (ac == null) { diff --git a/fizz-core/src/main/java/we/plugin/PluginConfig.java b/fizz-core/src/main/java/we/plugin/PluginConfig.java index 7340733..334c0aa 100644 --- a/fizz-core/src/main/java/we/plugin/PluginConfig.java +++ b/fizz-core/src/main/java/we/plugin/PluginConfig.java @@ -28,17 +28,18 @@ import java.util.Map; * @author hongqiaowei */ -public class PluginConfig { +public class PluginConfig implements Comparable { public static final String CUSTOM_CONFIG = "fcK"; - public String plugin; // tb_plugin.eng_name + public String plugin; // tb_plugin.eng_name - public String fixedConfig; + public String fixedConfig; - public Map config = Collections.emptyMap(); + public Map config = Collections.emptyMap(); + + public int order; - // @JsonProperty(value = "config", access = JsonProperty.Access.WRITE_ONLY) public void setConfig(String confJson) { if (StringUtils.isNotBlank(confJson)) { Map m = JacksonUtils.readValue(confJson, Map.class); @@ -63,4 +64,9 @@ public class PluginConfig { public String toString() { return JacksonUtils.writeValueAsString(this); } + + @Override + public int compareTo(PluginConfig that) { + return this.order - that.order; + } } diff --git a/fizz-core/src/main/java/we/plugin/auth/AbstractCustomAuth.java b/fizz-core/src/main/java/we/plugin/auth/AbstractCustomAuth.java index 8b15d15..ca1b21e 100644 --- a/fizz-core/src/main/java/we/plugin/auth/AbstractCustomAuth.java +++ b/fizz-core/src/main/java/we/plugin/auth/AbstractCustomAuth.java @@ -31,6 +31,7 @@ public abstract class AbstractCustomAuth implements CustomAuth { /** * @deprecated */ + @Deprecated @Override public Mono auth(ServerWebExchange exchange, String appId, String ip, String timestamp, String sign, App fizzAppConfig) { throw Utils.runtimeExceptionWithoutStack("don't implement me!"); diff --git a/fizz-core/src/main/java/we/plugin/auth/ApiConfig.java b/fizz-core/src/main/java/we/plugin/auth/ApiConfig.java index a9ab21f..d5c1eba 100644 --- a/fizz-core/src/main/java/we/plugin/auth/ApiConfig.java +++ b/fizz-core/src/main/java/we/plugin/auth/ApiConfig.java @@ -29,9 +29,8 @@ import we.util.JacksonUtils; import we.util.UrlTransformUtils; import we.util.WebUtils; -import java.util.Arrays; -import java.util.List; -import java.util.Set; +import javax.annotation.Nullable; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -72,9 +71,14 @@ public class ApiConfig { @JsonProperty( access = JsonProperty.Access.WRITE_ONLY ) - public int isDeleted = 0; // tb_api_auth.is_deleted + public int isDeleted = 0; // tb_api_auth.is_deleted - public Set gatewayGroups = Stream.of(GatewayGroup.DEFAULT).collect(Collectors.toSet()); + public Set gatewayGroups = Stream.of(GatewayGroup.DEFAULT).collect(Collectors.toCollection(LinkedHashSet::new)); + + @JsonProperty( + access = JsonProperty.Access.WRITE_ONLY + ) + public String firstGatewayGroup; public String service; @@ -85,29 +89,29 @@ public class ApiConfig { ) public HttpMethod method; - public Object fizzMethod = ALL_METHOD; + public Object fizzMethod = ALL_METHOD; - public String path = match_all; + public String path = match_all; @JsonProperty( access = JsonProperty.Access.WRITE_ONLY ) - public boolean exactMatch = false; + public boolean exactMatch = false; public String backendPath; @JsonProperty("proxyMode") - public byte type = Type.SERVICE_DISCOVERY; + public byte type = Type.SERVICE_DISCOVERY; - private int counter = 0; + private int counter = 0; public List httpHostPorts; - public char access = ALLOW; + public char access = ALLOW; - public List pluginConfigs; + public List pluginConfigs = Collections.emptyList(); - public boolean checkApp = false; + public boolean checkApp = false; public CallbackConfig callbackConfig; @@ -119,11 +123,11 @@ public class ApiConfig { public String rpcGroup; - public long timeout = 0; + public long timeout = 0; - public int retryCount = 0; + public int retryCount = 0; - public long retryInterval = 0; + public long retryInterval = 0; public static boolean isAntPathPattern(String path) { boolean uriVar = false; @@ -154,6 +158,7 @@ public class ApiConfig { } ); } + firstGatewayGroup = gatewayGroups.iterator().next(); } public void setPath(String p) { @@ -220,7 +225,7 @@ public class ApiConfig { return false; } - public Route getRoute(ServerWebExchange exchange) { + public Route getRoute(ServerWebExchange exchange, @Nullable List gatewayGroupPluginConfigs) { ServerHttpRequest request = exchange.getRequest(); Route r = new Route().type( this.type) .method( request.getMethod()) @@ -236,7 +241,16 @@ public class ApiConfig { .retryCount( this.retryCount) .retryInterval( this.retryInterval); - r.pluginConfigs = this.pluginConfigs; + if (gatewayGroupPluginConfigs == null || gatewayGroupPluginConfigs.isEmpty()) { + r.pluginConfigs = this.pluginConfigs; + } else { + List pcs = new ArrayList<>(gatewayGroupPluginConfigs.size() + this.pluginConfigs.size()); + pcs.addAll(gatewayGroupPluginConfigs); + pcs.addAll(this.pluginConfigs); + pcs.sort(null); + r.pluginConfigs = pcs; + } + if (this.type == Type.REVERSE_PROXY) { r = r.nextHttpHostPort(getNextHttpHostPort()); } diff --git a/fizz-core/src/main/java/we/plugin/auth/CustomAuth.java b/fizz-core/src/main/java/we/plugin/auth/CustomAuth.java index 5c3e16b..f4e4352 100644 --- a/fizz-core/src/main/java/we/plugin/auth/CustomAuth.java +++ b/fizz-core/src/main/java/we/plugin/auth/CustomAuth.java @@ -33,5 +33,6 @@ public interface CustomAuth { * * @deprecated */ + @Deprecated Mono auth(ServerWebExchange exchange, String appId, String ip, String timestamp, String sign, App fizzAppConfig); } diff --git a/fizz-core/src/main/java/we/plugin/auth/GatewayGroup.java b/fizz-core/src/main/java/we/plugin/auth/GatewayGroup.java index f8aa6ac..cee86ca 100644 --- a/fizz-core/src/main/java/we/plugin/auth/GatewayGroup.java +++ b/fizz-core/src/main/java/we/plugin/auth/GatewayGroup.java @@ -20,11 +20,10 @@ package we.plugin.auth; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import we.plugin.PluginConfig; import we.util.JacksonUtils; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; +import java.util.*; /** * @author hongqiaowei @@ -38,15 +37,17 @@ public class GatewayGroup { public static final int DELETED = 1; - public int id; + public int id; - public int isDeleted = 0; + public int isDeleted = 0; - public String group; + public String group; - public String name; + public String name; - public Set gateways = new HashSet<>(); + public Set gateways = new HashSet<>(); + + public List pluginConfigs = Collections.emptyList(); public void setGateways(String gateways) { if (StringUtils.isNotBlank(gateways)) { diff --git a/fizz-core/src/main/java/we/plugin/auth/GatewayGroupService.java b/fizz-core/src/main/java/we/plugin/auth/GatewayGroupService.java index 751bf7c..4ac9105 100644 --- a/fizz-core/src/main/java/we/plugin/auth/GatewayGroupService.java +++ b/fizz-core/src/main/java/we/plugin/auth/GatewayGroupService.java @@ -209,4 +209,8 @@ public class GatewayGroupService { } return false; } + + public GatewayGroup get(String gg) { + return gatewayGroupMap.get(gg); + } }