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:
18
pom.xml
18
pom.xml
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ import lombok.Data;
|
||||
public class ZookeeperInstance {
|
||||
private String id;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private ZookeeperInstance() {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user