Fix compiler errors/warnings and restore Ribbon support

spring-cloud-netflix doesn't depend on feign-ribbon any more
(and arguably therefore this should not either, but completing
that job is left for another day)
This commit is contained in:
Dave Syer
2015-10-01 09:13:06 +01:00
parent e60ca6a76a
commit e5703c6ae5
17 changed files with 181 additions and 150 deletions

18
pom.xml
View File

@@ -132,11 +132,6 @@
<artifactId>spring-cloud-netflix-core</artifactId>
<version>${spring-cloud-netflix.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>${spring-cloud-netflix.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
@@ -189,6 +184,16 @@
<artifactId>ribbon-httpclient</artifactId>
<version>${ribbon.version}</version>
</dependency>
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-ribbon</artifactId>
<version>${feign.version}</version>
</dependency>
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-slf4j</artifactId>
<version>${feign.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
@@ -235,7 +240,7 @@
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-core</artifactId>
<version>8.7.1</version>
<version>${feign.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
@@ -246,6 +251,7 @@
<archaius.version>0.7.1</archaius.version>
<curator.version>2.8.0</curator.version>
<ribbon.version>2.1.0</ribbon.version>
<feign.version>8.10.0</feign.version>
<spock.version>1.0-groovy-2.4</spock.version>
</properties>

View File

@@ -47,6 +47,16 @@
<artifactId>spring-boot-starter</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
@@ -92,6 +102,21 @@
<artifactId>ribbon-httpclient</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-core</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-ribbon</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-slf4j</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
@@ -150,16 +175,6 @@
<scope>test</scope>
<version>1.53</version>
</dependency>
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-core</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>

View File

@@ -22,13 +22,13 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import lombok.SneakyThrows;
import org.apache.curator.x.discovery.ServiceInstance;
import org.springframework.cloud.client.DefaultServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.zookeeper.discovery.dependency.ZookeeperDependencies;
import lombok.SneakyThrows;
/**
* @author Spencer Gibb
* @author Marcin Grzejszczak, 4financeIT
@@ -51,7 +51,7 @@ public class ZookeeperDiscoveryClient implements DiscoveryClient {
@Override
public org.springframework.cloud.client.ServiceInstance getLocalServiceInstance() {
ServiceInstance<ZookeeperInstance> serviceInstance = serviceDiscovery.getServiceInstance();
ServiceInstance<ZookeeperInstance> serviceInstance = this.serviceDiscovery.getServiceInstance();
return createServiceInstance(serviceInstance.getId(), serviceInstance);
}
@@ -68,11 +68,10 @@ public class ZookeeperDiscoveryClient implements DiscoveryClient {
@Override
@SneakyThrows
@SuppressWarnings("unchecked")
public List<org.springframework.cloud.client.ServiceInstance> getInstances(
final String serviceId) {
String serviceIdToQuery = getServiceIdToQuery(serviceId);
Collection<ServiceInstance<ZookeeperInstance>> zkInstances = serviceDiscovery
Collection<ServiceInstance<ZookeeperInstance>> zkInstances = this.serviceDiscovery
.getServiceDiscovery().queryForInstances(serviceIdToQuery);
ArrayList<org.springframework.cloud.client.ServiceInstance> instances = new ArrayList<>();
@@ -85,19 +84,18 @@ public class ZookeeperDiscoveryClient implements DiscoveryClient {
}
private String getServiceIdToQuery(String serviceId) {
if (zookeeperDependencies != null && zookeeperDependencies.hasDependencies()) {
String pathForAlias = zookeeperDependencies.getPathForAlias(serviceId);
if (this.zookeeperDependencies != null && this.zookeeperDependencies.hasDependencies()) {
String pathForAlias = this.zookeeperDependencies.getPathForAlias(serviceId);
return pathForAlias.isEmpty() ? serviceId : pathForAlias;
}
return serviceId;
}
@Override
@SuppressWarnings("unchecked")
public List<String> getServices() {
ArrayList<String> services = null;
try {
services = new ArrayList<>(serviceDiscovery.getServiceDiscovery().queryForNames());
services = new ArrayList<>(this.serviceDiscovery.getServiceDiscovery().queryForNames());
}
catch (Exception e) {
rethrowRuntimeException(e);

View File

@@ -19,13 +19,13 @@ package org.springframework.cloud.zookeeper.discovery;
import java.util.ArrayList;
import java.util.Collection;
import lombok.extern.slf4j.Slf4j;
import org.apache.curator.x.discovery.ServiceInstance;
import org.springframework.boot.actuate.health.AbstractHealthIndicator;
import org.springframework.boot.actuate.health.Health;
import org.springframework.cloud.zookeeper.discovery.dependency.ZookeeperDependencies;
import lombok.extern.slf4j.Slf4j;
/**
* @author Spencer Gibb
*/
@@ -41,13 +41,12 @@ public class ZookeeperDiscoveryHealthIndicator extends AbstractHealthIndicator {
}
@Override
@SuppressWarnings("unchecked")
protected void doHealthCheck(Health.Builder builder) throws Exception {
try {
Collection<String> names = getNamesToQuery();
ArrayList<ServiceInstance<ZookeeperInstance>> allInstances = new ArrayList<>();
for (String name : names) {
Collection<ServiceInstance<ZookeeperInstance>> instances = serviceDiscovery
Collection<ServiceInstance<ZookeeperInstance>> instances = this.serviceDiscovery
.getServiceDiscovery().queryForInstances(name);
for (ServiceInstance<ZookeeperInstance> instance : instances) {
allInstances.add(instance);
@@ -61,11 +60,10 @@ public class ZookeeperDiscoveryHealthIndicator extends AbstractHealthIndicator {
}
}
@SuppressWarnings("unchecked")
private Collection<String> getNamesToQuery() throws Exception {
if (zookeeperDependencies == null) {
return serviceDiscovery.getServiceDiscovery().queryForNames();
if (this.zookeeperDependencies == null) {
return this.serviceDiscovery.getServiceDiscovery().queryForNames();
}
return zookeeperDependencies.getDependencyNames();
return this.zookeeperDependencies.getDependencyNames();
}
}

View File

@@ -27,6 +27,7 @@ import lombok.Data;
public class ZookeeperInstance {
private String id;
@SuppressWarnings("unused")
private ZookeeperInstance() {
}
}

View File

@@ -16,15 +16,13 @@
package org.springframework.cloud.zookeeper.discovery;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.client.discovery.AbstractDiscoveryLifecycle;
import lombok.SneakyThrows;
/**
* @author Spencer Gibb
*/
@Slf4j
public class ZookeeperLifecycle extends AbstractDiscoveryLifecycle {
private ZookeeperDiscoveryProperties properties;
@@ -55,22 +53,22 @@ public class ZookeeperLifecycle extends AbstractDiscoveryLifecycle {
@Override
protected boolean isEnabled() {
return properties.isEnabled();
return this.properties.isEnabled();
}
@Override
protected int getConfiguredPort() {
return serviceDiscovery.getPort();
return this.serviceDiscovery.getPort();
}
@Override
protected void setConfiguredPort(int port) {
serviceDiscovery.setPort(port);
serviceDiscovery.build();
this.serviceDiscovery.setPort(port);
this.serviceDiscovery.build();
}
@Override
protected Object getConfiguration() {
return properties;
return this.properties;
}
}

View File

@@ -16,12 +16,11 @@
package org.springframework.cloud.zookeeper.discovery;
import com.netflix.client.config.IClientConfig;
import com.netflix.config.ConfigurationManager;
import com.netflix.config.DynamicPropertyFactory;
import com.netflix.config.DynamicStringProperty;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.ServerList;
import static com.netflix.client.config.CommonClientConfigKey.DeploymentContextBasedVipAddresses;
import static com.netflix.client.config.CommonClientConfigKey.EnableZoneAffinity;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -32,10 +31,12 @@ import org.springframework.cloud.zookeeper.discovery.dependency.ZookeeperDepende
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
import static com.netflix.client.config.CommonClientConfigKey.DeploymentContextBasedVipAddresses;
import static com.netflix.client.config.CommonClientConfigKey.EnableZoneAffinity;
import com.netflix.client.config.IClientConfig;
import com.netflix.config.ConfigurationManager;
import com.netflix.config.DynamicPropertyFactory;
import com.netflix.config.DynamicStringProperty;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.ServerList;
/**
* Preprocessor that configures defaults for zookeeper-discovered ribbon clients. Such as:
@@ -64,7 +65,7 @@ public class ZookeeperRibbonClientConfiguration {
@ConditionalOnMissingBean
@ConditionalOnDependenciesPassed
public ServerList<?> ribbonServerListFromDependencies(IClientConfig config, ZookeeperDependencies zookeeperDependencies) {
ZookeeperServerList serverList = new ZookeeperServerList(serviceDiscovery.getServiceDiscovery());
ZookeeperServerList serverList = new ZookeeperServerList(this.serviceDiscovery.getServiceDiscovery());
serverList.initFromDependencies(config, zookeeperDependencies);
return serverList;
}
@@ -73,14 +74,14 @@ public class ZookeeperRibbonClientConfiguration {
@ConditionalOnMissingBean
@ConditionalOnDependenciesPassed
@ConditionalOnProperty(value = "spring.cloud.zookeeper.dependencies.ribbon.loadbalancer", matchIfMissing = true)
public ILoadBalancer dependenciesBasedLoadBalancer(ZookeeperDependencies zookeeperDependencies, ServerList serverList) {
public ILoadBalancer dependenciesBasedLoadBalancer(ZookeeperDependencies zookeeperDependencies, ServerList<?> serverList) {
return new DependenciesBasedLoadBalancer(zookeeperDependencies, serverList);
}
@Bean
@ConditionalOnMissingBean
public ServerList<?> ribbonServerList(IClientConfig config) {
ZookeeperServerList serverList = new ZookeeperServerList(serviceDiscovery.getServiceDiscovery());
ZookeeperServerList serverList = new ZookeeperServerList(this.serviceDiscovery.getServiceDiscovery());
serverList.initWithNiwsConfig(config);
return serverList;
}

View File

@@ -20,21 +20,23 @@ import java.util.concurrent.atomic.AtomicLong;
import javax.annotation.PreDestroy;
import lombok.SneakyThrows;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.recipes.cache.*;
import org.apache.curator.framework.recipes.cache.TreeCache;
import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
import org.apache.curator.framework.recipes.cache.TreeCacheListener;
import org.springframework.cloud.client.discovery.event.HeartbeatEvent;
import org.springframework.cloud.client.discovery.event.InstanceRegisteredEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.context.ApplicationListener;
import lombok.SneakyThrows;
/**
* @author Spencer Gibb
*/
public class ZookeeperServiceWatch implements
ApplicationListener<InstanceRegisteredEvent>, TreeCacheListener,
ApplicationListener<InstanceRegisteredEvent<?>>, TreeCacheListener,
ApplicationEventPublisherAware {
private final CuratorFramework curator;
@@ -55,21 +57,21 @@ public class ZookeeperServiceWatch implements
}
public TreeCache getCache() {
return cache;
return this.cache;
}
@Override
@SneakyThrows
public void onApplicationEvent(InstanceRegisteredEvent event) {
cache = TreeCache.newBuilder(curator, properties.getRoot()).build();
cache.getListenable().addListener(this);
cache.start();
public void onApplicationEvent(InstanceRegisteredEvent<?> event) {
this.cache = TreeCache.newBuilder(this.curator, this.properties.getRoot()).build();
this.cache.getListenable().addListener(this);
this.cache.start();
}
@PreDestroy
public void stop() throws Exception {
if (cache != null) {
cache.close();
if (this.cache != null) {
this.cache.close();
}
}
@@ -78,8 +80,8 @@ public class ZookeeperServiceWatch implements
if (event.getType().equals(TreeCacheEvent.Type.NODE_ADDED)
|| event.getType().equals(TreeCacheEvent.Type.NODE_REMOVED)
|| event.getType().equals(TreeCacheEvent.Type.NODE_UPDATED)) {
long newCacheChange = cacheChange.incrementAndGet();
publisher.publishEvent(new HeartbeatEvent(this, newCacheChange));
long newCacheChange = this.cacheChange.incrementAndGet();
this.publisher.publishEvent(new HeartbeatEvent(this, newCacheChange));
}
}
}

View File

@@ -16,16 +16,17 @@
package org.springframework.cloud.zookeeper.discovery.dependency;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import com.netflix.loadbalancer.BaseLoadBalancer;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RoundRobinRule;
import com.netflix.loadbalancer.Server;
import com.netflix.loadbalancer.ServerList;
import lombok.extern.slf4j.Slf4j;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import lombok.extern.slf4j.Slf4j;
/**
* LoadBalancer that delegates to other rules depending on the provided load balancing strategy
@@ -40,7 +41,7 @@ public class DependenciesBasedLoadBalancer extends BaseLoadBalancer {
private final ZookeeperDependencies zookeeperDependencies;
public DependenciesBasedLoadBalancer(ZookeeperDependencies zookeeperDependencies, ServerList serverList) {
public DependenciesBasedLoadBalancer(ZookeeperDependencies zookeeperDependencies, ServerList<?> serverList) {
this.zookeeperDependencies = zookeeperDependencies;
setServersList(serverList.getInitialListOfServers());
}
@@ -48,20 +49,20 @@ public class DependenciesBasedLoadBalancer extends BaseLoadBalancer {
@Override
public Server chooseServer(Object key) {
String keyAsString = (String) key;
ZookeeperDependency dependency = zookeeperDependencies.getDependencyForAlias(keyAsString);
ZookeeperDependency dependency = this.zookeeperDependencies.getDependencyForAlias(keyAsString);
if (dependency == null) {
log.debug("No dependency found for alias [{}] - will use the default rule which is [{}]", keyAsString, rule);
return rule.choose(key);
log.debug("No dependency found for alias [{}] - will use the default rule which is [{}]", keyAsString, this.rule);
return this.rule.choose(key);
};
cacheEntryIfMissing(keyAsString, dependency);
log.debug("Will try to retrieve dependency for key [{}]. Current cache contents [{}]", keyAsString, ruleCache);
return ruleCache.get(keyAsString).choose(key);
log.debug("Will try to retrieve dependency for key [{}]. Current cache contents [{}]", keyAsString, this.ruleCache);
return this.ruleCache.get(keyAsString).choose(key);
}
private void cacheEntryIfMissing(String keyAsString, ZookeeperDependency dependency) {
if (!ruleCache.containsKey(keyAsString)) {
if (!this.ruleCache.containsKey(keyAsString)) {
log.debug("Cache doesn't contain entry for [{}]", keyAsString);
ruleCache.put(keyAsString, chooseRuleForLoadBalancerType(dependency.getLoadBalancerType()));
this.ruleCache.put(keyAsString, chooseRuleForLoadBalancerType(dependency.getLoadBalancerType()));
}
}

View File

@@ -16,16 +16,6 @@
package org.springframework.cloud.zookeeper.discovery.dependency;
import feign.Client;
import feign.Request;
import feign.Response;
import feign.ribbon.RibbonClient;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import java.io.IOException;
import java.net.URI;
import java.util.Collection;
@@ -33,6 +23,18 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cloud.netflix.feign.ribbon.LoadBalancerFeignClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import feign.Client;
import feign.Request;
import feign.Response;
import feign.ribbon.RibbonClient;
/**
*
* Configuration for ensuring that headers are set for a given dependency.
@@ -42,26 +44,35 @@ import java.util.Map;
@Configuration
@ConditionalOnDependenciesPassed
@ConditionalOnProperty(value = "spring.cloud.zookeeper.dependencies.headers.enabled", matchIfMissing = true)
@ConditionalOnClass({Client.class, RibbonClient.class})
@ConditionalOnClass({ Client.class, RibbonClient.class })
public class DependencyFeignClientAutoConfiguration {
@Bean
@Primary
@SuppressWarnings("deprecation")
Client dependencyBasedFeignClient(final RibbonClient ribbonClient, final ZookeeperDependencies zookeeperDependencies) {
@SuppressWarnings("deprecation")
Client dependencyBasedFeignClient(final LoadBalancerFeignClient ribbonClient,
final ZookeeperDependencies zookeeperDependencies) {
// TODO: remove dependency on feign-ribbon
return new RibbonClient() {
@Override
public Response execute(Request request, Request.Options options) throws IOException {
public Response execute(Request request, Request.Options options)
throws IOException {
URI asUri = URI.create(request.url());
String clientName = asUri.getHost();
ZookeeperDependency dependencyForAlias = zookeeperDependencies.getDependencyForAlias(clientName);
Map<String, Collection<String>> headers = getUpdatedHeadersIfPossible(request, dependencyForAlias);
return ribbonClient.execute(Request.create(request.method(), request.url(), headers, request.body(), request.charset()), options);
ZookeeperDependency dependencyForAlias = zookeeperDependencies
.getDependencyForAlias(clientName);
Map<String, Collection<String>> headers = getUpdatedHeadersIfPossible(
request, dependencyForAlias);
return ribbonClient.execute(Request.create(request.method(),
request.url(), headers, request.body(), request.charset()),
options);
}
private Map<String, Collection<String>> getUpdatedHeadersIfPossible(Request request, ZookeeperDependency dependencyForAlias) {
private Map<String, Collection<String>> getUpdatedHeadersIfPossible(
Request request, ZookeeperDependency dependencyForAlias) {
if (dependencyForAlias != null) {
return Collections.unmodifiableMap(new HashMap<>(dependencyForAlias.getUpdatedHeaders(request.headers())));
return Collections.unmodifiableMap(new HashMap<>(
dependencyForAlias.getUpdatedHeaders(request.headers())));
}
return request.headers();
}

View File

@@ -16,9 +16,13 @@
package org.springframework.cloud.zookeeper.discovery.dependency;
import com.google.common.base.Function;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -32,11 +36,8 @@ import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.web.client.RestTemplate;
import javax.annotation.PostConstruct;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import com.google.common.base.Function;
import com.google.common.collect.Maps;
/**
*
@@ -49,7 +50,6 @@ import java.util.Map;
@Configuration
@ConditionalOnDependenciesPassed
@ConditionalOnProperty(value = "spring.cloud.zookeeper.dependencies.resttemplate.enabled", matchIfMissing = true)
@Slf4j
public class DependencyRestTemplateAutoConfiguration {
@Autowired @LoadBalanced RestTemplate restTemplate;
@@ -57,11 +57,11 @@ public class DependencyRestTemplateAutoConfiguration {
@PostConstruct
void customizeRestTemplate() {
restTemplate.getInterceptors().add(new ClientHttpRequestInterceptor() {
this.restTemplate.getInterceptors().add(new ClientHttpRequestInterceptor() {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
String clientName = request.getURI().getHost();
ZookeeperDependency dependencyForAlias = zookeeperDependencies.getDependencyForAlias(clientName);
ZookeeperDependency dependencyForAlias = DependencyRestTemplateAutoConfiguration.this.zookeeperDependencies.getDependencyForAlias(clientName);
HttpHeaders headers = getUpdatedHeadersIfPossible(request, dependencyForAlias);
request.getHeaders().putAll(headers);
return execution.execute(request, body);

View File

@@ -15,7 +15,11 @@
*/
package org.springframework.cloud.zookeeper.discovery.watcher;
import lombok.SneakyThrows;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.curator.x.discovery.ServiceCache;
import org.springframework.cloud.client.discovery.event.InstanceRegisteredEvent;
import org.springframework.cloud.zookeeper.discovery.ZookeeperServiceDiscovery;
@@ -24,10 +28,7 @@ import org.springframework.cloud.zookeeper.discovery.dependency.ZookeeperDepende
import org.springframework.cloud.zookeeper.discovery.watcher.presence.DependencyPresenceOnStartupVerifier;
import org.springframework.context.ApplicationListener;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import lombok.SneakyThrows;
/**
* This Dependency Watcher will verify the presence of dependencies upon startup and registers listeners
@@ -39,10 +40,10 @@ import java.util.concurrent.ConcurrentHashMap;
* @author Marcin Grzejszczak, 4financeIT
* @author Michal Chmielarz, 4financeIT
*/
public class DefaultDependencyWatcher implements DependencyRegistrationHookProvider, ApplicationListener<InstanceRegisteredEvent> {
public class DefaultDependencyWatcher implements DependencyRegistrationHookProvider, ApplicationListener<InstanceRegisteredEvent<?>> {
private final ZookeeperServiceDiscovery serviceDiscovery;
private final Map<String, ServiceCache> dependencyRegistry = new ConcurrentHashMap<>();
private final Map<String, ServiceCache<?>> dependencyRegistry = new ConcurrentHashMap<>();
private final List<DependencyWatcherListener> listeners;
private final DependencyPresenceOnStartupVerifier dependencyPresenceOnStartupVerifier;
private final ZookeeperDependencies zookeeperDependencies;
@@ -59,27 +60,26 @@ public class DefaultDependencyWatcher implements DependencyRegistrationHookProvi
@Override
@SneakyThrows
public void onApplicationEvent(InstanceRegisteredEvent event) {
public void onApplicationEvent(InstanceRegisteredEvent<?> event) {
registerDependencyRegistrationHooks();
}
@Override
@SuppressWarnings("unchecked")
public void registerDependencyRegistrationHooks() throws Exception {
for (ZookeeperDependency zookeeperDependency : zookeeperDependencies.getDependencyConfigurations()) {
for (ZookeeperDependency zookeeperDependency : this.zookeeperDependencies.getDependencyConfigurations()) {
String dependencyPath = zookeeperDependency.getPath();
ServiceCache serviceCache = serviceDiscovery.getServiceDiscovery()
ServiceCache<?> serviceCache = this.serviceDiscovery.getServiceDiscovery()
.serviceCacheBuilder().name(dependencyPath).build();
serviceCache.start();
dependencyPresenceOnStartupVerifier.verifyDependencyPresence(dependencyPath, serviceCache, zookeeperDependency.isRequired());
dependencyRegistry.put(dependencyPath, serviceCache);
serviceCache.addListener(new DependencyStateChangeListenerRegistry(listeners, dependencyPath, serviceCache));
this.dependencyPresenceOnStartupVerifier.verifyDependencyPresence(dependencyPath, serviceCache, zookeeperDependency.isRequired());
this.dependencyRegistry.put(dependencyPath, serviceCache);
serviceCache.addListener(new DependencyStateChangeListenerRegistry(this.listeners, dependencyPath, serviceCache));
}
}
@Override
public void clearDependencyRegistrationHooks() throws IOException {
for (ServiceCache cache : dependencyRegistry.values()) {
for (ServiceCache<?> cache : this.dependencyRegistry.values()) {
cache.close();
}
}

View File

@@ -17,13 +17,13 @@ package org.springframework.cloud.zookeeper.discovery.watcher;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.state.ConnectionState;
import org.apache.curator.x.discovery.ServiceCache;
import org.apache.curator.x.discovery.details.ServiceCacheListener;
import lombok.extern.apachecommons.CommonsLog;
/**
*
* Informs all the DependencyWatcherListeners that a dependency's state has changed
@@ -31,14 +31,14 @@ import org.apache.curator.x.discovery.details.ServiceCacheListener;
* @author Marcin Grzejszczak, 4financeIT
* @author Tomasz Nurkiewicz, 4financeIT
*/
@Slf4j
@CommonsLog
public class DependencyStateChangeListenerRegistry implements ServiceCacheListener {
private final List<DependencyWatcherListener> listeners;
private final String dependencyName;
private final ServiceCache serviceCache;
private final ServiceCache<?> serviceCache;
public DependencyStateChangeListenerRegistry(List<DependencyWatcherListener> listeners, String dependencyName, ServiceCache serviceCache) {
public DependencyStateChangeListenerRegistry(List<DependencyWatcherListener> listeners, String dependencyName, ServiceCache<?> serviceCache) {
this.listeners = listeners;
this.dependencyName = dependencyName;
this.serviceCache = serviceCache;
@@ -46,23 +46,23 @@ public class DependencyStateChangeListenerRegistry implements ServiceCacheListen
@Override
public void cacheChanged() {
DependencyState state = serviceCache.getInstances().isEmpty() ? DependencyState.DISCONNECTED : DependencyState.CONNECTED;
DependencyState state = this.serviceCache.getInstances().isEmpty() ? DependencyState.DISCONNECTED : DependencyState.CONNECTED;
logCurrentState(state);
informListeners(state);
}
private void logCurrentState(DependencyState dependencyState) {
log.info("Service cache state change for '{}' instances, current service state: {}", dependencyName, dependencyState);
log.info("Service cache state change for '"+this.dependencyName+"' instances, current service state: " + dependencyState);
}
private void informListeners(DependencyState state) {
for (DependencyWatcherListener listener : listeners) {
listener.stateChanged(dependencyName, state);
for (DependencyWatcherListener listener : this.listeners) {
listener.stateChanged(this.dependencyName, state);
}
}
@Override
public void stateChanged(CuratorFramework client, ConnectionState newState) {
// todo do something or ignore for what is worth
// TODO do something or ignore for what is worth
}
}

View File

@@ -30,7 +30,6 @@ import org.apache.curator.x.discovery.ServiceCache;
* @author Marcin Grzejszczak, 4financeIT
* @author Tomasz Szymanski, 4financeIT
*/
@SuppressWarnings("unchecked")
public abstract class DependencyPresenceOnStartupVerifier {
private static final PresenceChecker MANDATORY_DEPENDENCY_CHECKER = new FailOnMissingDependencyChecker();
private final PresenceChecker optionalDependencyChecker;
@@ -39,11 +38,12 @@ public abstract class DependencyPresenceOnStartupVerifier {
this.optionalDependencyChecker = optionalDependencyChecker;
}
public void verifyDependencyPresence(String dependencyName, ServiceCache serviceCache, boolean required) {
@SuppressWarnings("unchecked")
public void verifyDependencyPresence(String dependencyName, @SuppressWarnings("rawtypes") ServiceCache serviceCache, boolean required) {
if (required) {
MANDATORY_DEPENDENCY_CHECKER.checkPresence(dependencyName, serviceCache.getInstances());
} else {
optionalDependencyChecker.checkPresence(dependencyName, serviceCache.getInstances());
this.optionalDependencyChecker.checkPresence(dependencyName, serviceCache.getInstances());
}
}
}

View File

@@ -15,10 +15,10 @@
*/
package org.springframework.cloud.zookeeper.discovery.watcher.presence;
import org.apache.curator.x.discovery.ServiceInstance;
import java.util.List;
import org.apache.curator.x.discovery.ServiceInstance;
/**
*
* Will result in throwing an exception if there are no running instances of the dependency
@@ -28,7 +28,7 @@ import java.util.List;
*/
public class FailOnMissingDependencyChecker implements PresenceChecker {
@Override
public void checkPresence(String dependencyName, List<ServiceInstance> serviceInstances) {
public void checkPresence(String dependencyName, List<ServiceInstance<?>> serviceInstances) {
if (serviceInstances.isEmpty()) {
throw new NoInstancesRunningException(dependencyName);
}

View File

@@ -15,13 +15,13 @@
*/
package org.springframework.cloud.zookeeper.discovery.watcher.presence;
import org.apache.curator.x.discovery.ServiceInstance;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.invoke.MethodHandles;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.curator.x.discovery.ServiceInstance;
/**
*
* Will log the missing microservice dependency
@@ -31,12 +31,12 @@ import java.util.List;
*/
public class LogMissingDependencyChecker implements PresenceChecker {
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private static final Log log = LogFactory.getLog(MethodHandles.lookup().lookupClass());
@Override
public void checkPresence(String dependencyName, List<ServiceInstance> serviceInstances) {
public void checkPresence(String dependencyName, List<ServiceInstance<?>> serviceInstances) {
if (serviceInstances.isEmpty()) {
log.warn("Microservice dependency with name [{}] is missing.", dependencyName);
log.warn("Microservice dependency with name ["+dependencyName+"] is missing.");
}
}

View File

@@ -15,10 +15,10 @@
*/
package org.springframework.cloud.zookeeper.discovery.watcher.presence;
import org.apache.curator.x.discovery.ServiceInstance;
import java.util.List;
import org.apache.curator.x.discovery.ServiceInstance;
/**
* The implementation of this interface will be called upon checking if a dependency with a given name
* is present upon startup within the provided service instances.
@@ -33,5 +33,5 @@ public interface PresenceChecker {
* @param dependencyName
* @param serviceInstances - instances to check the dependency for
*/
void checkPresence(String dependencyName, List<ServiceInstance> serviceInstances);
void checkPresence(String dependencyName, List<ServiceInstance<?>> serviceInstances);
}