Fallback and go on when nacos server down

This commit is contained in:
hongqiaowei
2022-06-09 18:37:27 +08:00
parent 73b6e56f53
commit e9ef6cca92
12 changed files with 229 additions and 44 deletions

View File

@@ -116,6 +116,8 @@ fizz:
code-field: "msgCode" code-field: "msgCode"
message-field: "message" message-field: "message"
fast-fail-when-registry-center-down: false
# dedicated-line: # dedicated-line:
# server: # server:
# enable: true # enable: true

View File

@@ -63,7 +63,7 @@ public abstract class PropertiesUtils {
public static void setBeanPropertyValue(Object bean, Properties properties, Map<String, Class<?>> propertyTypeHint) { public static void setBeanPropertyValue(Object bean, Properties properties, Map<String, Class<?>> propertyTypeHint) {
BeanWrapperImpl beanWrapper = new BeanWrapperImpl(bean); BeanWrapperImpl beanWrapper = new BeanWrapperImpl(bean);
for (String propertyName : properties.stringPropertyNames()) { /*for (String propertyName : properties.stringPropertyNames()) {
if (beanWrapper.isWritableProperty(propertyName)) { if (beanWrapper.isWritableProperty(propertyName)) {
beanWrapper.setPropertyValue(propertyName, properties.get(propertyName)); beanWrapper.setPropertyValue(propertyName, properties.get(propertyName));
} else if (propertyTypeHint != null) { } else if (propertyTypeHint != null) {
@@ -77,6 +77,24 @@ public abstract class PropertiesUtils {
} }
} }
} }
} }*/
properties.forEach(
(n, v) -> {
String propertyName = (String) n;
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));
}
}
}
}
);
} }
} }

View File

@@ -18,6 +18,7 @@
package we.util; package we.util;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method;
/** /**
* @author hongqiaowei * @author hongqiaowei
@@ -39,4 +40,10 @@ public abstract class ReflectionUtils extends org.springframework.util.Reflectio
makeAccessible(f); makeAccessible(f);
return getField(f, target); 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);
}
} }

View File

@@ -122,6 +122,13 @@ public class SystemConfig {
private String fizzDedicatedLineClientId; private String fizzDedicatedLineClientId;
@Value("${fizz.fast-fail-when-registry-center-down:false}")
private boolean fastFailWhenRegistryCenterDown;
public boolean isFastFailWhenRegistryCenterDown() {
return fastFailWhenRegistryCenterDown;
}
public int fizzDedicatedLineClientRequestTimeout() { public int fizzDedicatedLineClientRequestTimeout() {
return fizzDedicatedLineClientRequestTimeout; return fizzDedicatedLineClientRequestTimeout;
} }

View File

@@ -19,6 +19,7 @@ package we.dedicated_line;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.data.redis.core.ReactiveStringRedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -50,15 +51,20 @@ public class DedicatedLineInfoService {
@Resource(name = AggregateRedisConfig.AGGREGATE_REACTIVE_REDIS_TEMPLATE) @Resource(name = AggregateRedisConfig.AGGREGATE_REACTIVE_REDIS_TEMPLATE)
private ReactiveStringRedisTemplate rt; private ReactiveStringRedisTemplate rt;
@Value("${fizz.dedicated-line.client.enable:true}")
private boolean fizzDedicatedLineClientEnable;
@PostConstruct @PostConstruct
public void init() throws Throwable { public void init() throws Throwable {
Result<?> result = initDedicatedLineInfo(); if (fizzDedicatedLineClientEnable) {
if (result.code == Result.FAIL) { Result<?> result = initDedicatedLineInfo();
throw new RuntimeException(result.msg, result.t); if (result.code == Result.FAIL) {
} throw new RuntimeException(result.msg, result.t);
result = lsnApiPairingInfoChange(); }
if (result.code == Result.FAIL) { result = lsnApiPairingInfoChange();
throw new RuntimeException(result.msg, result.t); if (result.code == Result.FAIL) {
throw new RuntimeException(result.msg, result.t);
}
} }
} }

View File

@@ -19,6 +19,7 @@ package we.dedicated_line;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.data.redis.core.ReactiveStringRedisTemplate;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
@@ -54,15 +55,20 @@ public class DedicatedLineService {
@Resource(name = AggregateRedisConfig.AGGREGATE_REACTIVE_REDIS_TEMPLATE) @Resource(name = AggregateRedisConfig.AGGREGATE_REACTIVE_REDIS_TEMPLATE)
private ReactiveStringRedisTemplate rt; private ReactiveStringRedisTemplate rt;
@Value("${fizz.dedicated-line.server.enable:true}")
private boolean fizzDedicatedLineServerEnable;
@PostConstruct @PostConstruct
public void init() throws Throwable { public void init() throws Throwable {
Result<?> result = initDedicatedLine(); if (fizzDedicatedLineServerEnable) {
if (result.code == Result.FAIL) { Result<?> result = initDedicatedLine();
throw new RuntimeException(result.msg, result.t); if (result.code == Result.FAIL) {
} throw new RuntimeException(result.msg, result.t);
result = lsnDedicatedLineChange(); }
if (result.code == Result.FAIL) { result = lsnDedicatedLineChange();
throw new RuntimeException(result.msg, result.t); if (result.code == Result.FAIL) {
throw new RuntimeException(result.msg, result.t);
}
} }
} }

View File

@@ -21,6 +21,7 @@ import com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.env.OriginTrackedMapPropertySource; 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.ApplicationListener;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.env.PropertySource; import org.springframework.core.env.PropertySource;
import we.config.SystemConfig; import we.config.SystemConfig;
import we.service_registry.FizzServiceRegistration; import we.service_registry.FizzServiceRegistration;
@@ -53,15 +55,22 @@ public class DedicatedLineServiceRegistration implements ApplicationListener<Ded
private FizzServiceRegistration fizzServiceRegistration; private FizzServiceRegistration fizzServiceRegistration;
@Value("${fizz.dedicated-line.client.enable:true}")
private boolean fizzDedicatedLineClientEnable;
@SneakyThrows @SneakyThrows
@Override @Override
public void onApplicationEvent(DedicatedLineWebServerInitializedEvent event) { public void onApplicationEvent(DedicatedLineWebServerInitializedEvent event) {
if (!fizzDedicatedLineClientEnable) {
return;
}
ReactiveWebServerApplicationContext applicationContext = event.getApplicationContext(); ReactiveWebServerApplicationContext applicationContext = event.getApplicationContext();
ConfigurableEnvironment env = applicationContext.getEnvironment(); ConfigurableEnvironment env = applicationContext.getEnvironment();
String prefix = SystemConfig.FIZZ_DEDICATED_LINE_CLIENT_PREFIX + ".service-registration"; 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")); boolean nacos = env.containsProperty((prefix + ".nacos.discovery.server-addr"));
if (eureka || nacos) { if (eureka || nacos) {
@@ -69,8 +78,9 @@ public class DedicatedLineServiceRegistration implements ApplicationListener<Ded
Properties eurekaProperties = new Properties(); Properties eurekaProperties = new Properties();
boolean find = false; boolean find = false;
for (PropertySource<?> propertySource : env.getPropertySources()) { for (PropertySource<?> propertySource : env.getPropertySources()) {
if (propertySource instanceof OriginTrackedMapPropertySource) { // if (propertySource instanceof OriginTrackedMapPropertySource) {
OriginTrackedMapPropertySource originTrackedMapPropertySource = (OriginTrackedMapPropertySource) propertySource; if (MapPropertySource.class.isAssignableFrom(propertySource.getClass())) {
MapPropertySource originTrackedMapPropertySource = (MapPropertySource) propertySource;
String[] propertyNames = originTrackedMapPropertySource.getPropertyNames(); String[] propertyNames = originTrackedMapPropertySource.getPropertyNames();
for (String propertyName : propertyNames) { for (String propertyName : propertyNames) {
if (propertyName.length() > 55) { if (propertyName.length() > 55) {
@@ -97,8 +107,9 @@ public class DedicatedLineServiceRegistration implements ApplicationListener<Ded
Properties nacosProperties = new Properties(); Properties nacosProperties = new Properties();
boolean find = false; boolean find = false;
for (PropertySource<?> propertySource : env.getPropertySources()) { for (PropertySource<?> propertySource : env.getPropertySources()) {
if (propertySource instanceof OriginTrackedMapPropertySource) { // if (propertySource instanceof OriginTrackedMapPropertySource) {
OriginTrackedMapPropertySource originTrackedMapPropertySource = (OriginTrackedMapPropertySource) propertySource; if (MapPropertySource.class.isAssignableFrom(propertySource.getClass())) {
MapPropertySource originTrackedMapPropertySource = (MapPropertySource) propertySource;
String[] propertyNames = originTrackedMapPropertySource.getPropertyNames(); String[] propertyNames = originTrackedMapPropertySource.getPropertyNames();
for (String propertyName : propertyNames) { for (String propertyName : propertyNames) {
if (propertyName.length() > 64) { if (propertyName.length() > 64) {

View File

@@ -58,26 +58,33 @@ public class DedicatedLineWebServer {
@Value("${fizz.dedicated-line.client.port:8601}") @Value("${fizz.dedicated-line.client.port:8601}")
private int port = 8601; private int port = 8601;
@Value("${fizz.dedicated-line.client.enable:true}")
private boolean fizzDedicatedLineClientEnable;
@PostConstruct @PostConstruct
public void start() { public void start() {
HttpWebHandlerAdapter adapter = (HttpWebHandlerAdapter) httpHandler; if (fizzDedicatedLineClientEnable) {
NettyReactiveWebServerFactory factory = new NettyReactiveWebServerFactory(port); HttpWebHandlerAdapter adapter = (HttpWebHandlerAdapter) httpHandler;
server = factory.getWebServer( NettyReactiveWebServerFactory factory = new NettyReactiveWebServerFactory(port);
new DedicatedLineHttpHandler( server = factory.getWebServer(
applicationContext, new DedicatedLineHttpHandler(
new DefaultWebSessionManager(), applicationContext,
adapter.getCodecConfigurer(), new DefaultWebSessionManager(),
adapter.getLocaleContextResolver(), adapter.getCodecConfigurer(),
adapter.getForwardedHeaderTransformer() adapter.getLocaleContextResolver(),
) adapter.getForwardedHeaderTransformer()
); )
server.start(); );
log.info("fizz dedicated line web server listen on {}", port); server.start();
applicationContext.publishEvent(new DedicatedLineWebServerInitializedEvent(server, applicationContext)); log.info("fizz dedicated line web server listen on {}", port);
applicationContext.publishEvent(new DedicatedLineWebServerInitializedEvent(server, applicationContext));
}
} }
@PreDestroy @PreDestroy
public void stop() { public void stop() {
server.stop(); if (server != null) {
server.stop();
}
} }
} }

View File

@@ -27,6 +27,7 @@ import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import we.config.AggregateRedisConfig; import we.config.AggregateRedisConfig;
import we.config.SystemConfig;
import we.util.Consts; import we.util.Consts;
import we.util.JacksonUtils; import we.util.JacksonUtils;
import we.util.Result; import we.util.Result;
@@ -42,7 +43,7 @@ import java.util.Map;
*/ */
@Service @Service
public class RegistryCenterService implements ApplicationListener<ContextRefreshedEvent> { public class RegistryCenterService implements ApplicationListener<ContextRefreshedEvent> {
private static final Logger LOGGER = LoggerFactory.getLogger(RegistryCenterService.class); private static final Logger LOGGER = LoggerFactory.getLogger(RegistryCenterService.class);
@@ -54,6 +55,9 @@ public class RegistryCenterService implements ApplicationListener<ContextRefresh
@Resource(name = AggregateRedisConfig.AGGREGATE_REACTIVE_REDIS_TEMPLATE) @Resource(name = AggregateRedisConfig.AGGREGATE_REACTIVE_REDIS_TEMPLATE)
private ReactiveStringRedisTemplate rt; private ReactiveStringRedisTemplate rt;
@Resource
private SystemConfig systemConfig;
@Override @Override
public void onApplicationEvent(ContextRefreshedEvent event) { public void onApplicationEvent(ContextRefreshedEvent event) {
Result<?> result = initRegistryCenter(); Result<?> result = initRegistryCenter();
@@ -80,9 +84,19 @@ public class RegistryCenterService implements ApplicationListener<ContextRefresh
json = (String) e.getValue(); json = (String) e.getValue();
RegistryCenter rc = JacksonUtils.readValue(json, RegistryCenter.class); RegistryCenter rc = JacksonUtils.readValue(json, RegistryCenter.class);
registryCenterMap.put(rc.name, rc); registryCenterMap.put(rc.name, rc);
LOGGER.info("init registry center {}", rc);
rc.initFizzServiceRegistration(applicationContext); 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) { } catch (Throwable t) {
result.code = Result.FAIL; result.code = Result.FAIL;
@@ -146,7 +160,13 @@ public class RegistryCenterService implements ApplicationListener<ContextRefresh
fizzServiceRegistration.close(); fizzServiceRegistration.close();
} }
rc.initFizzServiceRegistration(applicationContext); 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) { } catch (Throwable t) {
LOGGER.error("update registry center error, {}", message, t); LOGGER.error("update registry center error, {}", message, t);

View File

@@ -55,7 +55,7 @@ public abstract class FizzEurekaHelper {
public static FizzEurekaServiceRegistration getServiceRegistration(ApplicationContext applicationContext, Properties eurekaProperties) { public static FizzEurekaServiceRegistration getServiceRegistration(ApplicationContext applicationContext, Properties eurekaProperties) {
Properties eurekaProps = new Properties(); Properties eurekaProps = new Properties();
for (String propertyName : eurekaProperties.stringPropertyNames()) { /*for (String propertyName : eurekaProperties.stringPropertyNames()) {
String pn = null; String pn = null;
if (propertyName.charAt(ecl - 1) == Consts.S.DOT) { if (propertyName.charAt(ecl - 1) == Consts.S.DOT) {
pn = propertyName.substring(ecl); pn = propertyName.substring(ecl);
@@ -68,7 +68,25 @@ public abstract class FizzEurekaHelper {
pn = PropertiesUtils.normalize(pn); pn = PropertiesUtils.normalize(pn);
} }
eurekaProps.setProperty(pn, eurekaProperties.getProperty(propertyName)); 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; InetUtils inetUtils = null;
try { try {

View File

@@ -46,7 +46,7 @@ public abstract class FizzNacosHelper {
public static FizzNacosServiceRegistration getServiceRegistration(ApplicationContext applicationContext, Properties nacosProperties) { public static FizzNacosServiceRegistration getServiceRegistration(ApplicationContext applicationContext, Properties nacosProperties) {
Properties ps = new Properties(); Properties ps = new Properties();
for (String propertyName : nacosProperties.stringPropertyNames()) { /*for (String propertyName : nacosProperties.stringPropertyNames()) {
String propertyValue = nacosProperties.getProperty(propertyName); String propertyValue = nacosProperties.getProperty(propertyName);
if (propertyName.endsWith(PropertyKeyConst.USERNAME)) { if (propertyName.endsWith(PropertyKeyConst.USERNAME)) {
ps.setProperty(PropertyKeyConst.USERNAME, propertyValue); ps.setProperty(PropertyKeyConst.USERNAME, propertyValue);
@@ -59,7 +59,24 @@ public abstract class FizzNacosHelper {
} }
ps.setProperty(pn, propertyValue); 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); FizzNacosProperties fizzNacosProperties = new FizzNacosProperties(ps);
PropertiesUtils.setBeanPropertyValue(fizzNacosProperties, ps); PropertiesUtils.setBeanPropertyValue(fizzNacosProperties, ps);

View File

@@ -24,13 +24,29 @@ import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance; import com.alibaba.nacos.api.naming.pojo.Instance;
import com.alibaba.nacos.api.naming.pojo.ListView; 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 org.springframework.util.StringUtils;
import we.service_registry.FizzServiceRegistration; import we.service_registry.FizzServiceRegistration;
import we.util.Consts; import we.util.Consts;
import we.util.ReflectionUtils;
import we.util.Utils; import we.util.Utils;
import java.util.Collections; import java.util.Collections;
import java.util.List; 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 * @author hongqiaowei
@@ -67,8 +83,58 @@ public class FizzNacosServiceRegistration extends FizzServiceRegistration {
return namingService; 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 @Override
protected void shutdownClient() { protected void shutdownClient() {
/*try {
namingService.shutDown();
} catch (NacosException e) {
LOGGER.error("nacos {} naming service shutdown exception", getId(), e);
throw new RuntimeException(e);
}*/
} }
@Override @Override