com.vip.saturn.job.console.service.impl.RegistryCenterServiceImpl Maven / Gradle / Ivy
/**
* Copyright 1999-2015 dangdang.com.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.vip.saturn.job.console.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.vip.saturn.job.console.SaturnEnvProperties;
import com.vip.saturn.job.console.domain.NamespaceDomainInfo;
import com.vip.saturn.job.console.domain.RegistryCenterClient;
import com.vip.saturn.job.console.domain.RegistryCenterConfiguration;
import com.vip.saturn.job.console.domain.ZkCluster;
import com.vip.saturn.job.console.exception.SaturnJobConsoleException;
import com.vip.saturn.job.console.exception.SaturnJobConsoleHttpException;
import com.vip.saturn.job.console.mybatis.entity.NamespaceInfo;
import com.vip.saturn.job.console.mybatis.entity.NamespaceZkClusterMapping;
import com.vip.saturn.job.console.mybatis.entity.SystemConfig;
import com.vip.saturn.job.console.mybatis.entity.ZkClusterInfo;
import com.vip.saturn.job.console.mybatis.service.NamespaceInfoService;
import com.vip.saturn.job.console.mybatis.service.NamespaceZkClusterMapping4SqlService;
import com.vip.saturn.job.console.mybatis.service.ZkClusterInfoService;
import com.vip.saturn.job.console.repository.zookeeper.CuratorRepository;
import com.vip.saturn.job.console.service.RegistryCenterService;
import com.vip.saturn.job.console.service.SystemConfigService;
import com.vip.saturn.job.console.service.cache.DashboardLeaderHandler;
import com.vip.saturn.job.console.service.helper.SystemConfigProperties;
import com.vip.saturn.job.console.service.helper.ZkClusterMappingUtils;
import com.vip.saturn.job.console.utils.*;
import com.vip.saturn.job.integrate.service.ReportAlarmService;
import com.vip.saturn.job.integrate.service.UpdateJobConfigService;
import com.vip.saturn.job.sharding.NamespaceShardingManager;
import com.vip.saturn.job.sharding.listener.AbstractConnectionListener;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import org.apache.commons.lang3.StringUtils;
import org.apache.curator.framework.CuratorFramework;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import java.io.File;
import java.util.*;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class RegistryCenterServiceImpl implements RegistryCenterService {
protected static final String DEFAULT_CONSOLE_CLUSTER_ID = "default";
protected static final String NAMESPACE_CREATOR_NAME = "REST_API";
protected static final String ERR_MSG_TEMPLATE_FAIL_TO_CREATE = "Fail to create new namespace {%s} for reason {%s}";
protected static final String ERR_MSG_NS_NOT_FOUND = "The namespace does not exists.";
protected static final String ERR_MSG_NS_ALREADY_EXIST = "Invalid request. Namespace: {%s} already existed";
private static final Logger log = LoggerFactory.getLogger(RegistryCenterServiceImpl.class);
@Resource
private CuratorRepository curatorRepository;
@Resource
private ReportAlarmService reportAlarmService;
@Resource
private UpdateJobConfigService updateJobConfigService;
@Resource
private ZkClusterInfoService zkClusterInfoService;
@Resource
private SystemConfigService systemConfigService;
@Resource
private NamespaceZkClusterMapping4SqlService namespaceZkClusterMapping4SqlService;
@Resource
private NamespaceInfoService namespaceInfoService;
/**
* 为保证values有序
**/
private LinkedHashMap zkClusterMap = new LinkedHashMap<>();
private ConcurrentHashMap dashboardLeaderTreeCacheMap = new ConcurrentHashMap<>();
// namespace is unique in all zkClusters
private ConcurrentHashMap registryCenterClientMap = new ConcurrentHashMap<>();
private ConcurrentHashMap nnsLock = new ConcurrentHashMap<>(); // maybe could remove in right time
// namespace is unique in all zkClusters
private ConcurrentHashMap namespaceShardingListenerManagerMap = new ConcurrentHashMap<>();
private List allOnlineNamespaces = new ArrayList<>();
private String consoleClusterId;
private Set restrictComputeZkClusterKeys = Sets.newHashSet();
private Timer localRefreshTimer = null;
private Timer localRefreshIfNecessaryTimer = null;
private ExecutorService localRefreshThreadPool = null;
@PostConstruct
public void init() {
getConsoleClusterId();
localRefresh();
initLocalRefreshThreadPool();
startLocalRefreshTimer();
startLocalRefreshIfNecessaryTimer();
}
private void getConsoleClusterId() {
if (StringUtils.isBlank(SaturnEnvProperties.VIP_SATURN_CONSOLE_CLUSTER_ID)) {
log.info(
"No environment variable or system property of [VIP_SATURN_CONSOLE_CLUSTER] is set. Use the default Id");
consoleClusterId = DEFAULT_CONSOLE_CLUSTER_ID;
} else {
consoleClusterId = SaturnEnvProperties.VIP_SATURN_CONSOLE_CLUSTER_ID;
}
}
@PreDestroy
public void destroy() {
Iterator> iterator = zkClusterMap.entrySet().iterator();
while (iterator.hasNext()) {
closeZkCluster(iterator.next().getValue());
}
if (localRefreshTimer != null) {
localRefreshTimer.cancel();
}
if (localRefreshIfNecessaryTimer != null) {
localRefreshIfNecessaryTimer.cancel();
}
if (localRefreshThreadPool != null) {
localRefreshThreadPool.shutdownNow();
}
}
private void initLocalRefreshThreadPool() {
localRefreshThreadPool = Executors
.newSingleThreadExecutor(new ConsoleThreadFactory("refresh-RegCenter-thread", false));
}
private void startLocalRefreshTimer() {
localRefreshTimer = new Timer("refresh-RegCenter-timer", true);
// 每隔5分钟刷新一次
localRefreshTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
try {
localRefreshThreadPool.submit(new Runnable() {
@Override
public void run() {
try {
localRefresh();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
});
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}, 1000L * 60 * 5, 1000L * 60 * 5);
}
private void startLocalRefreshIfNecessaryTimer() {
localRefreshIfNecessaryTimer = new Timer("refresh-RegCenter-if-necessary-timer", true);
localRefreshIfNecessaryTimer.schedule(new TimerTask() {
private String lastUuid = null;
@Override
public void run() {
try {
String uuid = systemConfigService
.getValueDirectly(SystemConfigProperties.REFRESH_REGISTRY_CENTER_UUID);
if (StringUtils.isBlank(uuid)) {
notifyRefreshRegCenter();
} else if (!uuid.equals(lastUuid)) {
lastUuid = uuid;
localRefreshThreadPool.submit(new Runnable() {
@Override
public void run() {
try {
localRefresh();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
});
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}, 1000, 1000);
}
private synchronized void localRefresh() {
try {
log.info("Start refresh RegCenter");
long startTime = System.currentTimeMillis();
refreshRestrictComputeZkClusters();
if (restrictComputeZkClusterKeys.isEmpty()) {
log.warn("根据Console的集群ID:" + consoleClusterId + ",找不到配置可以参与Sharding和Dashboard计算的zk集群");
return;
}
refreshRegistryCenter();
refreshDashboardLeaderTreeCache();
refreshNamespaceShardingListenerManagerMap();
log.info("End refresh RegCenter, cost {}ms", System.currentTimeMillis() - startTime);
} catch (Exception e) {
log.error("refresh RegCenter error", e);
}
}
/**
* 解析Console集群和zk的映射关系 数据库中配置的例子如下: CONSOLE-1:/saturn,/forVdos;CONSOLE-2:/zk3; 如果不存在此配置项,则可以计算所有zk集群;
*/
private void refreshRestrictComputeZkClusters() throws SaturnJobConsoleException {
// clear 当前可计算的zkCluster集群列表
restrictComputeZkClusterKeys.clear();
String allMappingStr = systemConfigService.getValueDirectly(SystemConfigProperties.CONSOLE_ZK_CLUSTER_MAPPING);
if (StringUtils.isBlank(allMappingStr)) {
log.info(
"CONSOLE_ZK_CLUSTER_MAPPING is not configured in sys_config, so all zk clusters can be computed by this console");
restrictComputeZkClusterKeys.addAll(getZkClusterKeys());
return;
}
allMappingStr = StringUtils.deleteWhitespace(allMappingStr);
String[] singleConsoleMappingArray = allMappingStr.split(";");
for (String singleConsoleMappingStr : singleConsoleMappingArray) {
String[] consoleAndClusterKeyArray = singleConsoleMappingStr.split(":");
if (consoleAndClusterKeyArray.length != 2) {
throw new SaturnJobConsoleException(
"the CONSOLE_ZK_CLUSTER_MAPPING(" + Arrays.toString(consoleAndClusterKeyArray)
+ ") format is not correct, should be like console_cluster_id:zk_cluster_id");
}
String tempConsoleClusterId = consoleAndClusterKeyArray[0];
String zkClusterKeyStr = consoleAndClusterKeyArray[1];
if (consoleClusterId.equals(tempConsoleClusterId)) {
String[] zkClusterKeyArray = zkClusterKeyStr.trim().split(",");
restrictComputeZkClusterKeys.addAll(Arrays.asList(zkClusterKeyArray));
log.info("the current console cluster:{} can do sharding and dashboard to zk clusters:{}",
consoleClusterId, restrictComputeZkClusterKeys);
return;
}
}
}
/**
* 判断该集群是否能被本Console计算
*/
private boolean isZKClusterCanBeComputed(String clusterKey) {
if (CollectionUtils.isEmpty(restrictComputeZkClusterKeys)) {
return false;
}
return restrictComputeZkClusterKeys.contains(clusterKey);
}
/**
* 判断是否同机房
*/
private boolean isCurrentConsoleInTheSameIdc(String clusterKey) {
return ZkClusterMappingUtils.isCurrentConsoleInTheSameIdc(systemConfigService, clusterKey);
}
private String generateShardingLeadershipHostValue() {
return LocalHostService.cachedIpAddress + "-" + UUID.randomUUID().toString();
}
/**
* 创建或者移除namespaceShardingManager.
*/
private void refreshNamespaceShardingListenerManagerMap() {
Iterator> iterator = zkClusterMap.entrySet().iterator();
while (iterator.hasNext()) {
Entry next = iterator.next();
ZkCluster zkCluster = next.getValue();
ArrayList regCenterConfList = zkCluster.getRegCenterConfList();
if (regCenterConfList == null) {
continue;
}
for (RegistryCenterConfiguration conf : regCenterConfList) {
String nns = conf.getNameAndNamespace();
if (!namespaceShardingListenerManagerMap.containsKey(nns)) {
if (isZKClusterCanBeComputed(conf.getZkClusterKey())) {
createNamespaceShardingManager(conf, nns);
}
} else {
NamespaceShardingManager namespaceShardingManager = namespaceShardingListenerManagerMap.get(nns);
if (!isZKClusterCanBeComputed(conf.getZkClusterKey())) {
namespaceShardingManager.stopWithCurator();
namespaceShardingListenerManagerMap.remove(nns);
}
}
}
}
}
private void createNamespaceShardingManager(RegistryCenterConfiguration conf, String nns) {
try {
log.info("Start NamespaceShardingManager {}", nns);
String namespace = conf.getNamespace();
String digest = conf.getDigest();
CuratorFramework client = curatorRepository.connect(conf.getZkAddressList(), namespace, digest);
if (client == null) {
log.warn("fail to connect to zk during create NamespaceShardingManager");
return;
}
NamespaceShardingManager namespaceShardingManager = null;
try {
namespaceShardingManager = new NamespaceShardingManager(client, namespace,
generateShardingLeadershipHostValue(), reportAlarmService, updateJobConfigService);
namespaceShardingManager.start();
if (namespaceShardingListenerManagerMap.putIfAbsent(nns, namespaceShardingManager) != null) {
// 已经存在,则关闭当前的client
try {
namespaceShardingManager.stopWithCurator();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
} else {
log.info("Done starting NamespaceShardingManager {}", nns);
}
} catch (Exception e) {
log.error(e.getMessage(), e);
if (namespaceShardingManager != null) {
try {
namespaceShardingManager.stop();
} catch (Exception e2) {
log.error(e2.getMessage(), e2);
}
}
client.close();
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
private void refreshRegistryCenter() {
List allOnlineNamespacesTemp = new ArrayList<>();
// 获取新的zkClusters
Map newClusterMap = getZkClusterInfo();
// 对比旧的。不包含的,关闭操作;包含的,检查属性是否相同,如果相同,则直接赋值,否则,关闭旧的
closeInvalidZkClient(newClusterMap);
// 完善curatorFramework。如果没有,则新建
connectToZkClusterIfPossible(newClusterMap);
// 完善ZkCluster中的注册中心信息,关闭迁移了的域,新建迁移过来的域
for (Map.Entry zkClusterEntry : newClusterMap.entrySet()) {
ZkCluster zkCluster = zkClusterEntry.getValue();
String key = zkClusterEntry.getKey();
List nsZkClusterMappingList = namespaceZkClusterMapping4SqlService
.getAllMappingsOfCluster(key);
// zkCluster对应的namespace列表
List regCenterConfList = zkCluster.getRegCenterConfList();
closeMoveOutNamespace(key, nsZkClusterMappingList, regCenterConfList);
initOrUpdateNamespace(allOnlineNamespacesTemp, zkCluster, nsZkClusterMappingList, regCenterConfList);
}
// 直接赋值新的
zkClusterMap = (LinkedHashMap) newClusterMap;
log.info("new zkClusterMap is : {}", zkClusterMap);
allOnlineNamespaces = allOnlineNamespacesTemp;
}
private void initOrUpdateNamespace(List allOnlineNamespacesTemp, ZkCluster zkCluster,
List nsZkClusterMappingList,
List regCenterConfList) {
if (nsZkClusterMappingList == null || zkCluster.isOffline()) {
return;
}
CuratorRepository.CuratorFrameworkOp curatorFrameworkOp = zkCluster.getCuratorFrameworkOp();
ArrayList newRegCenterConfList = new ArrayList<>();
try {
for (NamespaceZkClusterMapping mapping : nsZkClusterMappingList) {
String namespace = mapping.getNamespace();
// 过滤$SaturnSelf
if (SaturnSelfNodePath.ROOT_NAME.equals(namespace)) {
continue;
}
// 如果这个标记为true,意味是新域,或者是迁移过来的域
boolean isNamespaceNotIncludeInOriginRegCenerConfList = false;
if (isNamespaceNotIncludeInRegCenterConfList(namespace, regCenterConfList)) {
// 对于新添加的域,需要初始化一些znode
initNamespaceZkNodeIfNecessary(namespace, curatorFrameworkOp);
isNamespaceNotIncludeInOriginRegCenerConfList = true;
}
try {
if (isNamespaceNotIncludeInOriginRegCenerConfList || isNewerVersionSaturnNamespace(namespace,
curatorFrameworkOp)) {
NamespaceInfo namespaceInfo = getNamespaceInfo(namespace);
if (namespaceInfo == null && !isNamespaceInfoNotFoundCanBeCalculate()) {
log.warn("No info about namespace {}, just skip it.", namespace);
continue;
}
RegistryCenterConfiguration conf = new RegistryCenterConfiguration(mapping.getName(), namespace,
zkCluster.getZkAddr());
conf.setZkClusterKey(zkCluster.getZkClusterKey());
conf.setVersion(getVersion(namespace, curatorFrameworkOp));
conf.setZkAlias(zkCluster.getZkAlias());
if (namespaceInfo != null) {
postConstructRegistryCenterConfiguration(conf, namespaceInfo.getContent());
}
newRegCenterConfList.add(conf);
if (!allOnlineNamespacesTemp.contains(namespace)) {
allOnlineNamespacesTemp.add(namespace);
}
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
// 如果nns有改变,则需要关闭旧的
if (regCenterConfList != null) {
for (RegistryCenterConfiguration conf : regCenterConfList) {
String namespace = conf.getNamespace();
String nns = conf.getNameAndNamespace();
for (RegistryCenterConfiguration confNew : newRegCenterConfList) {
String namespaceNew = confNew.getNamespace();
if (namespace.equals(namespaceNew)) {
String nnsNew = confNew.getNameAndNamespace();
if (!nns.equals(nnsNew)) {
synchronized (getNnsLock(nns)) {
closeNamespace(nns);
log.info("closed the namespace info because it's nns is changed, namespace is {}",
namespace);
}
}
break;
}
}
}
}
int oldSize = regCenterConfList != null ? regCenterConfList.size() : 0;
if (oldSize != newRegCenterConfList.size()) {
log.info("Zkcluster [{}] namespace size change from {} to {}", zkCluster.getZkClusterKey(), oldSize,
newRegCenterConfList.size());
}
zkCluster.setRegCenterConfList(newRegCenterConfList);
}
protected boolean isNamespaceInfoNotFoundCanBeCalculate() {
return true;
}
private boolean isNamespaceNotIncludeInRegCenterConfList(String namespace,
List regCenterConfList) {
if (regCenterConfList == null || regCenterConfList.isEmpty()) {
return true;
}
for (RegistryCenterConfiguration conf : regCenterConfList) {
if (namespace.equals(conf.getNamespace())) {
return false;
}
}
return true;
}
/**
* 确保namespace的作业版本>1.0.9
* @return true namespace里面的作业均在>1.0.9以后创建; false, 反之亦然
*/
private boolean isNewerVersionSaturnNamespace(String namespace,
CuratorRepository.CuratorFrameworkOp curatorFrameworkOp) {
try {
// check if /$Job exists
String jobsPath = "/" + namespace + JobNodePath.get$JobsNodePath();
if (curatorFrameworkOp.checkExists(jobsPath)) {
return true;
}
String executorsPath = "/" + namespace + ExecutorNodePath.getExecutorNodePath();
if (curatorFrameworkOp.checkExists(executorsPath)) {
List executors = curatorFrameworkOp.getChildren(executorsPath);
if (executors != null && !executors.isEmpty()) {
for (String exe : executors) {
String lastBeginTimePath = executorsPath + "/" + exe + "/lastBeginTime";
if (curatorFrameworkOp.checkExists(lastBeginTimePath)) {
return true;
}
}
}
}
return false;
} catch (Exception e) {
log.error(e.getMessage(), e);
return false;
}
}
protected NamespaceInfo getNamespaceInfo(String namespace) {
try {
return namespaceInfoService.selectByNamespace(namespace);
} catch (Exception e) {
log.error("fail to get namespaceInfo:{} from DB", namespace);
return null;
}
}
// For subclass override
protected void postConstructRegistryCenterConfiguration(RegistryCenterConfiguration conf, String content) {
// do nothing here
}
private void closeMoveOutNamespace(String zkClusterKey, List nsZkClusterMappingList,
List regCenterConfList) {
if (regCenterConfList == null) {
return;
}
Iterator regIter = regCenterConfList.iterator();
while (regIter.hasNext()) {
RegistryCenterConfiguration conf = regIter.next();
String namespace = conf.getNamespace();
String nns = conf.getNameAndNamespace();
boolean include = false;
if (nsZkClusterMappingList != null) {
for (NamespaceZkClusterMapping mapping : nsZkClusterMappingList) {
if (namespace.equals(mapping.getNamespace())) {
include = true;
break;
}
}
}
if (!include) {
synchronized (getNnsLock(nns)) {
regIter.remove();
closeNamespace(nns);
log.info("closed the moved namespace info, namespace is {}, old zkClusterKey is {}", namespace,
zkClusterKey);
}
}
}
}
private void closeInvalidZkClient(Map newClusterMap) {
Iterator> iterator = zkClusterMap.entrySet().iterator();
while (iterator.hasNext()) {
Entry next = iterator.next();
String zkClusterKey = next.getKey();
ZkCluster zkCluster = next.getValue();
if (!newClusterMap.containsKey(zkClusterKey)) {
iterator.remove();
closeZkCluster(zkCluster);
} else {
ZkCluster newZkCluster = newClusterMap.get(zkClusterKey);
if (zkCluster.equals(newZkCluster)) {
newClusterMap.put(zkClusterKey, zkCluster);
} else if (zkCluster.equalsNoNeedReconnect(newZkCluster)){
zkCluster.setDescription(newZkCluster.getDescription());
newClusterMap.put(zkClusterKey, zkCluster);
} else {
iterator.remove();
closeZkCluster(zkCluster);
}
}
}
}
private Map getZkClusterInfo() {
LinkedHashMap newClusterMap = new LinkedHashMap<>();
List allZkClusterInfoList = zkClusterInfoService.getAllZkClusterInfo();
if (allZkClusterInfoList != null) {
for (ZkClusterInfo zkClusterInfo : allZkClusterInfoList) {
ZkCluster zkCluster = new ZkCluster();
zkCluster.setZkClusterKey(zkClusterInfo.getZkClusterKey());
zkCluster.setZkAlias(zkClusterInfo.getAlias());
zkCluster.setZkAddr(zkClusterInfo.getConnectString());
zkCluster.setDescription(zkClusterInfo.getDescription());
newClusterMap.put(zkClusterInfo.getZkClusterKey(), zkCluster);
}
}
return newClusterMap;
}
private void connectToZkClusterIfPossible(Map newClusterMap) {
Iterator> iterator = newClusterMap.entrySet().iterator();
while (iterator.hasNext()) {
Entry next = iterator.next();
ZkCluster zkCluster = next.getValue();
CuratorRepository.CuratorFrameworkOp curatorFrameworkOp = zkCluster.getCuratorFrameworkOp();
if (curatorFrameworkOp == null) {
createNewConnect(zkCluster);
if (!zkCluster.isOffline()) {
updateExecutorConfigToZkIfNecessary(zkCluster);
}
}
}
}
private Object getNnsLock(String nns) {
Object lock = nnsLock.get(nns);
if (lock == null) {
lock = new Object();
Object pre = nnsLock.putIfAbsent(nns, lock);
if (pre != null) {
lock = pre;
}
}
return lock;
}
private void closeNamespace(String nns) {
try {
RegistryCenterClient registryCenterClient = registryCenterClientMap.remove(nns);
if (registryCenterClient != null) {
registryCenterClient.close();
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
try {
NamespaceShardingManager namespaceShardingManager = namespaceShardingListenerManagerMap.remove(nns);
if (namespaceShardingManager != null) {
namespaceShardingManager.stopWithCurator();
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
private void refreshDashboardLeaderTreeCache() {
closeDeprecatedDashboardLeaderTreeCache();
Iterator> iterator = zkClusterMap.entrySet().iterator();
while (iterator.hasNext()) {
Entry next = iterator.next();
String zkClusterKey = next.getKey();
ZkCluster zkCluster = next.getValue();
if (needToRefreshDashboardTreeCache(zkCluster, zkClusterKey)) {
DashboardLeaderHandler dashboardLeaderHandler = null;
try {
dashboardLeaderHandler = new DashboardLeaderHandler(zkCluster.getZkAlias(),
zkCluster.getCuratorFrameworkOp().getCuratorFramework());
dashboardLeaderHandler.start();
dashboardLeaderTreeCacheMap.put(zkClusterKey, dashboardLeaderHandler);
} catch (Exception e) {
log.error(e.getMessage(), e);
if (dashboardLeaderHandler != null) {
dashboardLeaderHandler.shutdown();
}
}
}
}
}
private boolean needToRefreshDashboardTreeCache(ZkCluster zkCluster, String zkClusterKey) {
if (zkCluster.isOffline()) {
return false;
}
if (dashboardLeaderTreeCacheMap.containsKey(zkClusterKey)) {
return false;
}
return isZKClusterCanBeComputed(zkClusterKey) && isCurrentConsoleInTheSameIdc(zkClusterKey);
}
/**
* 将不在本console服务器中进行Dashboard计算的DashboardLeaderTreeCache关闭
*/
private void closeDeprecatedDashboardLeaderTreeCache() {
if (dashboardLeaderTreeCacheMap == null || dashboardLeaderTreeCacheMap.isEmpty()) {
return;
}
for (String zkClusterKey : dashboardLeaderTreeCacheMap.keySet()) {
if (!isZKClusterCanBeComputed(zkClusterKey) || !isCurrentConsoleInTheSameIdc(zkClusterKey)) {
log.info("close the deprecated dashboard leader tree Cache, {}", zkClusterKey);
DashboardLeaderHandler oldDashboardLeaderHandler = dashboardLeaderTreeCacheMap.remove(zkClusterKey);
if (oldDashboardLeaderHandler != null) {
oldDashboardLeaderHandler.shutdown();
}
}
}
}
/**
* Close dashboardLeaderTreeCache, registryCenterClient, namespaceShardingListenerManager with this zkCluster
*/
private void closeZkCluster(ZkCluster zkCluster) {
try {
try {
DashboardLeaderHandler dashboardLeaderHandler = dashboardLeaderTreeCacheMap
.remove(zkCluster.getZkClusterKey());
if (dashboardLeaderHandler != null) {
dashboardLeaderHandler.shutdown();
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
ArrayList regCenterConfList = zkCluster.getRegCenterConfList();
if (regCenterConfList != null) {
for (RegistryCenterConfiguration conf : regCenterConfList) {
String nns = conf.getNameAndNamespace();
synchronized (getNnsLock(nns)) {
closeNamespace(nns);
}
}
}
if (zkCluster.getConnectionListener() != null) {
zkCluster.getConnectionListener().shutdownNowUntilTerminated();
zkCluster.setConnectionListener(null);
}
if (zkCluster.getCuratorFrameworkOp() != null
&& zkCluster.getCuratorFrameworkOp().getCuratorFramework() != null) {
zkCluster.getCuratorFrameworkOp().getCuratorFramework().close();
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
private void createNewConnect(final ZkCluster zkCluster) {
String zkAddr = zkCluster.getZkAddr();
try {
final CuratorFramework curatorFramework = curatorRepository.connect(zkAddr, null, zkCluster.getDigest());
if (curatorFramework == null) {
log.error("found an offline zkCluster, zkAddr is {}", zkAddr);
zkCluster.setCuratorFrameworkOp(null);
zkCluster.setConnectionListener(null);
zkCluster.setOffline(true);
} else {
AbstractConnectionListener connectionListener = new AbstractConnectionListener(
"zk-connectionListener-thread-for-zkCluster-" + zkCluster.getZkAlias()) {
@Override
public void stop() {
zkCluster.setOffline(true);
}
@Override
public void restart() {
try {
zkCluster.setOffline(false);
updateExecutorConfigToZkIfNecessary(zkCluster);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
};
zkCluster.setCuratorFrameworkOp(curatorRepository.newCuratorFrameworkOp(curatorFramework));
zkCluster.setConnectionListener(connectionListener);
zkCluster.setOffline(false);
curatorFramework.getConnectionStateListenable().addListener(connectionListener);
}
} catch (Exception e) {
log.error("found an offline zkCluster, zkAddr is {}", zkAddr);
log.error(e.getMessage(), e);
zkCluster.setCuratorFrameworkOp(null);
zkCluster.setConnectionListener(null);
zkCluster.setOffline(true);
}
}
private void updateExecutorConfigToZkIfNecessary(ZkCluster zkCluster) {
try {
CuratorRepository.CuratorFrameworkOp curatorFrameworkOp = zkCluster.getCuratorFrameworkOp();
String dbData = systemConfigService.getValueDirectly(SystemConfigProperties.EXECUTOR_CONFIGS);
// 反序列化为JSON对象,来验证数据的正确性
JSONObject jsonObject = parseExecutorConfigJson(dbData);
String configStr = jsonObject.toJSONString();
// 对比数据,如果不相等,则更新
String data = curatorFrameworkOp.getData(SaturnSelfNodePath.SATURN_EXECUTOR_CONFIG);
if (configStr.equals(data)) {
return;
}
curatorFrameworkOp.update(SaturnSelfNodePath.SATURN_EXECUTOR_CONFIG, configStr);
} catch (Exception e) {
log.error(String.format("update %s executor config error", zkCluster.getZkClusterKey()), e);
}
}
private JSONObject parseExecutorConfigJson(String jsonStr) {
if (StringUtils.isBlank(jsonStr)) {
return new JSONObject();
}
try {
return JSON.parseObject(jsonStr.trim());
} catch (Throwable t) {
log.error("Fail to parse data from json string" + jsonStr, t);
return new JSONObject();
}
}
protected void initNamespaceZkNodeIfNecessary(String namespace,
CuratorRepository.CuratorFrameworkOp curatorFrameworkOp) {
try {
String executorsNodePath = "/" + namespace + ExecutorNodePath.get$ExecutorNodePath();
if (!curatorFrameworkOp.checkExists(executorsNodePath)) {
curatorFrameworkOp.create(executorsNodePath);
}
String jobsNodePath = "/" + namespace + JobNodePath.get$JobsNodePath();
if (!curatorFrameworkOp.checkExists(jobsNodePath)) {
curatorFrameworkOp.create(jobsNodePath);
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
private String getVersion(String namespace, CuratorRepository.CuratorFrameworkOp curatorFrameworkOp) {
try {
List versionList = new ArrayList<>();
String executorsPath = "/" + namespace + ExecutorNodePath.getExecutorNodePath();
if (!curatorFrameworkOp.checkExists(executorsPath)) {
return getVersionStrFromList(versionList);
}
List executors = curatorFrameworkOp.getChildren(executorsPath);
if (executors == null || executors.isEmpty()) {
return getVersionStrFromList(versionList);
}
for (String exe : executors) {
String versionPath = executorsPath + "/" + exe + "/version";
if (!curatorFrameworkOp.checkExists(versionPath)) {
continue;
}
String version = curatorFrameworkOp.getData(versionPath);
if (StringUtils.isBlank(version)) {
continue;
}
String tmp = version.trim();
if (!versionList.contains(tmp)) {
versionList.add(tmp);
}
}
return getVersionStrFromList(versionList);
} catch (Exception e) {
log.error(e.getMessage(), e);
return "";
}
}
private String getVersionStrFromList(List versionList) {
Collections.sort(versionList);
StringBuilder versionSb = new StringBuilder();
versionSb.append("");
for (int i = 0; i < versionList.size(); i++) {
versionSb.append(versionList.get(i));
if (i < versionList.size() - 1) {
versionSb.append(", ");
}
}
return versionSb.toString();
}
@Override
public RegistryCenterClient connect(final String nameAndNameSpace) {
final RegistryCenterClient registryCenterClient = new RegistryCenterClient();
registryCenterClient.setNameAndNamespace(nameAndNameSpace);
if (nameAndNameSpace == null) {
return registryCenterClient;
}
synchronized (getNnsLock(nameAndNameSpace)) {
if (!registryCenterClientMap.containsKey(nameAndNameSpace)) {
RegistryCenterConfiguration registryCenterConfiguration = findConfig(nameAndNameSpace);
if (registryCenterConfiguration == null) {
return registryCenterClient;
}
String zkAddressList = registryCenterConfiguration.getZkAddressList();
String namespace = registryCenterConfiguration.getNamespace();
String digest = registryCenterConfiguration.getDigest();
registryCenterClient.setZkAddr(zkAddressList);
CuratorFramework client = curatorRepository.connect(zkAddressList, namespace, digest);
if (client == null) {
return registryCenterClient;
}
registryCenterClient.setConnected(client.getZookeeperClient().isConnected());
registryCenterClient.setCuratorClient(client);
registryCenterClientMap.put(nameAndNameSpace, registryCenterClient);
return registryCenterClient;
} else {
RegistryCenterClient registryCenterClient2 = registryCenterClientMap.get(nameAndNameSpace);
if (registryCenterClient2 != null) {
if (registryCenterClient2.getCuratorClient() != null) {
registryCenterClient2.setConnected(
registryCenterClient2.getCuratorClient().getZookeeperClient().isConnected());
} else {
registryCenterClient2.setConnected(false);
}
return registryCenterClient2;
}
return registryCenterClient;
}
}
}
@Override
public RegistryCenterClient connectByNamespace(String namespace) {
RegistryCenterConfiguration registryCenterConfiguration = findConfigByNamespace(namespace);
if (registryCenterConfiguration == null) {
return new RegistryCenterClient();
}
String nns = registryCenterConfiguration.getNameAndNamespace();
if (nns == null) {
return new RegistryCenterClient();
}
String zkAddressList = registryCenterConfiguration.getZkAddressList();
String digest = registryCenterConfiguration.getDigest();
synchronized (getNnsLock(nns)) {
if (!registryCenterClientMap.containsKey(nns)) {
final RegistryCenterClient registryCenterClient = new RegistryCenterClient();
registryCenterClient.setNameAndNamespace(nns);
registryCenterClient.setZkAddr(zkAddressList);
CuratorFramework client = curatorRepository.connect(zkAddressList, namespace, digest);
if (client == null) {
return registryCenterClient;
}
registryCenterClient.setConnected(client.getZookeeperClient().isConnected());
registryCenterClient.setCuratorClient(client);
registryCenterClientMap.put(nns, registryCenterClient);
return registryCenterClient;
} else {
RegistryCenterClient registryCenterClient = registryCenterClientMap.get(nns);
if (registryCenterClient == null) {
registryCenterClient = new RegistryCenterClient();
registryCenterClient.setNameAndNamespace(namespace);
registryCenterClient.setZkAddr(zkAddressList);
} else {
if (registryCenterClient.getCuratorClient() != null) {
registryCenterClient.setConnected(
registryCenterClient.getCuratorClient().getZookeeperClient().isConnected());
} else {
registryCenterClient.setConnected(false);
}
}
return registryCenterClient;
}
}
}
@Override
public RegistryCenterConfiguration findConfig(String nameAndNamespace) {
if (Strings.isNullOrEmpty(nameAndNamespace)) {
return null;
}
Collection zkClusters = zkClusterMap.values();
for (ZkCluster zkCluster : zkClusters) {
for (RegistryCenterConfiguration each : zkCluster.getRegCenterConfList()) {
if (each != null && nameAndNamespace.equals(each.getNameAndNamespace())) {
return each;
}
}
}
return null;
}
@Override
public RegistryCenterConfiguration findConfigByNamespace(String namespace) {
if (Strings.isNullOrEmpty(namespace)) {
return null;
}
Collection zkClusters = zkClusterMap.values();
for (ZkCluster zkCluster : zkClusters) {
for (RegistryCenterConfiguration each : zkCluster.getRegCenterConfList()) {
if (each != null && namespace.equals(each.getNamespace())) {
return each;
}
}
}
return null;
}
@Override
public List findConfigsByZkCluster(ZkCluster zkCluster) {
List namespaces = namespaceZkClusterMapping4SqlService
.getAllNamespacesOfCluster(zkCluster.getZkClusterKey());
if (namespaces == null || namespaces.isEmpty()) {
return Lists.newArrayList();
}
List configs = Lists.newArrayList();
for (String namespace : namespaces) {
RegistryCenterConfiguration config = constructRegistryCenterConfiguration(zkCluster, namespace);
configs.add(config);
}
return configs;
}
protected RegistryCenterConfiguration constructRegistryCenterConfiguration(ZkCluster zkCluster, String namespace) {
RegistryCenterConfiguration config = new RegistryCenterConfiguration("", namespace, zkCluster.getZkAddr());
config.setZkClusterKey(zkCluster.getZkClusterKey());
config.setZkAlias(zkCluster.getZkAlias());
return config;
}
@Override
public CuratorRepository.CuratorFrameworkOp connectOnly(String zkAddr, String namespace)
throws SaturnJobConsoleException {
CuratorFramework curatorFramework = curatorRepository.connect(zkAddr, namespace, null);
if (curatorFramework != null) {
return curatorRepository.newCuratorFrameworkOp(curatorFramework);
}
return null;
}
@Override
public void notifyRefreshRegCenter() throws SaturnJobConsoleException {
SystemConfig systemConfig = new SystemConfig();
systemConfig.setProperty(SystemConfigProperties.REFRESH_REGISTRY_CENTER_UUID);
systemConfig.setValue(UUID.randomUUID().toString());
systemConfigService.insertOrUpdate(systemConfig);
}
@Override
public RegistryCenterClient getCuratorByNameAndNamespace(String nameAndNamespace) {
return registryCenterClientMap.get(nameAndNamespace);
}
@Override
public boolean isDashboardLeader(String zkClusterKey) {
DashboardLeaderHandler dashboardLeaderHandler = dashboardLeaderTreeCacheMap.get(zkClusterKey);
if (dashboardLeaderHandler != null) {
return dashboardLeaderHandler.isLeader();
}
return false;
}
@Override
public ZkCluster getZkCluster(String zkClusterKey) {
return zkClusterMap.get(zkClusterKey);
}
@Transactional(rollbackFor = Exception.class)
@Override
public void createZkCluster(String zkClusterKey, String alias, String connectString, String description)
throws SaturnJobConsoleException {
ZkClusterInfo zkClusterInfo = zkClusterInfoService.getByClusterKey(zkClusterKey);
if (zkClusterInfo != null) {
throw new SaturnJobConsoleException(SaturnJobConsoleException.ERROR_CODE_BAD_REQUEST,
String.format("ZK cluster[%s]已经存在", zkClusterKey));
}
zkClusterInfoService.createZkCluster(zkClusterKey, alias, connectString, description, "");
notifyRefreshRegCenter();
}
@Transactional(rollbackFor = Exception.class)
@Override
public void updateZkCluster(String zkClusterKey, String connectString, String description)
throws SaturnJobConsoleException {
ZkClusterInfo zkClusterInfo = zkClusterInfoService.getByClusterKey(zkClusterKey);
if (zkClusterInfo == null) {
throw new SaturnJobConsoleException(SaturnJobConsoleException.ERROR_CODE_NOT_EXISTED,
String.format("ZK cluster[%s]不存在", zkClusterKey));
}
// cannot change alias but connectString and description
zkClusterInfo.setConnectString(connectString);
zkClusterInfo.setDescription(description);
zkClusterInfo.setLastUpdateTime(new Date());
zkClusterInfoService.updateZkCluster(zkClusterInfo);
notifyRefreshRegCenter();
}
@Override
public Collection getZkClusterList() {
return zkClusterMap.values();
}
@Override
public List getOnlineZkClusterList() {
List onlineClusters = Lists.newArrayList();
for (ZkCluster zkCluster : zkClusterMap.values()) {
if (!zkCluster.isOffline()) {
onlineClusters.add(zkCluster);
}
}
return onlineClusters;
}
private List getZkClusterKeys() {
Collection zkClusters = getZkClusterList();
List zkClusterKeys = Lists.newArrayList();
for (ZkCluster zkCluster : zkClusters) {
zkClusterKeys.add(zkCluster.getZkClusterKey());
}
return zkClusterKeys;
}
@Override
public int domainCount(String zkClusterKey) {
ZkCluster zkCluster = zkClusterMap.get(zkClusterKey);
if (zkCluster != null) {
ArrayList regList = zkCluster.getRegCenterConfList();
if (regList != null) {
return regList.size();
}
}
return 0;
}
@Override
public boolean namespaceIsCorrect(String namespace, CuratorFramework curatorFramework)
throws SaturnJobConsoleException {
if (SaturnSelfNodePath.ROOT_NAME.equals(namespace)) {
return false;
}
try {
String executorsPath = "/" + namespace + ExecutorNodePath.getExecutorNodePath();
if (curatorFramework.checkExists().forPath(executorsPath) != null) {
return true;
}
String jobsPath = "/" + namespace + JobNodePath.get$JobsNodePath();
return curatorFramework.checkExists().forPath(jobsPath) != null ? true : false;
} catch (Exception e) {
log.error(e.getMessage(), e);
return false;
}
}
@Override
public List getNamespaces() throws SaturnJobConsoleException {
return allOnlineNamespaces;
}
@Override
public File exportNamespaceInfo(List namespaceList) throws SaturnJobConsoleException {
Set targetNamespaceSet = null;
if (namespaceList != null) {
targetNamespaceSet = Sets.newHashSet(namespaceList);
}
List namespaceInfoList = Lists.newLinkedList();
Collection zkClusterList = getZkClusterList();
for (ZkCluster zkCluster : zkClusterList) {
List namespacesOfZkCluster = zkCluster.getRegCenterConfList();
for (RegistryCenterConfiguration ns : namespacesOfZkCluster) {
if (targetNamespaceSet == null || targetNamespaceSet.contains(ns.getNamespace())) {
namespaceInfoList.add(ns);
}
}
}
return exportNamespaceInfo2Excel(namespaceInfoList);
}
/**
* Export namespac
*/
File exportNamespaceInfo2Excel(List namespaceInfoList)
throws SaturnJobConsoleException {
try {
File tmpFile = SaturnConsoleUtils.createTmpFile();
WritableWorkbook writableWorkbook = Workbook.createWorkbook(tmpFile);
WritableSheet sheet1 = writableWorkbook.createSheet("ns", 0);
sheet1.addCell(new Label(0, 0, "域名"));
sheet1.addCell(new Label(1, 0, "描述"));
sheet1.addCell(new Label(2, 0, "重要等级"));
sheet1.addCell(new Label(3, 0, "Executor版本"));
sheet1.addCell(new Label(4, 0, "ZK集群"));
for (int i = 0; i < namespaceInfoList.size(); i++) {
RegistryCenterConfiguration namespaceInfo = namespaceInfoList.get(i);
sheet1.addCell(new Label(0, i + 1, namespaceInfo.getNamespace()));
sheet1.addCell(new Label(1, i + 1, namespaceInfo.getName()));
sheet1.addCell(new Label(2, i + 1, namespaceInfo.getDegree()));
sheet1.addCell(new Label(3, i + 1, namespaceInfo.getVersion()));
sheet1.addCell(new Label(4, i + 1, namespaceInfo.getZkAlias()));
}
writableWorkbook.write();
writableWorkbook.close();
return tmpFile;
} catch (Exception e) {
throw new SaturnJobConsoleException(e);
}
}
@Transactional(rollbackFor = {Exception.class})
@Override
public void createNamespace(NamespaceDomainInfo namespaceDomainInfo) throws SaturnJobConsoleException {
String namespace = namespaceDomainInfo.getNamespace();
String zkClusterKey = namespaceDomainInfo.getZkCluster();
ZkCluster currentCluster = getZkCluster(zkClusterKey);
if (currentCluster == null) {
throw new SaturnJobConsoleHttpException(HttpStatus.BAD_REQUEST.value(),
String.format(ERR_MSG_TEMPLATE_FAIL_TO_CREATE, namespace, "not found zkcluster" + zkClusterKey));
}
if (checkNamespaceExists(namespace)) {
throw new SaturnJobConsoleHttpException(HttpStatus.BAD_REQUEST.value(),
String.format(ERR_MSG_NS_ALREADY_EXIST, namespace));
}
try {
// 创建 namespaceInfo
NamespaceInfo namespaceInfo = constructNamespaceInfo(namespaceDomainInfo);
namespaceInfoService.create(namespaceInfo);
// 创建 zkcluster 和 namespaceInfo 关系
namespaceZkClusterMapping4SqlService.insert(namespace, "", zkClusterKey, NAMESPACE_CREATOR_NAME);
// refresh
notifyRefreshRegCenter();
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new SaturnJobConsoleHttpException(HttpStatus.INTERNAL_SERVER_ERROR.value(),
String.format(ERR_MSG_TEMPLATE_FAIL_TO_CREATE, namespace, e.getMessage()));
}
}
@Override
public void updateNamespace(NamespaceDomainInfo namespaceDomainInfo) throws SaturnJobConsoleException {
String namespace = namespaceDomainInfo.getNamespace();
if (!checkNamespaceExists(namespace)) {
throw new SaturnJobConsoleHttpException(HttpStatus.BAD_REQUEST.value(), ERR_MSG_NS_NOT_FOUND);
}
try {
// 创建 namespaceInfo
NamespaceInfo namespaceInfo = constructNamespaceInfo(namespaceDomainInfo);
namespaceInfoService.update(namespaceInfo);
// refresh
notifyRefreshRegCenter();
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new SaturnJobConsoleHttpException(HttpStatus.INTERNAL_SERVER_ERROR.value(),
String.format(ERR_MSG_TEMPLATE_FAIL_TO_CREATE, namespace, e.getMessage()));
}
}
@Override
public NamespaceDomainInfo getNamespace(String namespace) throws SaturnJobConsoleException {
if (namespaceInfoService.selectByNamespace(namespace) == null) {
throw new SaturnJobConsoleHttpException(HttpStatus.NOT_FOUND.value(), ERR_MSG_NS_NOT_FOUND);
}
String zkClusterKey = namespaceZkClusterMapping4SqlService.getZkClusterKey(namespace);
if (StringUtils.isBlank(zkClusterKey)) {
throw new SaturnJobConsoleHttpException(HttpStatus.NOT_FOUND.value(), ERR_MSG_NS_NOT_FOUND);
}
NamespaceDomainInfo namespaceDomainInfo = new NamespaceDomainInfo();
namespaceDomainInfo.setNamespace(namespace);
namespaceDomainInfo.setZkCluster(zkClusterKey);
return namespaceDomainInfo;
}
@Transactional(rollbackFor = {Exception.class})
@Override
public void bindNamespaceAndZkCluster(String namespace, String zkClusterKey, String updatedBy)
throws SaturnJobConsoleException {
ZkCluster currentCluster = getZkCluster(zkClusterKey);
if (currentCluster == null) {
throw new SaturnJobConsoleHttpException(HttpStatus.BAD_REQUEST.value(),
String.format(ERR_MSG_TEMPLATE_FAIL_TO_CREATE, namespace, "not found zkcluster" + zkClusterKey));
}
// namespace必须要存在
if (!checkNamespaceExists(namespace)) {
throw new SaturnJobConsoleHttpException(HttpStatus.BAD_REQUEST.value(), ERR_MSG_NS_NOT_FOUND);
}
// 判断其它集群是否有该域
String zkClusterKeyOther = namespaceZkClusterMapping4SqlService.getZkClusterKey(namespace);
if (zkClusterKeyOther != null) {
ZkCluster zkClusterOther = getZkCluster(zkClusterKeyOther);
if (zkClusterOther == null) {
throw new SaturnJobConsoleException("zk cluster 不存在:" + zkClusterKeyOther);
}
if (zkClusterOther.getZkClusterKey().equals(zkClusterKey)) {
throw new SaturnJobConsoleException("Namespace已经存在于此zk集群,不能重复添加");
} else {
throw new SaturnJobConsoleException(
"Namespace存在于另外的zk集群:" + zkClusterOther.getZkClusterKey() + ",不能重复添加");
}
}
try {
namespaceZkClusterMapping4SqlService.insert(namespace, "", zkClusterKey, updatedBy);
postBindNamespaceAndZkCluster(namespace, currentCluster);
// refresh
notifyRefreshRegCenter();
} catch (Exception e) {
namespaceZkClusterMapping4SqlService.remove(namespace, updatedBy);
throw new SaturnJobConsoleException(e.getMessage());
}
}
protected void postBindNamespaceAndZkCluster(String namespace, ZkCluster currentCluster)
throws SaturnJobConsoleException {
// for subclass implement
}
private boolean checkNamespaceExists(String namespace) {
if (namespaceInfoService.selectByNamespace(namespace) != null) {
return true;
}
// 判断其它集群是否有该域
String zkClusterKeyOther = namespaceZkClusterMapping4SqlService.getZkClusterKey(namespace);
return zkClusterKeyOther != null ? true : false;
}
private NamespaceInfo constructNamespaceInfo(NamespaceDomainInfo namespaceDomainInfo) {
NamespaceInfo namespaceInfo = new NamespaceInfo();
namespaceInfo.setCreatedBy(NAMESPACE_CREATOR_NAME);
namespaceInfo.setCreateTime(new Date());
namespaceInfo.setIsDeleted(0);
namespaceInfo.setLastUpdatedBy(NAMESPACE_CREATOR_NAME);
namespaceInfo.setLastUpdateTime(new Date());
namespaceInfo.setNamespace(namespaceDomainInfo.getNamespace());
namespaceInfo.setContent(namespaceDomainInfo.getContent());
namespaceInfo.setBusId("");
return namespaceInfo;
}
@Override
public CuratorRepository.CuratorFrameworkOp getCuratorFrameworkOp(String namespace)
throws SaturnJobConsoleException {
CuratorRepository.CuratorFrameworkOp curatorFrameworkOp = null;
try {
RegistryCenterConfiguration registryCenterConfiguration = findConfigByNamespace(namespace);
if (registryCenterConfiguration == null) {
throw new SaturnJobConsoleException("find registryCenterConfiguration failed");
}
String nns = registryCenterConfiguration.getNameAndNamespace();
if (nns == null) {
throw new SaturnJobConsoleException("get name and namespace failed");
}
String zkAddressList = registryCenterConfiguration.getZkAddressList();
String digest = registryCenterConfiguration.getDigest();
synchronized (getNnsLock(nns)) {
if (!registryCenterClientMap.containsKey(nns)) {
final RegistryCenterClient registryCenterClient = new RegistryCenterClient();
registryCenterClient.setNameAndNamespace(nns);
registryCenterClient.setZkAddr(zkAddressList);
CuratorFramework curatorFramework = curatorRepository.connect(zkAddressList, namespace, digest);
if (curatorFramework != null) {
registryCenterClient.setConnected(curatorFramework.getZookeeperClient().isConnected());
registryCenterClient.setCuratorClient(curatorFramework);
registryCenterClientMap.put(nns, registryCenterClient);
curatorFrameworkOp = curatorRepository.newCuratorFrameworkOp(curatorFramework);
}
} else {
RegistryCenterClient registryCenterClient = registryCenterClientMap.get(nns);
if (registryCenterClient != null) {
CuratorFramework curatorFramework = registryCenterClient.getCuratorClient();
if (curatorFramework != null) {
registryCenterClient.setConnected(curatorFramework.getZookeeperClient().isConnected());
curatorFrameworkOp = curatorRepository.newCuratorFrameworkOp(curatorFramework);
}
}
}
}
} catch (SaturnJobConsoleException e) {
throw e;
} catch (Exception e) {
throw new SaturnJobConsoleException(e);
}
if (curatorFrameworkOp == null) {
throw new SaturnJobConsoleException("Connect zookeeper failed");
}
return curatorFrameworkOp;
}
@Override
public synchronized void refreshRegistryCenterForNamespace(String zkClusterName, String namespace) {
ZkCluster targetZkCluster;
Map zkClusterMap;
zkClusterMap = getTargetZkCluster(zkClusterName);
updateRegistryCenterConfiguration(namespace, zkClusterMap.get(zkClusterName).getZkAddr(), zkClusterName);
closeInvalidZkClient(zkClusterMap);
connectToZkClusterIfPossible(zkClusterMap);
targetZkCluster = zkClusterMap.get(zkClusterName);
if (targetZkCluster != null) {
List allOnlineNamespacesTemp = new ArrayList<>();
List filteredList = getTargetNamespaceZkClusterMapping(zkClusterName, namespace);
initOrUpdateNamespace(allOnlineNamespacesTemp, targetZkCluster, filteredList,
targetZkCluster.getRegCenterConfList());
updateAllOnlineNamespaces(namespace);
}
log.info("refreshRegistryCenterForNamespace done : {}, {}", zkClusterName, namespace);
}
@Transactional(rollbackFor = Exception.class)
@Override
public void deleteZkCluster(String zkClusterKey) throws SaturnJobConsoleException {
if (getZkCluster(zkClusterKey) == null) {
throw new SaturnJobConsoleException("fail to delete.for ZkCluster does not exist");
}
if (domainCount(zkClusterKey) > 0) {
throw new SaturnJobConsoleException("fail to delete.for ZkCluster still has domains");
}
if (!CollectionUtils.isEmpty(namespaceZkClusterMapping4SqlService.getAllNamespacesOfCluster(zkClusterKey))) {
throw new SaturnJobConsoleException("fail to delete.for ZkCluster still has domains");
}
zkClusterInfoService.deleteZkCluster(zkClusterKey);
notifyRefreshRegCenter();
}
private Map getTargetZkCluster(String zkCluster) {
Map result = new HashMap<>(1);
Map zkClusterInfo = getZkClusterInfo();
Iterator> entries = zkClusterInfo.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry entry = entries.next();
if (entry.getKey().equals(zkCluster)) {
result.put(zkCluster, entry.getValue());
break;
}
}
return result;
}
private List getTargetNamespaceZkClusterMapping(String zkCluster, String namespace) {
List nsZkClusterMappingList = namespaceZkClusterMapping4SqlService
.getAllMappingsOfCluster(zkCluster);
List filteredList = new ArrayList<>();
for (NamespaceZkClusterMapping n : nsZkClusterMappingList) {
if (n.getNamespace().equals(namespace)) {
filteredList.add(n);
break;
}
}
return nsZkClusterMappingList;
}
private void updateRegistryCenterConfiguration(String namespace, String zkAddressList, String zkClusterName) {
List sourceRegCenterConfList = zkClusterMap.get(zkClusterName)
.getRegCenterConfList();
boolean regCenterConfAlreadyExisted = false;
for (RegistryCenterConfiguration conf : sourceRegCenterConfList) {
if (conf.getNamespace().equals(namespace)) {
regCenterConfAlreadyExisted = true;
break;
}
}
if (!regCenterConfAlreadyExisted) {
RegistryCenterConfiguration registryCenterConfiguration = new RegistryCenterConfiguration("", namespace,
zkAddressList);
zkClusterMap.get(zkClusterName).getRegCenterConfList().add(registryCenterConfiguration);
}
}
private void updateAllOnlineNamespaces(String namespace) {
if (!allOnlineNamespaces.contains(namespace)) {
allOnlineNamespaces.add(namespace);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy