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