Merge pull request #435 from wehotel/develop
This commit is contained in:
@@ -12,7 +12,7 @@
|
||||
|
||||
<groupId>com.fizzgate</groupId>
|
||||
<artifactId>fizz-bootstrap</artifactId>
|
||||
<version>2.6.4</version>
|
||||
<version>2.6.5-beta1</version>
|
||||
|
||||
<properties>
|
||||
<java.version>1.8</java.version>
|
||||
|
||||
@@ -116,19 +116,21 @@ fizz:
|
||||
code-field: "msgCode"
|
||||
message-field: "message"
|
||||
|
||||
dedicated-line:
|
||||
server:
|
||||
enable: true
|
||||
client:
|
||||
enable: true
|
||||
port: 8601
|
||||
request:
|
||||
timeliness: 300 # default 300 sec
|
||||
timeout: 0 # default no timeout
|
||||
retry-count: 0 # default no retry
|
||||
retry-interval: 0 # default no retry interval
|
||||
crypto: true # if true, client will encrypt request body and decrypt response body
|
||||
service-registration:
|
||||
fast-fail-when-registry-center-down: false
|
||||
|
||||
# dedicated-line:
|
||||
# server:
|
||||
# enable: true
|
||||
# client:
|
||||
# enable: true
|
||||
# port: 8601
|
||||
# request:
|
||||
# timeliness: 300 # default 300 sec
|
||||
# timeout: 0 # default no timeout
|
||||
# retry-count: 0 # default no retry
|
||||
# retry-interval: 0 # default no retry interval
|
||||
# crypto: true # if true, client will encrypt request body and decrypt response body
|
||||
# service-registration:
|
||||
# eureka:
|
||||
# server-port: 8601
|
||||
# client:
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>fizz-gateway-community</artifactId>
|
||||
<groupId>com.fizzgate</groupId>
|
||||
<version>2.6.4</version>
|
||||
<version>2.6.5-beta1</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
@@ -63,7 +63,24 @@ public abstract class PropertiesUtils {
|
||||
|
||||
public static void setBeanPropertyValue(Object bean, Properties properties, Map<String, Class<?>> propertyTypeHint) {
|
||||
BeanWrapperImpl beanWrapper = new BeanWrapperImpl(bean);
|
||||
for (String propertyName : properties.stringPropertyNames()) {
|
||||
/*for (String propertyName : properties.stringPropertyNames()) {
|
||||
if (beanWrapper.isWritableProperty(propertyName)) {
|
||||
beanWrapper.setPropertyValue(propertyName, properties.get(propertyName));
|
||||
} else if (propertyTypeHint != null) {
|
||||
int dotPos = propertyName.lastIndexOf(Consts.S.DOT);
|
||||
if (dotPos > -1) {
|
||||
String prefix = propertyName.substring(0, dotPos);
|
||||
Class<?> aClass = propertyTypeHint.get(prefix);
|
||||
if (aClass != null && Map.class.isAssignableFrom(aClass)) {
|
||||
String newPropertyName = prefix + PropertyAccessor.PROPERTY_KEY_PREFIX_CHAR + propertyName.substring(dotPos + 1) + PropertyAccessor.PROPERTY_KEY_SUFFIX_CHAR;
|
||||
beanWrapper.setPropertyValue(newPropertyName, properties.get(propertyName));
|
||||
}
|
||||
}
|
||||
}
|
||||
}*/
|
||||
properties.forEach(
|
||||
(n, v) -> {
|
||||
String propertyName = (String) n;
|
||||
if (beanWrapper.isWritableProperty(propertyName)) {
|
||||
beanWrapper.setPropertyValue(propertyName, properties.get(propertyName));
|
||||
} else if (propertyTypeHint != null) {
|
||||
@@ -78,5 +95,6 @@ public abstract class PropertiesUtils {
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
package we.util;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
/**
|
||||
* @author hongqiaowei
|
||||
@@ -39,4 +40,10 @@ public abstract class ReflectionUtils extends org.springframework.util.Reflectio
|
||||
makeAccessible(f);
|
||||
return getField(f, target);
|
||||
}
|
||||
|
||||
public static Object invokeMethod(String method, Object target, Object... args) {
|
||||
Method m = findMethod(target.getClass(), method);
|
||||
makeAccessible(m);
|
||||
return invokeMethod(m, target, args);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>fizz-gateway-community</artifactId>
|
||||
<groupId>com.fizzgate</groupId>
|
||||
<version>2.6.4</version>
|
||||
<version>2.6.5-beta1</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
@@ -122,6 +122,13 @@ public class SystemConfig {
|
||||
|
||||
private String fizzDedicatedLineClientId;
|
||||
|
||||
@Value("${fizz.fast-fail-when-registry-center-down:false}")
|
||||
private boolean fastFailWhenRegistryCenterDown;
|
||||
|
||||
public boolean isFastFailWhenRegistryCenterDown() {
|
||||
return fastFailWhenRegistryCenterDown;
|
||||
}
|
||||
|
||||
public int fizzDedicatedLineClientRequestTimeout() {
|
||||
return fizzDedicatedLineClientRequestTimeout;
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
package we.controller;
|
||||
|
||||
import org.openjdk.jol.info.GraphLayout;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
@@ -74,7 +75,7 @@ public class CacheCheckController {
|
||||
@Resource
|
||||
private CircuitBreakManager circuitBreakManager;
|
||||
|
||||
@Resource
|
||||
@Autowired(required = false)
|
||||
private FlowStat flowStat;
|
||||
|
||||
@GetMapping("/gatewayGroups")
|
||||
|
||||
@@ -19,6 +19,7 @@ package we.dedicated_line;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.data.redis.core.ReactiveStringRedisTemplate;
|
||||
import org.springframework.stereotype.Service;
|
||||
@@ -50,8 +51,12 @@ public class DedicatedLineInfoService {
|
||||
@Resource(name = AggregateRedisConfig.AGGREGATE_REACTIVE_REDIS_TEMPLATE)
|
||||
private ReactiveStringRedisTemplate rt;
|
||||
|
||||
@Value("${fizz.dedicated-line.client.enable:true}")
|
||||
private boolean fizzDedicatedLineClientEnable;
|
||||
|
||||
@PostConstruct
|
||||
public void init() throws Throwable {
|
||||
if (fizzDedicatedLineClientEnable) {
|
||||
Result<?> result = initDedicatedLineInfo();
|
||||
if (result.code == Result.FAIL) {
|
||||
throw new RuntimeException(result.msg, result.t);
|
||||
@@ -61,6 +66,7 @@ public class DedicatedLineInfoService {
|
||||
throw new RuntimeException(result.msg, result.t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Result<?> initDedicatedLineInfo() {
|
||||
Result<?> result = Result.succ();
|
||||
|
||||
@@ -19,6 +19,7 @@ package we.dedicated_line;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.data.redis.core.ReactiveStringRedisTemplate;
|
||||
import org.springframework.http.HttpMethod;
|
||||
@@ -54,8 +55,12 @@ public class DedicatedLineService {
|
||||
@Resource(name = AggregateRedisConfig.AGGREGATE_REACTIVE_REDIS_TEMPLATE)
|
||||
private ReactiveStringRedisTemplate rt;
|
||||
|
||||
@Value("${fizz.dedicated-line.server.enable:true}")
|
||||
private boolean fizzDedicatedLineServerEnable;
|
||||
|
||||
@PostConstruct
|
||||
public void init() throws Throwable {
|
||||
if (fizzDedicatedLineServerEnable) {
|
||||
Result<?> result = initDedicatedLine();
|
||||
if (result.code == Result.FAIL) {
|
||||
throw new RuntimeException(result.msg, result.t);
|
||||
@@ -65,6 +70,7 @@ public class DedicatedLineService {
|
||||
throw new RuntimeException(result.msg, result.t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Result<?> initDedicatedLine() {
|
||||
Result<?> result = Result.succ();
|
||||
|
||||
@@ -21,6 +21,7 @@ import com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration;
|
||||
import lombok.SneakyThrows;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.boot.env.OriginTrackedMapPropertySource;
|
||||
@@ -30,6 +31,7 @@ import org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration;
|
||||
import org.springframework.context.ApplicationListener;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.env.ConfigurableEnvironment;
|
||||
import org.springframework.core.env.MapPropertySource;
|
||||
import org.springframework.core.env.PropertySource;
|
||||
import we.config.SystemConfig;
|
||||
import we.service_registry.FizzServiceRegistration;
|
||||
@@ -53,15 +55,22 @@ public class DedicatedLineServiceRegistration implements ApplicationListener<Ded
|
||||
|
||||
private FizzServiceRegistration fizzServiceRegistration;
|
||||
|
||||
@Value("${fizz.dedicated-line.client.enable:true}")
|
||||
private boolean fizzDedicatedLineClientEnable;
|
||||
|
||||
@SneakyThrows
|
||||
@Override
|
||||
public void onApplicationEvent(DedicatedLineWebServerInitializedEvent event) {
|
||||
|
||||
if (!fizzDedicatedLineClientEnable) {
|
||||
return;
|
||||
}
|
||||
|
||||
ReactiveWebServerApplicationContext applicationContext = event.getApplicationContext();
|
||||
ConfigurableEnvironment env = applicationContext.getEnvironment();
|
||||
|
||||
String prefix = SystemConfig.FIZZ_DEDICATED_LINE_CLIENT_PREFIX + ".service-registration";
|
||||
boolean eureka = env.containsProperty((prefix + ".eureka.instance.appname"));
|
||||
boolean eureka = env.containsProperty((prefix + ".eureka.client.serviceUrl.defaultZone"));
|
||||
boolean nacos = env.containsProperty((prefix + ".nacos.discovery.server-addr"));
|
||||
|
||||
if (eureka || nacos) {
|
||||
@@ -69,8 +78,9 @@ public class DedicatedLineServiceRegistration implements ApplicationListener<Ded
|
||||
Properties eurekaProperties = new Properties();
|
||||
boolean find = false;
|
||||
for (PropertySource<?> propertySource : env.getPropertySources()) {
|
||||
if (propertySource instanceof OriginTrackedMapPropertySource) {
|
||||
OriginTrackedMapPropertySource originTrackedMapPropertySource = (OriginTrackedMapPropertySource) propertySource;
|
||||
// if (propertySource instanceof OriginTrackedMapPropertySource) {
|
||||
if (MapPropertySource.class.isAssignableFrom(propertySource.getClass())) {
|
||||
MapPropertySource originTrackedMapPropertySource = (MapPropertySource) propertySource;
|
||||
String[] propertyNames = originTrackedMapPropertySource.getPropertyNames();
|
||||
for (String propertyName : propertyNames) {
|
||||
if (propertyName.length() > 55) {
|
||||
@@ -97,8 +107,9 @@ public class DedicatedLineServiceRegistration implements ApplicationListener<Ded
|
||||
Properties nacosProperties = new Properties();
|
||||
boolean find = false;
|
||||
for (PropertySource<?> propertySource : env.getPropertySources()) {
|
||||
if (propertySource instanceof OriginTrackedMapPropertySource) {
|
||||
OriginTrackedMapPropertySource originTrackedMapPropertySource = (OriginTrackedMapPropertySource) propertySource;
|
||||
// if (propertySource instanceof OriginTrackedMapPropertySource) {
|
||||
if (MapPropertySource.class.isAssignableFrom(propertySource.getClass())) {
|
||||
MapPropertySource originTrackedMapPropertySource = (MapPropertySource) propertySource;
|
||||
String[] propertyNames = originTrackedMapPropertySource.getPropertyNames();
|
||||
for (String propertyName : propertyNames) {
|
||||
if (propertyName.length() > 64) {
|
||||
|
||||
@@ -58,8 +58,12 @@ public class DedicatedLineWebServer {
|
||||
@Value("${fizz.dedicated-line.client.port:8601}")
|
||||
private int port = 8601;
|
||||
|
||||
@Value("${fizz.dedicated-line.client.enable:true}")
|
||||
private boolean fizzDedicatedLineClientEnable;
|
||||
|
||||
@PostConstruct
|
||||
public void start() {
|
||||
if (fizzDedicatedLineClientEnable) {
|
||||
HttpWebHandlerAdapter adapter = (HttpWebHandlerAdapter) httpHandler;
|
||||
NettyReactiveWebServerFactory factory = new NettyReactiveWebServerFactory(port);
|
||||
server = factory.getWebServer(
|
||||
@@ -75,9 +79,12 @@ public class DedicatedLineWebServer {
|
||||
log.info("fizz dedicated line web server listen on {}", port);
|
||||
applicationContext.publishEvent(new DedicatedLineWebServerInitializedEvent(server, applicationContext));
|
||||
}
|
||||
}
|
||||
|
||||
@PreDestroy
|
||||
public void stop() {
|
||||
if (server != null) {
|
||||
server.stop();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ public abstract class FizzWebFilter implements WebFilter {
|
||||
|
||||
@Override
|
||||
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
|
||||
if (WebUtils.isAdminReq(exchange) || WebUtils.isFizzReq(exchange)) {
|
||||
if (WebUtils.isAdminReq(exchange) || WebUtils.isFizzReq(exchange) || WebUtils.isFavReq(exchange)) {
|
||||
return chain.filter(exchange);
|
||||
} else {
|
||||
return doFilter(exchange, chain);
|
||||
|
||||
@@ -78,6 +78,11 @@ public class FlowControlFilter extends FizzWebFilter {
|
||||
|
||||
private static final String qps = "qps";
|
||||
|
||||
private static final String favPath = "/favicon.ico";
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@Resource
|
||||
private FlowControlFilterProperties flowControlFilterProperties;
|
||||
@@ -111,12 +116,20 @@ public class FlowControlFilter extends FizzWebFilter {
|
||||
|
||||
ServerHttpRequest request = exchange.getRequest();
|
||||
String path = request.getPath().value();
|
||||
boolean adminReq = false, proxyTestReq = false, fizzApiReq = false, favReq = false;
|
||||
if (path.equals(favPath)) {
|
||||
exchange.getAttributes().put(WebUtils.FAV_REQUEST, Consts.S.EMPTY);
|
||||
favReq = true;
|
||||
}
|
||||
|
||||
String service = null;
|
||||
if (!favReq) {
|
||||
int secFS = path.indexOf(Consts.S.FORWARD_SLASH, 1);
|
||||
if (secFS == -1) {
|
||||
return WebUtils.responseError(exchange, HttpStatus.INTERNAL_SERVER_ERROR.value(), "request path should like /optional-prefix/service-name/real-biz-path");
|
||||
}
|
||||
String service = path.substring(1, secFS);
|
||||
boolean adminReq = false, proxyTestReq = false, fizzApiReq = false;
|
||||
service = path.substring(1, secFS);
|
||||
|
||||
if (service.equals(admin) || service.equals(actuator)) {
|
||||
adminReq = true;
|
||||
exchange.getAttributes().put(WebUtils.ADMIN_REQUEST, Consts.S.EMPTY);
|
||||
@@ -131,8 +144,9 @@ public class FlowControlFilter extends FizzWebFilter {
|
||||
}
|
||||
|
||||
setTraceId(exchange);
|
||||
}
|
||||
|
||||
if (flowControlFilterProperties.isFlowControl() && !adminReq && !proxyTestReq && !fizzApiReq) {
|
||||
if (!favReq && flowControlFilterProperties.isFlowControl() && !adminReq && !proxyTestReq && !fizzApiReq) {
|
||||
String traceId = WebUtils.getTraceId(exchange);
|
||||
LogService.setBizId(traceId);
|
||||
if (!apiConfigService.serviceConfigMap.containsKey(service)) {
|
||||
|
||||
@@ -27,6 +27,7 @@ import org.springframework.stereotype.Service;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
import we.config.AggregateRedisConfig;
|
||||
import we.config.SystemConfig;
|
||||
import we.util.Consts;
|
||||
import we.util.JacksonUtils;
|
||||
import we.util.Result;
|
||||
@@ -54,6 +55,9 @@ public class RegistryCenterService implements ApplicationListener<ContextRefresh
|
||||
@Resource(name = AggregateRedisConfig.AGGREGATE_REACTIVE_REDIS_TEMPLATE)
|
||||
private ReactiveStringRedisTemplate rt;
|
||||
|
||||
@Resource
|
||||
private SystemConfig systemConfig;
|
||||
|
||||
@Override
|
||||
public void onApplicationEvent(ContextRefreshedEvent event) {
|
||||
Result<?> result = initRegistryCenter();
|
||||
@@ -80,9 +84,19 @@ public class RegistryCenterService implements ApplicationListener<ContextRefresh
|
||||
json = (String) e.getValue();
|
||||
RegistryCenter rc = JacksonUtils.readValue(json, RegistryCenter.class);
|
||||
registryCenterMap.put(rc.name, rc);
|
||||
LOGGER.info("init registry center {}", rc);
|
||||
rc.initFizzServiceRegistration(applicationContext);
|
||||
rc.getFizzServiceRegistration().register();
|
||||
FizzServiceRegistration fizzServiceRegistration = rc.getFizzServiceRegistration();
|
||||
try {
|
||||
fizzServiceRegistration.register();
|
||||
LOGGER.info("success to init registry center {}", rc);
|
||||
} catch (Throwable throwable) {
|
||||
if (systemConfig.isFastFailWhenRegistryCenterDown()) {
|
||||
throw throwable;
|
||||
} else {
|
||||
LOGGER.warn("fail to init registry center {}, fast fail when registry center down is false, so continue", rc, throwable);
|
||||
fizzServiceRegistration.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
result.code = Result.FAIL;
|
||||
@@ -146,7 +160,13 @@ public class RegistryCenterService implements ApplicationListener<ContextRefresh
|
||||
fizzServiceRegistration.close();
|
||||
}
|
||||
rc.initFizzServiceRegistration(applicationContext);
|
||||
rc.getFizzServiceRegistration().register();
|
||||
FizzServiceRegistration fsr = rc.getFizzServiceRegistration();
|
||||
try {
|
||||
fsr.register();
|
||||
} catch (Throwable throwable) {
|
||||
LOGGER.error("fail to update registry center {}", rc, throwable);
|
||||
fsr.close();
|
||||
}
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
LOGGER.error("update registry center error, {}", message, t);
|
||||
|
||||
@@ -55,7 +55,7 @@ public abstract class FizzEurekaHelper {
|
||||
public static FizzEurekaServiceRegistration getServiceRegistration(ApplicationContext applicationContext, Properties eurekaProperties) {
|
||||
|
||||
Properties eurekaProps = new Properties();
|
||||
for (String propertyName : eurekaProperties.stringPropertyNames()) {
|
||||
/*for (String propertyName : eurekaProperties.stringPropertyNames()) {
|
||||
String pn = null;
|
||||
if (propertyName.charAt(ecl - 1) == Consts.S.DOT) {
|
||||
pn = propertyName.substring(ecl);
|
||||
@@ -68,7 +68,25 @@ public abstract class FizzEurekaHelper {
|
||||
pn = PropertiesUtils.normalize(pn);
|
||||
}
|
||||
eurekaProps.setProperty(pn, eurekaProperties.getProperty(propertyName));
|
||||
}*/
|
||||
|
||||
eurekaProperties.forEach(
|
||||
(n, v) -> {
|
||||
String propertyName = (String) n;
|
||||
String pn = null;
|
||||
if (propertyName.charAt(ecl - 1) == Consts.S.DOT) {
|
||||
pn = propertyName.substring(ecl);
|
||||
} else if (propertyName.charAt(eil - 1) == Consts.S.DOT) {
|
||||
pn = propertyName.substring(eil);
|
||||
} else {
|
||||
pn = propertyName.substring(el);
|
||||
}
|
||||
if (pn.indexOf(Consts.S.DASH) > -1) {
|
||||
pn = PropertiesUtils.normalize(pn);
|
||||
}
|
||||
eurekaProps.put(pn, v);
|
||||
}
|
||||
);
|
||||
|
||||
InetUtils inetUtils = null;
|
||||
try {
|
||||
|
||||
@@ -46,7 +46,7 @@ public abstract class FizzNacosHelper {
|
||||
public static FizzNacosServiceRegistration getServiceRegistration(ApplicationContext applicationContext, Properties nacosProperties) {
|
||||
|
||||
Properties ps = new Properties();
|
||||
for (String propertyName : nacosProperties.stringPropertyNames()) {
|
||||
/*for (String propertyName : nacosProperties.stringPropertyNames()) {
|
||||
String propertyValue = nacosProperties.getProperty(propertyName);
|
||||
if (propertyName.endsWith(PropertyKeyConst.USERNAME)) {
|
||||
ps.setProperty(PropertyKeyConst.USERNAME, propertyValue);
|
||||
@@ -59,7 +59,24 @@ public abstract class FizzNacosHelper {
|
||||
}
|
||||
ps.setProperty(pn, propertyValue);
|
||||
}
|
||||
}*/
|
||||
|
||||
nacosProperties.forEach(
|
||||
(n, propertyValue) -> {
|
||||
String propertyName = (String) n;
|
||||
if (propertyName.endsWith(PropertyKeyConst.USERNAME)) {
|
||||
ps.put(PropertyKeyConst.USERNAME, propertyValue);
|
||||
} else if (propertyName.endsWith(PropertyKeyConst.PASSWORD)) {
|
||||
ps.put(PropertyKeyConst.PASSWORD, propertyValue);
|
||||
} else {
|
||||
String pn = propertyName.substring(ndl);
|
||||
if (pn.indexOf(Consts.S.DASH) > -1) {
|
||||
pn = PropertiesUtils.normalize(pn);
|
||||
}
|
||||
ps.put(pn, propertyValue);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
FizzNacosProperties fizzNacosProperties = new FizzNacosProperties(ps);
|
||||
PropertiesUtils.setBeanPropertyValue(fizzNacosProperties, ps);
|
||||
|
||||
@@ -24,13 +24,29 @@ import com.alibaba.nacos.api.exception.NacosException;
|
||||
import com.alibaba.nacos.api.naming.NamingService;
|
||||
import com.alibaba.nacos.api.naming.pojo.Instance;
|
||||
import com.alibaba.nacos.api.naming.pojo.ListView;
|
||||
import com.alibaba.nacos.client.naming.cache.ServiceInfoHolder;
|
||||
import com.alibaba.nacos.client.naming.core.ServerListManager;
|
||||
import com.alibaba.nacos.client.naming.core.ServiceInfoUpdateService;
|
||||
import com.alibaba.nacos.client.naming.remote.NamingClientProxyDelegate;
|
||||
import com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy;
|
||||
import com.alibaba.nacos.client.naming.remote.gprc.redo.NamingGrpcRedoService;
|
||||
import com.alibaba.nacos.client.naming.remote.http.NamingHttpClientProxy;
|
||||
import com.alibaba.nacos.common.remote.client.Connection;
|
||||
import com.alibaba.nacos.common.remote.client.RpcClientStatus;
|
||||
import com.alibaba.nacos.common.remote.client.grpc.GrpcClient;
|
||||
import com.alibaba.nacos.common.utils.ThreadUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
import we.service_registry.FizzServiceRegistration;
|
||||
import we.util.Consts;
|
||||
import we.util.ReflectionUtils;
|
||||
import we.util.Utils;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import static com.alibaba.nacos.client.utils.LogUtils.NAMING_LOGGER;
|
||||
|
||||
/**
|
||||
* @author hongqiaowei
|
||||
@@ -67,8 +83,58 @@ public class FizzNacosServiceRegistration extends FizzServiceRegistration {
|
||||
return namingService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
ServiceInfoHolder serviceInfoHolder = (ServiceInfoHolder) ReflectionUtils.get(namingService, "serviceInfoHolder");
|
||||
NamingClientProxyDelegate namingClientProxyDelegate = (NamingClientProxyDelegate) ReflectionUtils.get(namingService, "clientProxy");
|
||||
try {
|
||||
serviceInfoHolder.shutdown();
|
||||
ServiceInfoUpdateService serviceInfoUpdateService = (ServiceInfoUpdateService) ReflectionUtils.get(namingClientProxyDelegate, "serviceInfoUpdateService");
|
||||
serviceInfoUpdateService.shutdown();
|
||||
ServerListManager serverListManager = (ServerListManager) ReflectionUtils.get(namingClientProxyDelegate, "serverListManager");
|
||||
serverListManager.shutdown();
|
||||
NamingHttpClientProxy namingHttpClientProxy = (NamingHttpClientProxy) ReflectionUtils.get(namingClientProxyDelegate, "httpClientProxy");
|
||||
namingHttpClientProxy.shutdown();
|
||||
NamingGrpcClientProxy namingGrpcClientProxy = (NamingGrpcClientProxy) ReflectionUtils.get(namingClientProxyDelegate, "grpcClientProxy");
|
||||
|
||||
GrpcClient grpcClient = (GrpcClient) ReflectionUtils.get(namingGrpcClientProxy, "rpcClient");
|
||||
|
||||
AtomicReference<RpcClientStatus> rpcClientStatus = (AtomicReference<RpcClientStatus>) ReflectionUtils.get(grpcClient, "rpcClientStatus");
|
||||
rpcClientStatus.set(RpcClientStatus.SHUTDOWN);
|
||||
LOGGER.info("shutdown {} grpc client ,set status to shutdown", getId());
|
||||
|
||||
ScheduledExecutorService clientEventExecutor = (ScheduledExecutorService) ReflectionUtils.get(grpcClient, "clientEventExecutor");
|
||||
clientEventExecutor.shutdownNow();
|
||||
LOGGER.info("shutdown {} client event executor {}", getId(), clientEventExecutor);
|
||||
|
||||
Connection currentConnection = (Connection) ReflectionUtils.get(grpcClient, "currentConnection");
|
||||
if (currentConnection != null) {
|
||||
ReflectionUtils.invokeMethod("closeConnection", grpcClient, currentConnection);
|
||||
LOGGER.info("close {} current connection {}", getId(), currentConnection.getConnectionId());
|
||||
}
|
||||
|
||||
NamingGrpcRedoService namingGrpcRedoService = (NamingGrpcRedoService) ReflectionUtils.get(namingGrpcClientProxy, "redoService");
|
||||
namingGrpcRedoService.shutdown();
|
||||
|
||||
ScheduledExecutorService scheduledExecutorService = (ScheduledExecutorService) ReflectionUtils.get(namingClientProxyDelegate, "executorService");
|
||||
ThreadUtils.shutdownThreadPool(scheduledExecutorService, NAMING_LOGGER);
|
||||
|
||||
LOGGER.info("nacos {} client resource is closed", getId());
|
||||
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("nacos {} naming service shutdown exception", getId(), e);
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void shutdownClient() {
|
||||
/*try {
|
||||
namingService.shutDown();
|
||||
} catch (NacosException e) {
|
||||
LOGGER.error("nacos {} naming service shutdown exception", getId(), e);
|
||||
throw new RuntimeException(e);
|
||||
}*/
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -110,6 +110,8 @@ public abstract class WebUtils {
|
||||
|
||||
public static final String FIZZ_REQUEST = "fr@";
|
||||
|
||||
public static final String FAV_REQUEST = "fa@";
|
||||
|
||||
public static final String BODY_ENCRYPT = "b-ecyt";
|
||||
|
||||
public static final String ORIGINAL_ERROR = "origerr@";
|
||||
@@ -118,6 +120,10 @@ public abstract class WebUtils {
|
||||
private WebUtils() {
|
||||
}
|
||||
|
||||
public static boolean isFavReq(ServerWebExchange exchange) {
|
||||
return exchange.getAttribute(FAV_REQUEST) != null;
|
||||
}
|
||||
|
||||
public static boolean isAdminReq(ServerWebExchange exchange) {
|
||||
return exchange.getAttribute(ADMIN_REQUEST) != null;
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>fizz-gateway-community</artifactId>
|
||||
<groupId>com.fizzgate</groupId>
|
||||
<version>2.6.4</version>
|
||||
<version>2.6.5-beta1</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>fizz-gateway-community</artifactId>
|
||||
<groupId>com.fizzgate</groupId>
|
||||
<version>2.6.4</version>
|
||||
<version>2.6.5-beta1</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
Reference in New Issue
Block a user