Commit 47bed17b by 房斌

优雅停机核心代码(注入方式待改)

parent 27455603
package com.secoo.mall.common.core.bean.gracefulshowtdownBean;
public class AbstractTransportData<T> {
T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
package com.secoo.mall.common.core.bean.gracefulshowtdownBean;
import java.util.List;
public class ExecutorDetail {
String beginTime;
String endTime;
List<String> detail;
int code;
String serviceName;
public String getServiceName() {
return serviceName;
}
public void setServiceName(String serviceName) {
this.serviceName = serviceName;
}
public String getBeginTime() {
return beginTime;
}
public void setBeginTime(String beginTime) {
this.beginTime = beginTime;
}
public String getEndTime() {
return endTime;
}
public void setEndTime(String endTime) {
this.endTime = endTime;
}
public List<String> getDetail() {
return detail;
}
public void setDetail(List<String> detail) {
this.detail = detail;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
}
package com.secoo.mall.common.core.bean.gracefulshowtdownBean;
import java.util.List;
public class ExecutorDetails extends AbstractTransportData<List<ExecutorDetail>> {
int code;
String ip;
String name;
List<ExecutorDetail> details;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.secoo.mall.common.core.service;
public interface UpDatas<T> {
public boolean upData(T t) throws Exception;
}
...@@ -34,30 +34,72 @@ import org.springframework.context.annotation.Configuration; ...@@ -34,30 +34,72 @@ import org.springframework.context.annotation.Configuration;
public class ConfigCenter { public class ConfigCenter {
private static final Logger logger = LoggerFactory.getLogger(ConfigCenter.class); public static final Logger logger = LoggerFactory.getLogger(ConfigCenter.class);
//centers in dubbo 2.7 //centers in dubbo 2.7
@Value("${admin.config-center:}") @Value("${admin.config-center:}")
private String configCenter; public String configCenter;
@Value("${admin.registry.address:}") @Value("${admin.registry.address:}")
private String registryAddress; public String registryAddress;
@Value("${admin.metadata-report.address:}") @Value("${admin.metadata-report.address:}")
private String metadataAddress; public String metadataAddress;
@Value("${admin.metadata-report.cluster:false}") @Value("${admin.metadata-report.cluster:false}")
private boolean cluster; public boolean cluster;
@Value("${admin.registry.group:dubbo}") @Value("${admin.registry.group:dubbo}")
private String registryGroup; public String registryGroup;
@Value("${admin.config-center.group:dubbo}") @Value("${admin.config-center.group:dubbo}")
private String configCenterGroup; public String configCenterGroup;
@Value("${admin.metadata-report.group:dubbo}") @Value("${admin.metadata-report.group:dubbo}")
private String metadataGroup; public String metadataGroup;
@Value("${admin.config-center.username:}") @Value("${admin.config-center.username:}")
private String username; public String username;
@Value("${admin.config-center.password:}") @Value("${admin.config-center.password:}")
private String password; public String password;
private URL configCenterUrl; @Value("${admin.config-center.patch:}")
private URL registryUrl; public String patch;
private URL metadataUrl; public URL configCenterUrl;
public URL registryUrl;
public String getRegistryGroup() {
return registryGroup;
}
public void setRegistryGroup(String registryGroup) {
this.registryGroup = registryGroup;
}
public URL getRegistryUrl() {
return registryUrl;
}
public void setRegistryUrl(URL registryUrl) {
this.registryUrl = registryUrl;
}
public URL metadataUrl;
public String getRegistryAddress() {
return registryAddress;
}
public void setRegistryAddress(String registryAddress) {
this.registryAddress = registryAddress;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
/* /*
* generate registry client * generate registry client
...@@ -70,13 +112,14 @@ public class ConfigCenter { ...@@ -70,13 +112,14 @@ public class ConfigCenter {
throw new ConfigurationException("Either config center or registry address is needed, please refer to https://github.com/apache/incubator-dubbo-admin/wiki/Dubbo-Admin-configuration"); throw new ConfigurationException("Either config center or registry address is needed, please refer to https://github.com/apache/incubator-dubbo-admin/wiki/Dubbo-Admin-configuration");
} }
registryUrl = formUrl(registryAddress, registryGroup, username, password); registryUrl = formUrl(registryAddress, registryGroup, username, password);
// registryUrl.setPath(patch);
} }
RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension(); RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
registry = registryFactory.getRegistry(registryUrl); registry = registryFactory.getRegistry(registryUrl);
return registry; return registry;
} }
private URL formUrl(String config, String group, String username, String password) { public URL formUrl(String config, String group, String username, String password) {
URL url = URL.valueOf(config); URL url = URL.valueOf(config);
if (StringUtils.isNotEmpty(group)) { if (StringUtils.isNotEmpty(group)) {
url = url.addParameter(Constants.GROUP_KEY, group); url = url.addParameter(Constants.GROUP_KEY, group);
...@@ -89,4 +132,5 @@ public class ConfigCenter { ...@@ -89,4 +132,5 @@ public class ConfigCenter {
} }
return url; return url;
} }
} }
...@@ -31,6 +31,7 @@ import org.springframework.beans.factory.InitializingBean; ...@@ -31,6 +31,7 @@ import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner; import org.springframework.boot.CommandLineRunner;
import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
...@@ -90,11 +91,13 @@ public class RegistryServerSync implements InitializingBean, DisposableBean, Not ...@@ -90,11 +91,13 @@ public class RegistryServerSync implements InitializingBean, DisposableBean, Not
@Override @Override
public void destroy() throws Exception { public void destroy() throws Exception {
registry.unsubscribe(SUBSCRIBE, this); registry.unsubscribe(SUBSCRIBE, this);
logger.info("RegistryServerSync destory ------------>time:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date()));
} }
// Notification of of any service with any type (override、subcribe、route、provider) is full. // Notification of of any service with any type (override、subcribe、route、provider) is full.
@Override @Override
public void notify(List<URL> urls) { public void notify(List<URL> urls) {
if (urls == null || urls.isEmpty()) { if (urls == null || urls.isEmpty()) {
return; return;
} }
......
...@@ -17,6 +17,8 @@ ...@@ -17,6 +17,8 @@
package com.secoo.mall.dubbo.monitor.dubbo.service.impl; package com.secoo.mall.dubbo.monitor.dubbo.service.impl;
import com.alibaba.fastjson.JSON;
import com.secoo.mall.common.util.log.LoggerUtil;
import com.secoo.mall.common.util.string.StringUtil; import com.secoo.mall.common.util.string.StringUtil;
import com.secoo.mall.dubbo.monitor.dubbo.Constants.Constants; import com.secoo.mall.dubbo.monitor.dubbo.Constants.Constants;
import com.secoo.mall.dubbo.monitor.dubbo.exception.ParamValidationException; import com.secoo.mall.dubbo.monitor.dubbo.exception.ParamValidationException;
...@@ -30,6 +32,7 @@ import com.secoo.mall.dubbo.monitor.utils.Tool; ...@@ -30,6 +32,7 @@ import com.secoo.mall.dubbo.monitor.utils.Tool;
import org.apache.dubbo.common.URL; import org.apache.dubbo.common.URL;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
......
package com.secoo.mall.common.core.service; package com.secoo.mall.dubbo.service;
public abstract class AbstractStop implements StopService<StringBuilder> ,Comparable { import com.secoo.mall.common.core.service.StopService;
import com.secoo.mall.common.core.bean.gracefulshowtdownBean.ExecutorDetail;
public abstract class AbstractStop implements StopService<ExecutorDetail>,Comparable {
//定义执行顺序 //定义执行顺序
public abstract Integer getHandleTypeOrder(); public abstract Integer getHandleTypeOrder();
......
package com.secoo.mall.dubbo.service;
import com.alibaba.fastjson.JSON;
import com.secoo.mall.common.core.service.UpDatas;
import com.secoo.mall.common.util.log.LoggerUtil;
import com.secoo.mall.common.core.bean.gracefulshowtdownBean.ExecutorDetails;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.extension.ExtensionLoader;
import org.apache.dubbo.remoting.zookeeper.ZookeeperClient;
import org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter;
import org.springframework.stereotype.Component;
@Component
public class DubboUpdata implements UpDatas<ExecutorDetails> {
URL url;
public URL getUrl() {
return url;
}
public void setUrl(URL url) {
this.url = url;
}
@Override
public boolean upData(ExecutorDetails obj) {
ZookeeperTransporter zookeeperTransporter = ExtensionLoader.getExtensionLoader(ZookeeperTransporter.class).getAdaptiveExtension();
ZookeeperClient cliet = zookeeperTransporter.connect(url);
// String monitor=url.getPath()+"/"+obj.getName()+"/"+obj.getIp();
// String monitor=url.getPath();
try {
String monitor = "/monitorZ/" + obj.getName() + "/" + obj.getIp();
cliet.create(monitor, JSON.toJSONString(obj), true);
} catch (Exception e) {
LoggerUtil.info("Exception e:" ,e);
}
return false;
}
}
package com.secoo.mall.dubbo.service; package com.secoo.mall.dubbo.service.impl;
import com.secoo.mall.common.core.service.AbstractStop; import com.secoo.mall.common.util.date.DateUtil;
import com.secoo.mall.common.util.log.LoggerUtil; import com.secoo.mall.common.util.log.LoggerUtil;
import com.secoo.mall.common.util.string.StringUtil; import com.secoo.mall.common.util.string.StringUtil;
import com.secoo.mall.common.core.bean.gracefulshowtdownBean.ExecutorDetail;
import com.secoo.mall.dubbo.monitor.dubbo.model.domain.Provider; import com.secoo.mall.dubbo.monitor.dubbo.model.domain.Provider;
import com.secoo.mall.dubbo.monitor.dubbo.service.ProviderService; import com.secoo.mall.dubbo.monitor.dubbo.service.ProviderService;
import com.secoo.mall.dubbo.service.AbstractStop;
import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.common.extension.ExtensionLoader; import org.apache.dubbo.common.extension.ExtensionLoader;
import org.apache.dubbo.common.utils.NetUtils; import org.apache.dubbo.common.utils.NetUtils;
import org.apache.dubbo.config.DubboShutdownHook; import org.apache.dubbo.config.DubboShutdownHook;
import org.apache.dubbo.registry.support.AbstractRegistryFactory;
import org.apache.dubbo.rpc.Protocol; import org.apache.dubbo.rpc.Protocol;
import org.apache.dubbo.rpc.model.ApplicationModel; import org.apache.dubbo.rpc.model.ApplicationModel;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
...@@ -28,52 +31,62 @@ public class DubboCustomerDownHock extends AbstractStop { ...@@ -28,52 +31,62 @@ public class DubboCustomerDownHock extends AbstractStop {
} }
@Override @Override
public StringBuilder stop() { public ExecutorDetail stop() {
StringBuilder builderStr = new StringBuilder(); ExecutorDetail detail = new ExecutorDetail();
String lineSeparator = System.getProperty("line.separator", "\n"); detail.setBeginTime(DateUtil.getDateTime());
detail.setServiceName("dubboDownHock");
List<String> str = new ArrayList<String>();
detail.setDetail(str);
detail.setCode(0);
try { try {
//step1 register销毁 //step1 register销毁
LoggerUtil.info(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date())+" step one:dubbo-------------unregister time:"+ StringUtil.line()); String ip = NetUtils.getIpByHost(NetUtils.getLocalAddress().getHostName());
AbstractRegistryFactory.destroyAll();
LoggerUtil.info(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date())+" step two:dubbo-------------unregister end time:"+ StringUtil.line());
//TODO step2 写在阿波罗里,具体数据 以后根据客户端上报的数据配置,目前无详细依据。等待
Thread.sleep(10000);
String ip = "";
ip = NetUtils.getIpByHost(NetUtils.getLocalAddress().getHostName());
String name = ApplicationModel.getApplication(); String name = ApplicationModel.getApplication();
builderStr.append("dubbo ip result---------->" + ip+" application:"+name+StringUtil.line());
List<Provider> serviceDTOS = providerService.getServiceDTOSByQuery("ip", ip, ""); List<Provider> serviceDTOS = providerService.getServiceDTOSByQuery("ip", ip, "");
if (StringUtil.isNoneEmpty(name) && serviceDTOS != null && serviceDTOS.size() > 0) { if (StringUtil.isNoneEmpty(name) && serviceDTOS != null && serviceDTOS.size() > 0) {
serviceDTOS = providerService.findProviderUrlByGivenApplication(name, serviceDTOS); serviceDTOS = providerService.findProviderUrlByGivenApplication(name, serviceDTOS);
} }
Iterator<Provider> provides = serviceDTOS.iterator();
while (provides.hasNext()) {
Provider provider = provides.next();
try {
if (StringUtils.isNotEmpty(String.valueOf(provider.getHash()))) {
providerService.deleteStaticProvider(String.valueOf(provider.getHash()));
LoggerUtil.info("delete2 provider url:" + provider.getService() + " time:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date()));
}
} catch (Exception e) {
LoggerUtil.error("matirx-monitor offDubbo deleteStaticProvider error:", e);
}
}
Thread.sleep(6000);//zookper 目前最大超时时间
//step3 check检查 //step3 check检查
Iterator<Provider> iteratorCheck = serviceDTOS.iterator(); Iterator<Provider> iteratorCheck = serviceDTOS.iterator();
while (iteratorCheck.hasNext()) { while (iteratorCheck.hasNext()) {
Provider obj = iteratorCheck.next(); Provider obj = iteratorCheck.next();
if(StringUtil.isNotEmpty(obj.getAddress())&&StringUtil.isNotEmpty(name)){ if (StringUtil.isNotEmpty(obj.getAddress()) && StringUtil.isNotEmpty(name)) {
List<String> check = providerService.findServicesByAddressAndName(obj.getAddress(),name); List<String> check = providerService.findServicesByAddressAndName(obj.getAddress(), name);
if (check != null && check.size() > 0) { if (check != null && check.size() > 0) {
str.add("warn:matrix-monitor2 off DubboService check service failure" + obj.getUrl() + " already on line after off " + StringUtil.line());
builderStr.append("warn:matrix-monitor off DubboService check service failure" + obj.getUrl() + " already on line after off " + StringUtil.line()); detail.setCode(-1);
LoggerUtil.info(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date()) +"step three:dubbo check------------- time:"+ obj.getUrl() + " already on line after off " + StringUtil.line());
} }
} }
} }
//step4 协议层销毁 DubboShutdownHook.getDubboShutdownHook().doDestroy();
destoryProtocol();
} catch (Exception e) { } catch (Exception e) {
DubboShutdownHook.getDubboShutdownHook().doDestroy(); DubboShutdownHook.getDubboShutdownHook().doDestroy();
builderStr.append(" error :matirx-monitor offDubbo " + e.toString() + lineSeparator); detail.setCode(-1);
str.add(" error :matirx-monitor offDubbo " + e.toString() + StringUtil.line());
} }
return builderStr; detail.setEndTime(DateUtil.getDateTime());
return detail;
} }
public void destoryProtocol() { public void destoryProtocol() {
......
package com.secoo.mall.dubbo.service; package com.secoo.mall.dubbo.service.impl;
import com.secoo.mall.common.core.service.AbstractStop;
import com.secoo.mall.common.util.date.DateUtil; import com.secoo.mall.common.util.date.DateUtil;
import com.secoo.mall.common.util.log.LoggerUtil;
import com.secoo.mall.common.util.string.StringUtil; import com.secoo.mall.common.util.string.StringUtil;
import com.secoo.mall.common.core.bean.gracefulshowtdownBean.ExecutorDetail;
import com.secoo.mall.dubbo.service.AbstractStop;
import org.apache.catalina.connector.Connector; import org.apache.catalina.connector.Connector;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
...@@ -25,8 +27,14 @@ public class ServletConnectShoutDownHock extends AbstractStop { ...@@ -25,8 +27,14 @@ public class ServletConnectShoutDownHock extends AbstractStop {
} }
@Override @Override
public StringBuilder stop() { public ExecutorDetail stop() {
StringBuilder sb = new StringBuilder(); ExecutorDetail detail = new ExecutorDetail();
detail.setBeginTime(DateUtil.getDateTime());
detail.setServiceName("ServletConnectShoutDownHock");
List<String> str = new ArrayList<String>();
detail.setDetail(str);
detail.setCode(0);
this.connector.pause(); this.connector.pause();
Executor executor = this.connector.getProtocolHandler().getExecutor(); Executor executor = this.connector.getProtocolHandler().getExecutor();
if (executor instanceof ThreadPoolExecutor) { if (executor instanceof ThreadPoolExecutor) {
...@@ -34,25 +42,25 @@ public class ServletConnectShoutDownHock extends AbstractStop { ...@@ -34,25 +42,25 @@ public class ServletConnectShoutDownHock extends AbstractStop {
ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor; ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor;
threadPoolExecutor.shutdown(); threadPoolExecutor.shutdown();
sb.append("apache connector executor shutdown=============time:" + DateUtil.getDateTime()+ StringUtil.line());
//TODO 超时时间
if (!threadPoolExecutor.awaitTermination(10, TimeUnit.SECONDS)) { if (!threadPoolExecutor.awaitTermination(10, TimeUnit.SECONDS)) {
sb.append("warn:Tomcat thread pool did not shut down gracefully within " detail.setCode(-1);
str.add("warn:Tomcat thread pool did not shut down gracefully within "
+ "10" + " seconds. Proceeding with forceful shutdown" + StringUtil.line()); + "10" + " seconds. Proceeding with forceful shutdown" + StringUtil.line());
threadPoolExecutor.shutdownNow(); threadPoolExecutor.shutdownNow();
if (!threadPoolExecutor.awaitTermination(10, TimeUnit.SECONDS)) { if (!threadPoolExecutor.awaitTermination(10, TimeUnit.SECONDS)) {
sb.append("warn:Tomcat thread pool did not terminate"); detail.setCode(-1);
sb.append("Tomcat thread pool did not terminate"+StringUtil.line()); str.add("warn:Tomcat thread pool did not terminate already wait 20s" + StringUtil.line());
} }
} }
} catch (InterruptedException ex) { } catch (InterruptedException ex) {
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
sb.append("error:"+ex.getMessage()+StringUtil.line()); detail.setCode(-1);
str.add("error:"+ex.getMessage()+StringUtil.line());
} }
} }
return sb; detail.setEndTime(DateUtil.getDateTime());
return detail;
} }
@Override @Override
......
package com.secoo.mall.dubbo.spring.boot.autoconfigure; package com.secoo.mall.dubbo.spring.boot.autoconfigure;
import com.alibaba.fastjson.JSON;
import com.secoo.mall.common.core.service.StopService; import com.secoo.mall.common.core.service.StopService;
import com.secoo.mall.common.core.service.UpDatas;
import com.secoo.mall.common.util.log.LoggerUtil; import com.secoo.mall.common.util.log.LoggerUtil;
import com.secoo.mall.common.util.string.StringUtil; import com.secoo.mall.common.core.bean.gracefulshowtdownBean.ExecutorDetail;
import com.secoo.mall.dubbo.monitor.dubbo.model.domain.Provider; import com.secoo.mall.common.core.bean.gracefulshowtdownBean.ExecutorDetails;
import com.secoo.mall.dubbo.monitor.dubbo.service.ProviderService; import com.secoo.mall.dubbo.monitor.dubbo.service.ProviderService;
import com.secoo.mall.dubbo.service.ServletConnectShoutDownHock; import com.secoo.mall.dubbo.service.impl.ServletConnectShoutDownHock;
import org.apache.catalina.connector.Connector; import org.apache.catalina.connector.Connector;
import org.apache.dubbo.common.extension.ExtensionLoader; import org.apache.dubbo.common.extension.ExtensionLoader;
import org.apache.dubbo.common.utils.NetUtils; import org.apache.dubbo.common.utils.NetUtils;
import org.apache.dubbo.config.DubboShutdownHook; import org.apache.dubbo.config.DubboShutdownHook;
import org.apache.dubbo.config.spring.extension.SpringExtensionFactory; import org.apache.dubbo.config.spring.extension.SpringExtensionFactory;
import org.apache.dubbo.registry.support.AbstractRegistryFactory;
import org.apache.dubbo.rpc.Protocol; import org.apache.dubbo.rpc.Protocol;
import org.apache.dubbo.rpc.model.ApplicationModel; import org.apache.dubbo.rpc.model.ApplicationModel;
import org.slf4j.Logger; import org.slf4j.Logger;
...@@ -26,7 +27,7 @@ import org.springframework.context.ApplicationListener; ...@@ -26,7 +27,7 @@ import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ApplicationEventMulticaster; import org.springframework.context.event.ApplicationEventMulticaster;
import org.springframework.context.event.ContextClosedEvent; import org.springframework.context.event.ContextClosedEvent;
import java.text.SimpleDateFormat; import java.lang.reflect.Field;
import java.util.*; import java.util.*;
import static org.springframework.context.support.AbstractApplicationContext.APPLICATION_EVENT_MULTICASTER_BEAN_NAME; import static org.springframework.context.support.AbstractApplicationContext.APPLICATION_EVENT_MULTICASTER_BEAN_NAME;
...@@ -40,6 +41,9 @@ public class GracefullyShoutDown implements CommandLineRunner, ApplicationListen ...@@ -40,6 +41,9 @@ public class GracefullyShoutDown implements CommandLineRunner, ApplicationListen
@Autowired @Autowired
private final ProviderService providerService = null; private final ProviderService providerService = null;
@Autowired
UpDatas dubboUpdata;
//容器初始化后执行 //容器初始化后执行
@Override @Override
...@@ -48,15 +52,73 @@ public class GracefullyShoutDown implements CommandLineRunner, ApplicationListen ...@@ -48,15 +52,73 @@ public class GracefullyShoutDown implements CommandLineRunner, ApplicationListen
//hock卸载 //hock卸载
DubboShutdownHook.getDubboShutdownHook().unregister(); DubboShutdownHook.getDubboShutdownHook().unregister();
//listener 卸载 //listener 卸载
// ApplicationEventMulticaster multicaster = context.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class); ApplicationEventMulticaster multicaster = context.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
// multicaster.removeApplicationListener(SpringExtensionFactory.SHUTDOWN_HOOK_LISTENER); Class clz = SpringExtensionFactory.class;
multicaster.removeApplicationListener((ApplicationListener) getPrivateConst("SHUTDOWN_HOOK_LISTENER"));
// //上报数据,异步上报 超时返回
// ResultTransportData data=new ResultTransportData();
// String ip = NetUtils.getIpByHost(NetUtils.getLocalAddress().getHostName());
// String name = ApplicationModel.getApplication();
// data.setIp(ip);
// data.setName(name);
// data.setT("hello,nihao");
// dubboUpdata.upData(data);
//test-------------------------------------> begin
ExecutorDetails result = new ExecutorDetails();
result.setCode(0);
List<ExecutorDetail> details = new ArrayList<ExecutorDetail>();
result.setT(details);
String ip = NetUtils.getIpByHost(NetUtils.getLocalAddress().getHostName());
String name = ApplicationModel.getApplication();
result.setIp(ip);
result.setName(name);
try {
Map<String, StopService> map = this.context.getBeansOfType(StopService.class);
if (map != null && map.size() > 0) {
Set<StopService> ts = new TreeSet<StopService>();
for (StopService service : map.values()) {
ts.add(service);
}
//按定义顺序执行
Iterator<StopService> it = ts.iterator();
while (it.hasNext()) {
StopService service = (StopService) it.next();
ExecutorDetail one = (ExecutorDetail) service.stop();
if (one != null) {
details.add(one);
if (one.getCode() != 0) {
result.setCode(-1);
}
}
}
}
} catch (Exception e) {
LoggerUtil.error("matrix.GracefullyShoutDown.error", e);
}
try {
dubboUpdata.upData(result);
} catch (Exception e) {
LoggerUtil.error("matrix.GracefullyShoutDown update .error data:" + JSON.toJSONString(result), e);
}
//test------------------------------------->
} }
}
// LoggerUtil.info("执行销毁测试------------>begin"); public static Object getPrivateConst(String field) {
// AbstractRegistryFactory.destroyAll(); try {
// destoryProtocol(); Field f = SpringExtensionFactory.class.getDeclaredField(field);
// Thread.sleep(10000); f.setAccessible(true);
// LoggerUtil.info("执行销毁测试------------>end"); return f.get(null);
} catch (Exception e) {
}
return null;
} }
//容器关闭后执行 //容器关闭后执行
...@@ -77,14 +139,16 @@ public class GracefullyShoutDown implements CommandLineRunner, ApplicationListen ...@@ -77,14 +139,16 @@ public class GracefullyShoutDown implements CommandLineRunner, ApplicationListen
@Override @Override
public void onApplicationEvent(ContextClosedEvent contextClosedEvent) { public void onApplicationEvent(ContextClosedEvent contextClosedEvent) {
ExecutorDetails result = new ExecutorDetails();
LoggerUtil.info("=============time:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date())); result.setCode(0);
List<ExecutorDetail> details = new ArrayList<ExecutorDetail>();
result.setT(details);
String ip = NetUtils.getIpByHost(NetUtils.getLocalAddress().getHostName());
String name = ApplicationModel.getApplication();
result.setIp(ip);
result.setName(name);
try { try {
StringBuilder up = new StringBuilder();
up.append("begin time:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date()) + StringUtil.line());
//排序
Map<String, StopService> map = contextClosedEvent.getApplicationContext().getBeansOfType(StopService.class); Map<String, StopService> map = contextClosedEvent.getApplicationContext().getBeansOfType(StopService.class);
if (map != null && map.size() > 0) { if (map != null && map.size() > 0) {
Set<StopService> ts = new TreeSet<StopService>(); Set<StopService> ts = new TreeSet<StopService>();
...@@ -95,20 +159,24 @@ public class GracefullyShoutDown implements CommandLineRunner, ApplicationListen ...@@ -95,20 +159,24 @@ public class GracefullyShoutDown implements CommandLineRunner, ApplicationListen
Iterator<StopService> it = ts.iterator(); Iterator<StopService> it = ts.iterator();
while (it.hasNext()) { while (it.hasNext()) {
StopService service = (StopService) it.next(); StopService service = (StopService) it.next();
up.append("name:" + service.toString() + ",excute begin time:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date()) + StringUtil.line()); ExecutorDetail one = (ExecutorDetail) service.stop();
StringBuilder result = (StringBuilder) service.stop(); if (one != null) {
up.append("name:" + service.toString() + ",excute end time:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date()) + StringUtil.line() + ",result:" + result); details.add(one);
if (one.getCode() != 0) {
result.setCode(-1);
}
}
} }
LoggerUtil.info("==========================result:"+up.toString());
//上报数据
} }
} catch (Exception e) { } catch (Exception e) {
LoggerUtil.error("matrix.GracefullyShoutDown.error", e); LoggerUtil.error("matrix.GracefullyShoutDown.error", e);
} }
try {
dubboUpdata.upData(result);
} catch (Exception e) {
LoggerUtil.error("matrix.GracefullyShoutDown update .error data:" + JSON.toJSONString(result), e);
}
} }
@Override @Override
......
package com.secoo.mall.dubbo.spring.boot.autoconfigure; package com.secoo.mall.dubbo.spring.boot.autoconfigure;
import com.secoo.mall.common.core.service.UpDatas;
import com.secoo.mall.dubbo.monitor.config.ConfigCenter;
import com.secoo.mall.dubbo.monitor.dubbo.service.ProviderService; import com.secoo.mall.dubbo.monitor.dubbo.service.ProviderService;
import com.secoo.mall.dubbo.monitor.dubbo.service.RegistryServerSync; import com.secoo.mall.dubbo.monitor.dubbo.service.RegistryServerSync;
import com.secoo.mall.dubbo.monitor.dubbo.service.impl.ProviderServiceImpl; import com.secoo.mall.dubbo.monitor.dubbo.service.impl.ProviderServiceImpl;
import com.secoo.mall.dubbo.service.DubboCustomerDownHock; import com.secoo.mall.dubbo.service.impl.DubboCustomerDownHock;
import com.secoo.mall.dubbo.service.ServletConnectShoutDownHock; import com.secoo.mall.dubbo.service.DubboUpdata;
import com.secoo.mall.dubbo.service.impl.ServletConnectShoutDownHock;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
@Configuration @Configuration
@EnableDubbo @EnableDubbo
public class MatrixGracefulShutDownAutoConfiguration { public class MatrixGracefulShutDownAutoConfiguration {
@Bean @Bean
public GracefullyShoutDown createGraceObject() { public GracefullyShoutDown createGraceObject() {
...@@ -38,6 +45,22 @@ public class MatrixGracefulShutDownAutoConfiguration { ...@@ -38,6 +45,22 @@ public class MatrixGracefulShutDownAutoConfiguration {
DubboCustomerDownHock createDubboConsumerDownHock() { DubboCustomerDownHock createDubboConsumerDownHock() {
return new DubboCustomerDownHock(); return new DubboCustomerDownHock();
} }
@Bean
ConfigCenter configCenter(){
return new ConfigCenter();
}
@Bean
@ConditionalOnBean(ConfigCenter.class)
@DependsOn("configCenter")
UpDatas dubboUpdata( ConfigCenter configCenter){
DubboUpdata transport= new DubboUpdata();
URL url =configCenter.formUrl(configCenter.registryAddress, configCenter.registryGroup, configCenter.username, configCenter.password);
URL newPath= url.setPath(configCenter.patch);
transport.setUrl(newPath);
return transport;
}
} }
\ No newline at end of file
package com.secoo.mall.dubbo.service;
import com.secoo.mall.common.core.service.AbstractStop;
import com.secoo.mall.common.util.log.LoggerUtil;
import com.secoo.mall.common.util.string.StringUtil;
import com.secoo.mall.dubbo.monitor.dubbo.service.ProviderService;
import com.secoo.mall.dubbo.monitor.utils.OSUtil;
import org.apache.dubbo.common.extension.ExtensionLoader;
import org.apache.dubbo.common.utils.NetUtils;
import org.apache.dubbo.registry.support.AbstractRegistryFactory;
import org.apache.dubbo.rpc.Protocol;
import org.apache.dubbo.rpc.model.ApplicationModel;
import org.springframework.beans.factory.annotation.Autowired;
import com.secoo.mall.dubbo.monitor.dubbo.model.domain.Provider;
import org.springframework.beans.factory.annotation.Value;
import java.util.Iterator;
import java.util.List;
public class DubboCustomerDownHock extends AbstractStop {
@Autowired
private final ProviderService providerService;
public DubboCustomerDownHock() {
providerService = null;
}
@Override
public StringBuilder stop() {
StringBuilder builderStr = new StringBuilder();
String lineSeparator = System.getProperty("line.separator", "\n");
try {
//step1 register销毁
AbstractRegistryFactory.destroyAll();
//TODO step2 写在阿波罗里,具体数据 以后根据客户端上报的数据配置,目前无详细依据。等待
Thread.sleep(10000);
String ip ="";
ip= NetUtils.getIpByHost(NetUtils.getLocalAddress().getHostName());
LoggerUtil.info("dubbo ip result---------->"+ip);
String name= ApplicationModel.getApplication();
LoggerUtil.info("application name:--------------->"+name);
List<Provider> serviceDTOS = providerService.getServiceDTOSByQuery("ip", ip, "");
if(StringUtil.isNoneEmpty(name)&&serviceDTOS!=null&&serviceDTOS.size()>0){
serviceDTOS=providerService.findProviderUrlByGivenApplication(name,serviceDTOS);
}
//step3 check检查
Iterator<Provider> iteratorCheck = serviceDTOS.iterator();
while (iteratorCheck.hasNext()) {
Provider obj = iteratorCheck.next();
List<String> check = providerService.findServicesByAddress(obj.getAddress());
if (check != null && check.size() > 0) {
builderStr.append("matrix-monitor off DubboService check service:" + obj.getUrl() + " already on line after off " + lineSeparator);
}
}
//step4 协议层销毁
destoryProtocol();
} catch (Exception e) {
builderStr.append("matirx-monitor offDubbo error:" +e.toString()+lineSeparator);
}
return builderStr;
}
public void destoryProtocol(){
ExtensionLoader<Protocol> loader = ExtensionLoader.getExtensionLoader(Protocol.class);
for (String protocolName : loader.getLoadedExtensions()) {
try {
Protocol protocol = loader.getLoadedExtension(protocolName);
if (protocol != null) {
protocol.destroy();
}
} catch (Throwable t) {
LoggerUtil.info(t.getMessage());
}
}
}
@Override
public Integer getHandleTypeOrder() {
return 2;
}
}
...@@ -7,7 +7,7 @@ import com.secoo.mall.dubbo.monitor.config.ConfigCenter; ...@@ -7,7 +7,7 @@ import com.secoo.mall.dubbo.monitor.config.ConfigCenter;
import com.secoo.mall.dubbo.monitor.dubbo.service.ProviderService; import com.secoo.mall.dubbo.monitor.dubbo.service.ProviderService;
import com.secoo.mall.dubbo.monitor.dubbo.service.RegistryServerSync; import com.secoo.mall.dubbo.monitor.dubbo.service.RegistryServerSync;
import com.secoo.mall.dubbo.monitor.dubbo.service.impl.ProviderServiceImpl; import com.secoo.mall.dubbo.monitor.dubbo.service.impl.ProviderServiceImpl;
import com.secoo.mall.dubbo.service.DubboCustomerDownHock;
import com.secoo.mall.dubbo.service.ServletConnectShoutDownHock; import com.secoo.mall.dubbo.service.ServletConnectShoutDownHock;
import com.secoo.mall.dubbo.swagger.annotations.EnableDubboSwagger; import com.secoo.mall.dubbo.swagger.annotations.EnableDubboSwagger;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
...@@ -51,28 +51,28 @@ public class MatrixDubboAutoConfiguration { ...@@ -51,28 +51,28 @@ public class MatrixDubboAutoConfiguration {
.description("更多内容请关注:http://apims.siku.cn") .description("更多内容请关注:http://apims.siku.cn")
.build(); .build();
} }
@Bean // @Bean
public GracefullyShoutDown createGraceObject(){ //// public GracefullyShoutDown createGraceObject(){
return new GracefullyShoutDown(); //// return new GracefullyShoutDown();
} //// }
////
@Bean //// @Bean
public RegistryServerSync createSynObject(){ //// public RegistryServerSync createSynObject(){
return new RegistryServerSync(); //// return new RegistryServerSync();
} //// }
@Bean //// @Bean
ProviderService createProviderService(){ //// ProviderService createProviderService(){
return new ProviderServiceImpl(); //// return new ProviderServiceImpl();
} //// }
////
@Bean //// @Bean
ServletConnectShoutDownHock createServletConnectShoutDownHock(){ //// ServletConnectShoutDownHock createServletConnectShoutDownHock(){
return new ServletConnectShoutDownHock(); //// return new ServletConnectShoutDownHock();
} //// }
@Bean //// @Bean
DubboCustomerDownHock createDubboConsumerDownHock(){ //// DubboCustomerDownHock createDubboConsumerDownHock(){
return new DubboCustomerDownHock(); //// return new DubboCustomerDownHock();
} //// }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment