支持域名访问

This commit is contained in:
ztzh_xieyun 2024-05-16 11:00:41 +08:00
parent 90efb2bf18
commit fbec1d3137
5 changed files with 40 additions and 5 deletions

View File

@ -36,6 +36,7 @@ public class SacErrorCode {
_ERROR.put(10019, "请求不支持conetnt-type类型"); _ERROR.put(10019, "请求不支持conetnt-type类型");
_ERROR.put(10020, "uri返回mock数据"); _ERROR.put(10020, "uri返回mock数据");
_ERROR.put(10021, "无法找到负载均衡路由节点"); _ERROR.put(10021, "无法找到负载均衡路由节点");
_ERROR.put(10022, "uri模糊匹配,不能使用加解密、熔断策略.");
}; };
public static JsonObject returnErrorMsg(Integer errorCode) { public static JsonObject returnErrorMsg(Integer errorCode) {

View File

@ -82,6 +82,7 @@ public class AppConfigHandler {
private static ConcurrentHashMap<String, SacCurrentLimiting> APICODE_CONFIG_CURRENT_LIMITING_MAP = new ConcurrentHashMap<>(); private static ConcurrentHashMap<String, SacCurrentLimiting> APICODE_CONFIG_CURRENT_LIMITING_MAP = new ConcurrentHashMap<>();
// 服务类型, apiCode限流配置 appCode:apiCode - 服务类型SAC=SAC规范服务OPEN=开放服务 // 服务类型, apiCode限流配置 appCode:apiCode - 服务类型SAC=SAC规范服务OPEN=开放服务
private static ConcurrentHashMap<String, String> APICODE_CONFIG_SERVICE_TYPE_MAP = new ConcurrentHashMap<>(); private static ConcurrentHashMap<String, String> APICODE_CONFIG_SERVICE_TYPE_MAP = new ConcurrentHashMap<>();
// 负载均衡路由类型 appCode:apiCode - routerType // 负载均衡路由类型 appCode:apiCode - routerType
// 执行流程 routerType= <br/> // 执行流程 routerType= <br/>
// 1serviceNodel="NORMAL", serviceNodel="ROUTE" and RouteType = "WEIGHT_ROUTE" // 1serviceNodel="NORMAL", serviceNodel="ROUTE" and RouteType = "WEIGHT_ROUTE"
@ -95,9 +96,16 @@ public class AppConfigHandler {
// apiCode熔断配置 appCode:apiCode - CircuitBreaker // apiCode熔断配置 appCode:apiCode - CircuitBreaker
private static ConcurrentHashMap<String, CircuitBreaker> APICODE_CONFIG_CIRCUIT_BREAKER_MAP = new ConcurrentHashMap<>(); private static ConcurrentHashMap<String, CircuitBreaker> APICODE_CONFIG_CIRCUIT_BREAKER_MAP = new ConcurrentHashMap<>();
// apicode uri = * - appConfig
private static ConcurrentHashMap<String, AppConfig> APICODE_APPCONFIG_MAP = new ConcurrentHashMap<>();
// 禁用appCode // 禁用appCode
private static ConcurrentHashSet<String> DISABLED_APPCODE = new ConcurrentHashSet<String>(); private static ConcurrentHashSet<String> DISABLED_APPCODE = new ConcurrentHashSet<String>();
public static AppConfig getAppConfigByDomain(String domain) {
return APICODE_APPCONFIG_MAP.get(domain);
}
public static Integer routerType(String key) { public static Integer routerType(String key) {
return APICODE_CONFIG_ROUTERTYPE_MAP.get(key) != null ? APICODE_CONFIG_ROUTERTYPE_MAP.get(key) : 1; return APICODE_CONFIG_ROUTERTYPE_MAP.get(key) != null ? APICODE_CONFIG_ROUTERTYPE_MAP.get(key) : 1;
} }
@ -168,6 +176,11 @@ public class AppConfigHandler {
String keyCircuitBreaker = appCode + ":" + apiCode + ":" + "CIRCUIT_BREAKER"; String keyCircuitBreaker = appCode + ":" + apiCode + ":" + "CIRCUIT_BREAKER";
CircuitBreaker circuitBreaker = AppConfigHandler.getApiCodeCircuitBreaker(keyCircuitBreaker); CircuitBreaker circuitBreaker = AppConfigHandler.getApiCodeCircuitBreaker(keyCircuitBreaker);
boolean isDataSecurity = AppConfigHandler.isDataSecurity(appCode); boolean isDataSecurity = AppConfigHandler.isDataSecurity(appCode);
// 模糊匹配不解析body
String uri = AppConfigHandler.getApicodeConfig(appCode + ":" + apiCode).getUri();
if (StringUtils.equals(uri, "*")) {
return false;
}
// 文件上传不走加解密 // 文件上传不走加解密
return (isDataSecurity || circuitBreaker != null) && StringUtils.startsWith(contentType, "multipart") == false; return (isDataSecurity || circuitBreaker != null) && StringUtils.startsWith(contentType, "multipart") == false;
} }
@ -224,7 +237,7 @@ public class AppConfigHandler {
} }
public static String mock(String key) { public static String mock(String key) {
return APICODE_CONFIG_MAP.get(key).getMockResponse(); return APICODE_CONFIG_MAP.get(key) != null ? APICODE_CONFIG_MAP.get(key).getMockResponse() : null;
} }
private static RateLimiterRegistry createRateLimiter(Strategy strategy) { private static RateLimiterRegistry createRateLimiter(Strategy strategy) {
@ -357,6 +370,11 @@ public class AppConfigHandler {
APICODE_CONFIG_MAP.put(key, apiConfig); APICODE_CONFIG_MAP.put(key, apiConfig);
APICODE_CONFIG_SERVICE_TYPE_MAP.put(key, sacService.getServiceType()); APICODE_CONFIG_SERVICE_TYPE_MAP.put(key, sacService.getServiceType());
// OPEN模式, 域名映射
if(isServiceTypeOpen(key) && StringUtils.equals(apiConfig.getUri(), "*")) {
APICODE_APPCONFIG_MAP.put(apiConfig.getApiCode(), appConfig);
}
// 负载均衡模式 // 负载均衡模式
APICODE_CONFIG_ROUTERTYPE_MAP.put(key, routerType); APICODE_CONFIG_ROUTERTYPE_MAP.put(key, routerType);
switch (routerType) { switch (routerType) {

View File

@ -5,6 +5,8 @@ import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import org.apache.commons.lang3.StringUtils;
import com.sf.vertx.constans.SacErrorCode; import com.sf.vertx.constans.SacErrorCode;
/* /*
@ -83,7 +85,6 @@ public class BodyHandlerImpl implements BodyHandler {
String contentType = context.request().headers().get(HttpHeaders.CONTENT_TYPE); String contentType = context.request().headers().get(HttpHeaders.CONTENT_TYPE);
boolean isLoadBody = false; boolean isLoadBody = false;
try { try {
// TODO 测试异常
isLoadBody = AppConfigHandler.isAnalysisBody(appCode, apiCode, contentType); isLoadBody = AppConfigHandler.isAnalysisBody(appCode, apiCode, contentType);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();

View File

@ -2,24 +2,38 @@ package com.sf.vertx.handle;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import com.sf.vertx.api.pojo.AppConfig;
import com.sf.vertx.constans.SacErrorCode; import com.sf.vertx.constans.SacErrorCode;
import io.vertx.ext.web.RoutingContext; import io.vertx.ext.web.RoutingContext;
import io.vertx.ext.web.handler.HttpException; import io.vertx.ext.web.handler.HttpException;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class ParameterCheckHandlerImpl implements ParameterCheckHandler { public class ParameterCheckHandlerImpl implements ParameterCheckHandler {
@Override @Override
public void handle(RoutingContext rc) { public void handle(RoutingContext rc) {
try { try {
log.info("rc.request().host():{}", rc.request().host());
String appCode = rc.request().headers().get(AppConfigHandler.getAppCodeHeaderKey()); String appCode = rc.request().headers().get(AppConfigHandler.getAppCodeHeaderKey());
String apiCode = rc.request().headers().get(AppConfigHandler.getApiCodeHeaderKey()); String apiCode = rc.request().headers().get(AppConfigHandler.getApiCodeHeaderKey());
String key = appCode + ":" + apiCode; String key = appCode + ":" + apiCode;
if (StringUtils.isBlank(appCode) || StringUtils.isBlank(apiCode) if (StringUtils.isBlank(appCode) || StringUtils.isBlank(apiCode)
|| AppConfigHandler.getAppConfig(appCode) == null || AppConfigHandler.getAppConfig(appCode) == null
|| AppConfigHandler.getApicodeConfig(key) == null) { || AppConfigHandler.getApicodeConfig(key) == null) {
rc.fail(new HttpException(10012)); // 判断OPEN模式, header不传递参数, 走域名映射
return; AppConfig appConfig = AppConfigHandler.getAppConfigByDomain(rc.request().host());
if(appConfig != null) {
appCode = appConfig.getAppCode();
apiCode = rc.request().host();
rc.request().headers().add(AppConfigHandler.getAppCodeHeaderKey(), appCode);
rc.request().headers().add(AppConfigHandler.getApiCodeHeaderKey(), apiCode);
key = appCode + ":" + apiCode;
} else {
rc.fail(new HttpException(10012));
return;
}
} }
if(AppConfigHandler.isDisabledAppcode(apiCode)) { if(AppConfigHandler.isDisabledAppcode(apiCode)) {

View File

@ -20,6 +20,7 @@ public class RestfulFailureHandlerImpl implements RestfulFailureHandler {
Integer sc = SacErrorCode.DEFAULT_ERROR_CODE; Integer sc = SacErrorCode.DEFAULT_ERROR_CODE;
try { try {
Throwable failure = frc.failure(); Throwable failure = frc.failure();
log.info("failure:{}", failure);
if (failure instanceof HttpException) { if (failure instanceof HttpException) {
HttpException httpException = (HttpException) failure; HttpException httpException = (HttpException) failure;
sc = httpException.getStatusCode(); sc = httpException.getStatusCode();