Browse Source
* [Feature-3134]Refactor to use a shared singleton Curator Zookeeper Client * autowire CuratorZookeeperClient to ZookeeperOperator * [Improvement] Add the issue specifications reference (#3221) * log zookeeper address when the connect state change * resume the operation of add connect state listener in MasterRegistry Co-authored-by: Yichao Yang <1048262223@qq.com>pull/3/MERGE
tswstarplanet
4 years ago
committed by
GitHub
8 changed files with 210 additions and 80 deletions
@ -0,0 +1,119 @@
|
||||
/* |
||||
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||
* contributor license agreements. See the NOTICE file distributed with |
||||
* this work for additional information regarding copyright ownership. |
||||
* The ASF licenses this file to You 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 org.apache.dolphinscheduler.service.zk; |
||||
|
||||
import org.apache.commons.lang.StringUtils; |
||||
import org.apache.curator.framework.CuratorFramework; |
||||
import org.apache.curator.framework.CuratorFrameworkFactory; |
||||
import org.apache.curator.framework.api.ACLProvider; |
||||
import org.apache.curator.framework.state.ConnectionState; |
||||
import org.apache.curator.retry.ExponentialBackoffRetry; |
||||
import org.apache.zookeeper.ZooDefs; |
||||
import org.apache.zookeeper.data.ACL; |
||||
import org.slf4j.Logger; |
||||
import org.slf4j.LoggerFactory; |
||||
import org.springframework.beans.factory.InitializingBean; |
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.stereotype.Component; |
||||
|
||||
import java.nio.charset.StandardCharsets; |
||||
import java.util.List; |
||||
|
||||
import static org.apache.dolphinscheduler.common.utils.Preconditions.checkNotNull; |
||||
|
||||
/** |
||||
* Shared Curator zookeeper client |
||||
*/ |
||||
@Component |
||||
public class CuratorZookeeperClient implements InitializingBean { |
||||
private final Logger logger = LoggerFactory.getLogger(CuratorZookeeperClient.class); |
||||
|
||||
@Autowired |
||||
private ZookeeperConfig zookeeperConfig; |
||||
|
||||
private CuratorFramework zkClient; |
||||
|
||||
|
||||
@Override |
||||
public void afterPropertiesSet() throws Exception { |
||||
this.zkClient = buildClient(); |
||||
initStateLister(); |
||||
} |
||||
|
||||
private CuratorFramework buildClient() { |
||||
logger.info("zookeeper registry center init, server lists is: {}.", zookeeperConfig.getServerList()); |
||||
|
||||
CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder().ensembleProvider(new DefaultEnsembleProvider(checkNotNull(zookeeperConfig.getServerList(),"zookeeper quorum can't be null"))) |
||||
.retryPolicy(new ExponentialBackoffRetry(zookeeperConfig.getBaseSleepTimeMs(), zookeeperConfig.getMaxRetries(), zookeeperConfig.getMaxSleepMs())); |
||||
|
||||
//these has default value
|
||||
if (0 != zookeeperConfig.getSessionTimeoutMs()) { |
||||
builder.sessionTimeoutMs(zookeeperConfig.getSessionTimeoutMs()); |
||||
} |
||||
if (0 != zookeeperConfig.getConnectionTimeoutMs()) { |
||||
builder.connectionTimeoutMs(zookeeperConfig.getConnectionTimeoutMs()); |
||||
} |
||||
if (StringUtils.isNotBlank(zookeeperConfig.getDigest())) { |
||||
builder.authorization("digest", zookeeperConfig.getDigest().getBytes(StandardCharsets.UTF_8)).aclProvider(new ACLProvider() { |
||||
|
||||
@Override |
||||
public List<ACL> getDefaultAcl() { |
||||
return ZooDefs.Ids.CREATOR_ALL_ACL; |
||||
} |
||||
|
||||
@Override |
||||
public List<ACL> getAclForPath(final String path) { |
||||
return ZooDefs.Ids.CREATOR_ALL_ACL; |
||||
} |
||||
}); |
||||
} |
||||
zkClient = builder.build(); |
||||
zkClient.start(); |
||||
try { |
||||
zkClient.blockUntilConnected(); |
||||
} catch (final Exception ex) { |
||||
throw new RuntimeException(ex); |
||||
} |
||||
return zkClient; |
||||
} |
||||
|
||||
public void initStateLister() { |
||||
checkNotNull(zkClient); |
||||
|
||||
zkClient.getConnectionStateListenable().addListener((client, newState) -> { |
||||
if(newState == ConnectionState.LOST){ |
||||
logger.error("connection lost from zookeeper"); |
||||
} else if(newState == ConnectionState.RECONNECTED){ |
||||
logger.info("reconnected to zookeeper"); |
||||
} else if(newState == ConnectionState.SUSPENDED){ |
||||
logger.warn("connection SUSPENDED to zookeeper"); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
public ZookeeperConfig getZookeeperConfig() { |
||||
return zookeeperConfig; |
||||
} |
||||
|
||||
public void setZookeeperConfig(ZookeeperConfig zookeeperConfig) { |
||||
this.zookeeperConfig = zookeeperConfig; |
||||
} |
||||
|
||||
public CuratorFramework getZkClient() { |
||||
return zkClient; |
||||
} |
||||
} |
@ -0,0 +1,67 @@
|
||||
/* |
||||
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||
* contributor license agreements. See the NOTICE file distributed with |
||||
* this work for additional information regarding copyright ownership. |
||||
* The ASF licenses this file to You 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 org.apache.dolphinscheduler.service.zk; |
||||
|
||||
import org.junit.After; |
||||
import org.junit.Assert; |
||||
import org.junit.Before; |
||||
import org.junit.Test; |
||||
|
||||
import java.io.IOException; |
||||
import java.util.concurrent.TimeUnit; |
||||
|
||||
public class CuratorZookeeperClientTest { |
||||
private static ZKServer zkServer; |
||||
|
||||
@Before |
||||
public void before() throws IOException { |
||||
new Thread(() -> { |
||||
if (zkServer == null) { |
||||
zkServer = new ZKServer(); |
||||
} |
||||
zkServer.startLocalZkServer(2185); |
||||
}).start(); |
||||
} |
||||
|
||||
@After |
||||
public void after() { |
||||
if (zkServer != null) { |
||||
zkServer.stop(); |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
public void testAfterPropertiesSet() throws Exception { |
||||
TimeUnit.SECONDS.sleep(10); |
||||
CuratorZookeeperClient zookeeperClient = new CuratorZookeeperClient(); |
||||
ZookeeperConfig zookeeperConfig = new ZookeeperConfig(); |
||||
zookeeperConfig.setServerList("127.0.0.1:2185"); |
||||
zookeeperConfig.setBaseSleepTimeMs(100); |
||||
zookeeperConfig.setMaxSleepMs(30000); |
||||
zookeeperConfig.setMaxRetries(10); |
||||
zookeeperConfig.setSessionTimeoutMs(60000); |
||||
zookeeperConfig.setConnectionTimeoutMs(30000); |
||||
zookeeperConfig.setDigest(" "); |
||||
zookeeperConfig.setDsRoot("/dolphinscheduler"); |
||||
zookeeperConfig.setMaxWaitTime(30000); |
||||
zookeeperClient.setZookeeperConfig(zookeeperConfig); |
||||
System.out.println("start"); |
||||
zookeeperClient.afterPropertiesSet(); |
||||
System.out.println("end"); |
||||
Assert.assertNotNull(zookeeperClient.getZkClient()); |
||||
} |
||||
} |
Loading…
Reference in new issue