Reformat.
This commit is contained in:
committed by
Spencer Gibb
parent
034768bc8f
commit
00668991a4
@@ -61,14 +61,12 @@ public class CommonsClientAutoConfiguration {
|
||||
@Bean
|
||||
@ConditionalOnDiscoveryHealthIndicatorEnabled
|
||||
public DiscoveryClientHealthIndicator discoveryClientHealthIndicator(
|
||||
ObjectProvider<DiscoveryClient> discoveryClient,
|
||||
DiscoveryClientHealthIndicatorProperties properties) {
|
||||
ObjectProvider<DiscoveryClient> discoveryClient, DiscoveryClientHealthIndicatorProperties properties) {
|
||||
return new DiscoveryClientHealthIndicator(discoveryClient, properties);
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConditionalOnProperty(
|
||||
value = "spring.cloud.discovery.client.composite-indicator.enabled",
|
||||
@ConditionalOnProperty(value = "spring.cloud.discovery.client.composite-indicator.enabled",
|
||||
matchIfMissing = true)
|
||||
@ConditionalOnBean({ DiscoveryHealthIndicator.class })
|
||||
public DiscoveryCompositeHealthContributor discoveryCompositeHealthContributor(
|
||||
@@ -78,8 +76,7 @@ public class CommonsClientAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
public HasFeatures commonsFeatures() {
|
||||
return HasFeatures.abstractFeatures(DiscoveryClient.class,
|
||||
LoadBalancerClient.class);
|
||||
return HasFeatures.abstractFeatures(DiscoveryClient.class, LoadBalancerClient.class);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -36,8 +36,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
@Inherited
|
||||
@ConditionalOnProperty(value = "spring.cloud.discovery.blocking.enabled",
|
||||
matchIfMissing = true)
|
||||
@ConditionalOnProperty(value = "spring.cloud.discovery.blocking.enabled", matchIfMissing = true)
|
||||
public @interface ConditionalOnBlockingDiscoveryEnabled {
|
||||
|
||||
}
|
||||
|
||||
@@ -36,8 +36,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
@Inherited
|
||||
@ConditionalOnProperty(value = "spring.cloud.discovery.client.health-indicator.enabled",
|
||||
matchIfMissing = true)
|
||||
@ConditionalOnProperty(value = "spring.cloud.discovery.client.health-indicator.enabled", matchIfMissing = true)
|
||||
public @interface ConditionalOnDiscoveryHealthIndicatorEnabled {
|
||||
|
||||
}
|
||||
|
||||
@@ -39,8 +39,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
@Documented
|
||||
@Inherited
|
||||
@ConditionalOnClass(name = "org.springframework.web.reactive.function.client.WebClient")
|
||||
@ConditionalOnProperty(value = "spring.cloud.discovery.reactive.enabled",
|
||||
matchIfMissing = true)
|
||||
@ConditionalOnProperty(value = "spring.cloud.discovery.reactive.enabled", matchIfMissing = true)
|
||||
public @interface ConditionalOnReactiveDiscoveryEnabled {
|
||||
|
||||
}
|
||||
|
||||
@@ -49,8 +49,8 @@ public class DefaultServiceInstance implements ServiceInstance {
|
||||
* @param secure indicates whether or not the connection needs to be secure.
|
||||
* @param metadata a map containing metadata.
|
||||
*/
|
||||
public DefaultServiceInstance(String instanceId, String serviceId, String host,
|
||||
int port, boolean secure, Map<String, String> metadata) {
|
||||
public DefaultServiceInstance(String instanceId, String serviceId, String host, int port, boolean secure,
|
||||
Map<String, String> metadata) {
|
||||
this.instanceId = instanceId;
|
||||
this.serviceId = serviceId;
|
||||
this.host = host;
|
||||
@@ -66,8 +66,7 @@ public class DefaultServiceInstance implements ServiceInstance {
|
||||
* @param port the port on which the service is running.
|
||||
* @param secure indicates whether or not the connection needs to be secure.
|
||||
*/
|
||||
public DefaultServiceInstance(String instanceId, String serviceId, String host,
|
||||
int port, boolean secure) {
|
||||
public DefaultServiceInstance(String instanceId, String serviceId, String host, int port, boolean secure) {
|
||||
this(instanceId, serviceId, host, port, secure, new LinkedHashMap<>());
|
||||
}
|
||||
|
||||
@@ -93,8 +92,7 @@ public class DefaultServiceInstance implements ServiceInstance {
|
||||
* @deprecated - use other constructors
|
||||
*/
|
||||
@Deprecated
|
||||
public DefaultServiceInstance(String serviceId, String host, int port,
|
||||
boolean secure) {
|
||||
public DefaultServiceInstance(String serviceId, String host, int port, boolean secure) {
|
||||
this(serviceId, host, port, secure, new LinkedHashMap<>());
|
||||
}
|
||||
|
||||
@@ -105,8 +103,7 @@ public class DefaultServiceInstance implements ServiceInstance {
|
||||
*/
|
||||
public static URI getUri(ServiceInstance instance) {
|
||||
String scheme = (instance.isSecure()) ? "https" : "http";
|
||||
String uri = String.format("%s://%s:%s", scheme, instance.getHost(),
|
||||
instance.getPort());
|
||||
String uri = String.format("%s://%s:%s", scheme, instance.getHost(), instance.getPort());
|
||||
return URI.create(uri);
|
||||
}
|
||||
|
||||
@@ -147,10 +144,9 @@ public class DefaultServiceInstance implements ServiceInstance {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "DefaultServiceInstance{" + "instanceId='" + this.instanceId + '\''
|
||||
+ ", serviceId='" + this.serviceId + '\'' + ", host='" + this.host + '\''
|
||||
+ ", port=" + this.port + ", secure=" + this.secure + ", metadata="
|
||||
+ this.metadata + '}';
|
||||
return "DefaultServiceInstance{" + "instanceId='" + this.instanceId + '\'' + ", serviceId='" + this.serviceId
|
||||
+ '\'' + ", host='" + this.host + '\'' + ", port=" + this.port + ", secure=" + this.secure
|
||||
+ ", metadata=" + this.metadata + '}';
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -162,17 +158,14 @@ public class DefaultServiceInstance implements ServiceInstance {
|
||||
return false;
|
||||
}
|
||||
DefaultServiceInstance that = (DefaultServiceInstance) o;
|
||||
return this.port == that.port && this.secure == that.secure
|
||||
&& Objects.equals(this.instanceId, that.instanceId)
|
||||
&& Objects.equals(this.serviceId, that.serviceId)
|
||||
&& Objects.equals(this.host, that.host)
|
||||
return this.port == that.port && this.secure == that.secure && Objects.equals(this.instanceId, that.instanceId)
|
||||
&& Objects.equals(this.serviceId, that.serviceId) && Objects.equals(this.host, that.host)
|
||||
&& Objects.equals(this.metadata, that.metadata);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(this.instanceId, this.serviceId, this.host, this.port,
|
||||
this.secure, this.metadata);
|
||||
return Objects.hash(this.instanceId, this.serviceId, this.host, this.port, this.secure, this.metadata);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -34,8 +34,7 @@ import org.springframework.core.env.MapPropertySource;
|
||||
/**
|
||||
* @author Spencer Gibb
|
||||
*/
|
||||
public class HostInfoEnvironmentPostProcessor
|
||||
implements EnvironmentPostProcessor, Ordered {
|
||||
public class HostInfoEnvironmentPostProcessor implements EnvironmentPostProcessor, Ordered {
|
||||
|
||||
// Before ConfigFileApplicationListener
|
||||
private int order = ConfigFileApplicationListener.DEFAULT_ORDER - 1;
|
||||
@@ -46,22 +45,19 @@ public class HostInfoEnvironmentPostProcessor
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postProcessEnvironment(ConfigurableEnvironment environment,
|
||||
SpringApplication application) {
|
||||
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
|
||||
InetUtils.HostInfo hostInfo = getFirstNonLoopbackHostInfo(environment);
|
||||
LinkedHashMap<String, Object> map = new LinkedHashMap<>();
|
||||
map.put("spring.cloud.client.hostname", hostInfo.getHostname());
|
||||
map.put("spring.cloud.client.ip-address", hostInfo.getIpAddress());
|
||||
MapPropertySource propertySource = new MapPropertySource(
|
||||
"springCloudClientHostInfo", map);
|
||||
MapPropertySource propertySource = new MapPropertySource("springCloudClientHostInfo", map);
|
||||
environment.getPropertySources().addLast(propertySource);
|
||||
}
|
||||
|
||||
private HostInfo getFirstNonLoopbackHostInfo(ConfigurableEnvironment environment) {
|
||||
InetUtilsProperties target = new InetUtilsProperties();
|
||||
ConfigurationPropertySources.attach(environment);
|
||||
Binder.get(environment).bind(InetUtilsProperties.PREFIX,
|
||||
Bindable.ofInstance(target));
|
||||
Binder.get(environment).bind(InetUtilsProperties.PREFIX, Bindable.ofInstance(target));
|
||||
try (InetUtils utils = new InetUtils(target)) {
|
||||
return utils.findFirstNonLoopbackHostInfo();
|
||||
}
|
||||
|
||||
@@ -52,8 +52,7 @@ public class ReactiveCommonsClientAutoConfiguration {
|
||||
protected static class ReactiveDiscoveryLoadBalancerConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnProperty(
|
||||
value = "spring.cloud.discovery.client.composite-indicator.enabled",
|
||||
@ConditionalOnProperty(value = "spring.cloud.discovery.client.composite-indicator.enabled",
|
||||
matchIfMissing = true)
|
||||
@ConditionalOnBean({ ReactiveDiscoveryHealthIndicator.class })
|
||||
public ReactiveDiscoveryCompositeHealthContributor reactiveDiscoveryClients(
|
||||
@@ -63,8 +62,7 @@ public class ReactiveCommonsClientAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
public HasFeatures reactiveCommonsFeatures() {
|
||||
return HasFeatures.abstractFeatures(ReactiveDiscoveryClient.class,
|
||||
ReactiveLoadBalancer.class);
|
||||
return HasFeatures.abstractFeatures(ReactiveDiscoveryClient.class, ReactiveLoadBalancer.class);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -82,10 +82,8 @@ public class FeaturesEndpoint implements ApplicationContextAware {
|
||||
|
||||
private void addFeature(Features features, NamedFeature feature) {
|
||||
Class<?> type = feature.getType();
|
||||
features.getEnabled()
|
||||
.add(new Feature(feature.getName(), type.getCanonicalName(),
|
||||
type.getPackage().getImplementationVersion(),
|
||||
type.getPackage().getImplementationVendor()));
|
||||
features.getEnabled().add(new Feature(feature.getName(), type.getCanonicalName(),
|
||||
type.getPackage().getImplementationVersion(), type.getPackage().getImplementationVendor()));
|
||||
}
|
||||
|
||||
static class Features {
|
||||
@@ -139,9 +137,8 @@ public class FeaturesEndpoint implements ApplicationContextAware {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Feature{" + "type='" + this.type + '\'' + ", name='" + this.name
|
||||
+ '\'' + ", version='" + this.version + '\'' + ", vendor='"
|
||||
+ this.vendor + '\'' + '}';
|
||||
return "Feature{" + "type='" + this.type + '\'' + ", name='" + this.name + '\'' + ", version='"
|
||||
+ this.version + '\'' + ", vendor='" + this.vendor + '\'' + '}';
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -155,20 +152,16 @@ public class FeaturesEndpoint implements ApplicationContextAware {
|
||||
|
||||
Feature feature = (Feature) o;
|
||||
|
||||
if (this.type != null ? !this.type.equals(feature.type)
|
||||
: feature.type != null) {
|
||||
if (this.type != null ? !this.type.equals(feature.type) : feature.type != null) {
|
||||
return false;
|
||||
}
|
||||
if (this.name != null ? !this.name.equals(feature.name)
|
||||
: feature.name != null) {
|
||||
if (this.name != null ? !this.name.equals(feature.name) : feature.name != null) {
|
||||
return false;
|
||||
}
|
||||
if (this.version != null ? !this.version.equals(feature.version)
|
||||
: feature.version != null) {
|
||||
if (this.version != null ? !this.version.equals(feature.version) : feature.version != null) {
|
||||
return false;
|
||||
}
|
||||
return this.vendor != null ? this.vendor.equals(feature.vendor)
|
||||
: feature.vendor == null;
|
||||
return this.vendor != null ? this.vendor.equals(feature.vendor) : feature.vendor == null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -30,30 +30,25 @@ public class HasFeatures {
|
||||
|
||||
private final List<NamedFeature> namedFeatures = new ArrayList<>();
|
||||
|
||||
public HasFeatures(List<Class<?>> abstractFeatures,
|
||||
List<NamedFeature> namedFeatures) {
|
||||
public HasFeatures(List<Class<?>> abstractFeatures, List<NamedFeature> namedFeatures) {
|
||||
this.abstractFeatures.addAll(abstractFeatures);
|
||||
this.namedFeatures.addAll(namedFeatures);
|
||||
}
|
||||
|
||||
public static HasFeatures abstractFeatures(Class<?>... abstractFeatures) {
|
||||
return new HasFeatures(Arrays.asList(abstractFeatures),
|
||||
Collections.<NamedFeature>emptyList());
|
||||
return new HasFeatures(Arrays.asList(abstractFeatures), Collections.<NamedFeature>emptyList());
|
||||
}
|
||||
|
||||
public static HasFeatures namedFeatures(NamedFeature... namedFeatures) {
|
||||
return new HasFeatures(Collections.<Class<?>>emptyList(),
|
||||
Arrays.asList(namedFeatures));
|
||||
return new HasFeatures(Collections.<Class<?>>emptyList(), Arrays.asList(namedFeatures));
|
||||
}
|
||||
|
||||
public static HasFeatures namedFeature(String name, Class<?> type) {
|
||||
return namedFeatures(new NamedFeature(name, type));
|
||||
}
|
||||
|
||||
public static HasFeatures namedFeatures(String name1, Class<?> type1, String name2,
|
||||
Class<?> type2) {
|
||||
return namedFeatures(new NamedFeature(name1, type1),
|
||||
new NamedFeature(name2, type2));
|
||||
public static HasFeatures namedFeatures(String name1, Class<?> type1, String name2, Class<?> type2) {
|
||||
return namedFeatures(new NamedFeature(name1, type1), new NamedFeature(name2, type2));
|
||||
}
|
||||
|
||||
public List<Class<?>> getAbstractFeatures() {
|
||||
|
||||
@@ -39,8 +39,7 @@ public interface Customizer<TOCUSTOMIZE> {
|
||||
* @param <K> the type of the identifier of the target
|
||||
* @return a wrapped customizer
|
||||
*/
|
||||
static <T, K> Customizer<T> once(Customizer<T> customizer,
|
||||
Function<? super T, ? extends K> keyMapper) {
|
||||
static <T, K> Customizer<T> once(Customizer<T> customizer, Function<? super T, ? extends K> keyMapper) {
|
||||
final ConcurrentMap<K, Boolean> customized = new ConcurrentHashMap<>();
|
||||
return t -> {
|
||||
final K key = keyMapper.apply(t);
|
||||
|
||||
@@ -26,13 +26,11 @@ import org.springframework.core.annotation.Order;
|
||||
* @author Spencer Gibb
|
||||
*/
|
||||
@Order(Ordered.LOWEST_PRECEDENCE - 100)
|
||||
public class EnableCircuitBreakerImportSelector
|
||||
extends SpringFactoryImportSelector<EnableCircuitBreaker> {
|
||||
public class EnableCircuitBreakerImportSelector extends SpringFactoryImportSelector<EnableCircuitBreaker> {
|
||||
|
||||
@Override
|
||||
protected boolean isEnabled() {
|
||||
return getEnvironment().getProperty("spring.cloud.circuit.breaker.enabled",
|
||||
Boolean.class, Boolean.TRUE);
|
||||
return getEnvironment().getProperty("spring.cloud.circuit.breaker.enabled", Boolean.class, Boolean.TRUE);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -34,22 +34,20 @@ import org.springframework.core.type.AnnotationMetadata;
|
||||
* @author Spencer Gibb
|
||||
*/
|
||||
@Order(Ordered.LOWEST_PRECEDENCE - 100)
|
||||
public class EnableDiscoveryClientImportSelector
|
||||
extends SpringFactoryImportSelector<EnableDiscoveryClient> {
|
||||
public class EnableDiscoveryClientImportSelector extends SpringFactoryImportSelector<EnableDiscoveryClient> {
|
||||
|
||||
@Override
|
||||
public String[] selectImports(AnnotationMetadata metadata) {
|
||||
String[] imports = super.selectImports(metadata);
|
||||
|
||||
AnnotationAttributes attributes = AnnotationAttributes.fromMap(
|
||||
metadata.getAnnotationAttributes(getAnnotationClass().getName(), true));
|
||||
AnnotationAttributes attributes = AnnotationAttributes
|
||||
.fromMap(metadata.getAnnotationAttributes(getAnnotationClass().getName(), true));
|
||||
|
||||
boolean autoRegister = attributes.getBoolean("autoRegister");
|
||||
|
||||
if (autoRegister) {
|
||||
List<String> importsList = new ArrayList<>(Arrays.asList(imports));
|
||||
importsList.add(
|
||||
"org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration");
|
||||
importsList.add("org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration");
|
||||
imports = importsList.toArray(new String[0]);
|
||||
}
|
||||
else {
|
||||
@@ -58,8 +56,7 @@ public class EnableDiscoveryClientImportSelector
|
||||
ConfigurableEnvironment configEnv = (ConfigurableEnvironment) env;
|
||||
LinkedHashMap<String, Object> map = new LinkedHashMap<>();
|
||||
map.put("spring.cloud.service-registry.auto-registration.enabled", false);
|
||||
MapPropertySource propertySource = new MapPropertySource(
|
||||
"springCloudDiscoveryClient", map);
|
||||
MapPropertySource propertySource = new MapPropertySource("springCloudDiscoveryClient", map);
|
||||
configEnv.getPropertySources().addLast(propertySource);
|
||||
}
|
||||
|
||||
@@ -70,8 +67,7 @@ public class EnableDiscoveryClientImportSelector
|
||||
|
||||
@Override
|
||||
protected boolean isEnabled() {
|
||||
return getEnvironment().getProperty("spring.cloud.discovery.enabled",
|
||||
Boolean.class, Boolean.TRUE);
|
||||
return getEnvironment().getProperty("spring.cloud.discovery.enabled", Boolean.class, Boolean.TRUE);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -33,8 +33,7 @@ public final class ManagementServerPortUtils {
|
||||
static final boolean hasActuator;
|
||||
|
||||
static {
|
||||
boolean hasEndpointClass = hasClass(
|
||||
"org.springframework.boot.actuate.endpoint.annotation.Endpoint");
|
||||
boolean hasEndpointClass = hasClass("org.springframework.boot.actuate.endpoint.annotation.Endpoint");
|
||||
boolean hasManagementServerPropertiesClass = hasClass(
|
||||
"org.springframework.boot.actuate.autoconfigure.web.server.ManagementServerProperties");
|
||||
hasActuator = hasEndpointClass && hasManagementServerPropertiesClass;
|
||||
@@ -77,8 +76,7 @@ public final class ManagementServerPortUtils {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
ManagementServerProperties properties = beanFactory
|
||||
.getBean(ManagementServerProperties.class);
|
||||
ManagementServerProperties properties = beanFactory.getBean(ManagementServerProperties.class);
|
||||
return properties.getPort();
|
||||
}
|
||||
catch (NoSuchBeanDefinitionException ex) {
|
||||
@@ -123,8 +121,7 @@ public final class ManagementServerPortUtils {
|
||||
|
||||
ManagementServerProperties managementServerProperties;
|
||||
try {
|
||||
managementServerProperties = beanFactory
|
||||
.getBean(ManagementServerProperties.class);
|
||||
managementServerProperties = beanFactory.getBean(ManagementServerProperties.class);
|
||||
}
|
||||
catch (NoSuchBeanDefinitionException ex) {
|
||||
managementServerProperties = new ManagementServerProperties();
|
||||
@@ -138,10 +135,8 @@ public final class ManagementServerPortUtils {
|
||||
// Current context is not a webapp
|
||||
return DIFFERENT;
|
||||
}
|
||||
return ((port == null)
|
||||
|| (serverProperties.getPort() == null && port.equals(8080))
|
||||
|| (port != 0 && port.equals(serverProperties.getPort())) ? SAME
|
||||
: DIFFERENT);
|
||||
return ((port == null) || (serverProperties.getPort() == null && port.equals(8080))
|
||||
|| (port != 0 && port.equals(serverProperties.getPort())) ? SAME : DIFFERENT);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -37,8 +37,7 @@ public class CompositeDiscoveryClientAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
@Primary
|
||||
public CompositeDiscoveryClient compositeDiscoveryClient(
|
||||
List<DiscoveryClient> discoveryClients) {
|
||||
public CompositeDiscoveryClient compositeDiscoveryClient(List<DiscoveryClient> discoveryClients) {
|
||||
return new CompositeDiscoveryClient(discoveryClients);
|
||||
}
|
||||
|
||||
|
||||
@@ -36,8 +36,7 @@ public class ReactiveCompositeDiscoveryClient implements ReactiveDiscoveryClient
|
||||
|
||||
private final List<ReactiveDiscoveryClient> discoveryClients;
|
||||
|
||||
public ReactiveCompositeDiscoveryClient(
|
||||
List<ReactiveDiscoveryClient> discoveryClients) {
|
||||
public ReactiveCompositeDiscoveryClient(List<ReactiveDiscoveryClient> discoveryClients) {
|
||||
AnnotationAwareOrderComparator.sort(discoveryClients);
|
||||
this.discoveryClients = discoveryClients;
|
||||
}
|
||||
@@ -64,8 +63,7 @@ public class ReactiveCompositeDiscoveryClient implements ReactiveDiscoveryClient
|
||||
if (discoveryClients == null || discoveryClients.isEmpty()) {
|
||||
return Flux.empty();
|
||||
}
|
||||
return Flux.fromIterable(discoveryClients)
|
||||
.flatMap(ReactiveDiscoveryClient::getServices);
|
||||
return Flux.fromIterable(discoveryClients).flatMap(ReactiveDiscoveryClient::getServices);
|
||||
}
|
||||
|
||||
List<ReactiveDiscoveryClient> getDiscoveryClients() {
|
||||
|
||||
@@ -33,8 +33,8 @@ import org.springframework.core.Ordered;
|
||||
/**
|
||||
* @author Spencer Gibb
|
||||
*/
|
||||
public class DiscoveryClientHealthIndicator implements DiscoveryHealthIndicator, Ordered,
|
||||
ApplicationListener<InstanceRegisteredEvent<?>> {
|
||||
public class DiscoveryClientHealthIndicator
|
||||
implements DiscoveryHealthIndicator, Ordered, ApplicationListener<InstanceRegisteredEvent<?>> {
|
||||
|
||||
private final ObjectProvider<DiscoveryClient> discoveryClient;
|
||||
|
||||
@@ -67,10 +67,8 @@ public class DiscoveryClientHealthIndicator implements DiscoveryHealthIndicator,
|
||||
try {
|
||||
DiscoveryClient client = this.discoveryClient.getIfAvailable();
|
||||
List<String> services = client.getServices();
|
||||
String description = (this.properties.isIncludeDescription())
|
||||
? client.description() : "";
|
||||
builder.status(new Status("UP", description)).withDetail("services",
|
||||
services);
|
||||
String description = (this.properties.isIncludeDescription()) ? client.description() : "";
|
||||
builder.status(new Status("UP", description)).withDetail("services", services);
|
||||
}
|
||||
catch (Exception e) {
|
||||
this.log.error("Error", e);
|
||||
@@ -78,8 +76,7 @@ public class DiscoveryClientHealthIndicator implements DiscoveryHealthIndicator,
|
||||
}
|
||||
}
|
||||
else {
|
||||
builder.status(new Status(Status.UNKNOWN.getCode(),
|
||||
"Discovery Client not initialized"));
|
||||
builder.status(new Status(Status.UNKNOWN.getCode(), "Discovery Client not initialized"));
|
||||
}
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@@ -46,8 +46,7 @@ public class DiscoveryClientHealthIndicatorProperties {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
final StringBuffer sb = new StringBuffer(
|
||||
"DiscoveryClientHealthIndicatorProperties{");
|
||||
final StringBuffer sb = new StringBuffer("DiscoveryClientHealthIndicatorProperties{");
|
||||
sb.append("enabled=").append(this.enabled);
|
||||
sb.append(", includeDescription=").append(this.includeDescription);
|
||||
sb.append('}');
|
||||
|
||||
@@ -39,11 +39,10 @@ public class DiscoveryCompositeHealthContributor implements CompositeHealthContr
|
||||
|
||||
private Map<String, DiscoveryHealthIndicator> indicators;
|
||||
|
||||
public DiscoveryCompositeHealthContributor(
|
||||
Collection<DiscoveryHealthIndicator> indicators) {
|
||||
public DiscoveryCompositeHealthContributor(Collection<DiscoveryHealthIndicator> indicators) {
|
||||
Assert.notNull(indicators, "'indicators' must not be null");
|
||||
this.indicators = indicators.stream().collect(
|
||||
Collectors.toMap(DiscoveryHealthIndicator::getName, Function.identity()));
|
||||
this.indicators = indicators.stream()
|
||||
.collect(Collectors.toMap(DiscoveryHealthIndicator::getName, Function.identity()));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -56,8 +55,7 @@ public class DiscoveryCompositeHealthContributor implements CompositeHealthContr
|
||||
return this.indicators.values().stream().map(this::asNamedContributor).iterator();
|
||||
}
|
||||
|
||||
private NamedContributor<HealthContributor> asNamedContributor(
|
||||
DiscoveryHealthIndicator indicator) {
|
||||
private NamedContributor<HealthContributor> asNamedContributor(DiscoveryHealthIndicator indicator) {
|
||||
return new NamedContributor<HealthContributor>() {
|
||||
|
||||
@Override
|
||||
|
||||
@@ -39,15 +39,13 @@ import static java.util.Collections.emptyList;
|
||||
* @author Tim Ysewyn
|
||||
*/
|
||||
public class ReactiveDiscoveryClientHealthIndicator
|
||||
implements ReactiveDiscoveryHealthIndicator, Ordered,
|
||||
ApplicationListener<InstanceRegisteredEvent<?>> {
|
||||
implements ReactiveDiscoveryHealthIndicator, Ordered, ApplicationListener<InstanceRegisteredEvent<?>> {
|
||||
|
||||
private final ReactiveDiscoveryClient discoveryClient;
|
||||
|
||||
private final DiscoveryClientHealthIndicatorProperties properties;
|
||||
|
||||
private final Log log = LogFactory
|
||||
.getLog(ReactiveDiscoveryClientHealthIndicator.class);
|
||||
private final Log log = LogFactory.getLog(ReactiveDiscoveryClientHealthIndicator.class);
|
||||
|
||||
private AtomicBoolean discoveryInitialized = new AtomicBoolean(false);
|
||||
|
||||
@@ -72,8 +70,8 @@ public class ReactiveDiscoveryClientHealthIndicator
|
||||
return doHealthCheck();
|
||||
}
|
||||
else {
|
||||
return Mono.just(Health.status(new Status(Status.UNKNOWN.getCode(),
|
||||
"Discovery Client not initialized")).build());
|
||||
return Mono.just(
|
||||
Health.status(new Status(Status.UNKNOWN.getCode(), "Discovery Client not initialized")).build());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -33,16 +33,14 @@ import org.springframework.util.Assert;
|
||||
*
|
||||
* @author Tim Ysewyn
|
||||
*/
|
||||
public class ReactiveDiscoveryCompositeHealthContributor
|
||||
implements CompositeReactiveHealthContributor {
|
||||
public class ReactiveDiscoveryCompositeHealthContributor implements CompositeReactiveHealthContributor {
|
||||
|
||||
private Map<String, ReactiveDiscoveryHealthIndicator> indicators;
|
||||
|
||||
public ReactiveDiscoveryCompositeHealthContributor(
|
||||
Collection<ReactiveDiscoveryHealthIndicator> indicators) {
|
||||
public ReactiveDiscoveryCompositeHealthContributor(Collection<ReactiveDiscoveryHealthIndicator> indicators) {
|
||||
Assert.notNull(indicators, "'indicators' must not be null");
|
||||
this.indicators = indicators.stream().collect(Collectors
|
||||
.toMap(ReactiveDiscoveryHealthIndicator::getName, Function.identity()));
|
||||
this.indicators = indicators.stream()
|
||||
.collect(Collectors.toMap(ReactiveDiscoveryHealthIndicator::getName, Function.identity()));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -55,8 +53,7 @@ public class ReactiveDiscoveryCompositeHealthContributor
|
||||
return indicators.values().stream().map(this::asNamedContributor).iterator();
|
||||
}
|
||||
|
||||
private NamedContributor<ReactiveHealthContributor> asNamedContributor(
|
||||
ReactiveDiscoveryHealthIndicator indicator) {
|
||||
private NamedContributor<ReactiveHealthContributor> asNamedContributor(ReactiveDiscoveryHealthIndicator indicator) {
|
||||
return new NamedContributor<ReactiveHealthContributor>() {
|
||||
|
||||
@Override
|
||||
@@ -72,8 +69,7 @@ public class ReactiveDiscoveryCompositeHealthContributor
|
||||
};
|
||||
}
|
||||
|
||||
private ReactiveHealthIndicator asHealthIndicator(
|
||||
ReactiveDiscoveryHealthIndicator indicator) {
|
||||
private ReactiveHealthIndicator asHealthIndicator(ReactiveDiscoveryHealthIndicator indicator) {
|
||||
return (indicator != null) ? indicator::health : null;
|
||||
}
|
||||
|
||||
|
||||
@@ -49,8 +49,7 @@ import org.springframework.core.env.Environment;
|
||||
@EnableConfigurationProperties
|
||||
@ConditionalOnMissingBean(DiscoveryClient.class)
|
||||
@Deprecated
|
||||
public class NoopDiscoveryClientAutoConfiguration
|
||||
implements ApplicationListener<ContextRefreshedEvent> {
|
||||
public class NoopDiscoveryClientAutoConfiguration implements ApplicationListener<ContextRefreshedEvent> {
|
||||
|
||||
private final Log log = LogFactory.getLog(NoopDiscoveryClientAutoConfiguration.class);
|
||||
|
||||
@@ -79,8 +78,7 @@ public class NoopDiscoveryClientAutoConfiguration
|
||||
}
|
||||
int port = findPort();
|
||||
this.serviceInstance = new DefaultServiceInstance(
|
||||
this.environment.getProperty("spring.application.name", "application"),
|
||||
host, port, false);
|
||||
this.environment.getProperty("spring.application.name", "application"), host, port, false);
|
||||
}
|
||||
|
||||
private int findPort() {
|
||||
@@ -97,8 +95,7 @@ public class NoopDiscoveryClientAutoConfiguration
|
||||
else {
|
||||
// Apparently spring-web is not on the classpath
|
||||
if (this.log.isDebugEnabled()) {
|
||||
this.log.debug(
|
||||
"Could not locate port in embedded container (spring-web not available)");
|
||||
this.log.debug("Could not locate port in embedded container (spring-web not available)");
|
||||
}
|
||||
}
|
||||
return port;
|
||||
@@ -121,8 +118,7 @@ public class NoopDiscoveryClientAutoConfiguration
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnClass(name = {
|
||||
"org.springframework.web.context.support.GenericWebApplicationContext",
|
||||
@ConditionalOnClass(name = { "org.springframework.web.context.support.GenericWebApplicationContext",
|
||||
"org.springframework.boot.context.embedded.EmbeddedWebApplicationContext" })
|
||||
protected static class Boot15PortFinderConfiguration {
|
||||
|
||||
|
||||
@@ -46,8 +46,8 @@ public class SimpleDiscoveryClient implements DiscoveryClient {
|
||||
@Override
|
||||
public List<ServiceInstance> getInstances(String serviceId) {
|
||||
List<ServiceInstance> serviceInstances = new ArrayList<>();
|
||||
List<SimpleServiceInstance> serviceInstanceForService = this.simpleDiscoveryProperties
|
||||
.getInstances().get(serviceId);
|
||||
List<SimpleServiceInstance> serviceInstanceForService = this.simpleDiscoveryProperties.getInstances()
|
||||
.get(serviceId);
|
||||
|
||||
if (serviceInstanceForService != null) {
|
||||
serviceInstances.addAll(serviceInstanceForService);
|
||||
|
||||
@@ -39,10 +39,8 @@ import org.springframework.core.annotation.Order;
|
||||
* @author Biju Kunjummen
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@AutoConfigureBefore({ NoopDiscoveryClientAutoConfiguration.class,
|
||||
CommonsClientAutoConfiguration.class })
|
||||
public class SimpleDiscoveryClientAutoConfiguration
|
||||
implements ApplicationListener<WebServerInitializedEvent> {
|
||||
@AutoConfigureBefore({ NoopDiscoveryClientAutoConfiguration.class, CommonsClientAutoConfiguration.class })
|
||||
public class SimpleDiscoveryClientAutoConfiguration implements ApplicationListener<WebServerInitializedEvent> {
|
||||
|
||||
private ServerProperties server;
|
||||
|
||||
@@ -67,10 +65,8 @@ public class SimpleDiscoveryClientAutoConfiguration
|
||||
public SimpleDiscoveryProperties simpleDiscoveryProperties(
|
||||
@Value("${spring.application.name:application}") String serviceId) {
|
||||
simple.getLocal().setServiceId(serviceId);
|
||||
simple.getLocal()
|
||||
.setUri(URI.create(
|
||||
"http://" + this.inet.findFirstNonLoopbackHostInfo().getHostname()
|
||||
+ ":" + findPort()));
|
||||
simple.getLocal().setUri(
|
||||
URI.create("http://" + this.inet.findFirstNonLoopbackHostInfo().getHostname() + ":" + findPort()));
|
||||
return simple;
|
||||
}
|
||||
|
||||
@@ -84,8 +80,7 @@ public class SimpleDiscoveryClientAutoConfiguration
|
||||
if (port > 0) {
|
||||
return port;
|
||||
}
|
||||
if (this.server != null && this.server.getPort() != null
|
||||
&& this.server.getPort() > 0) {
|
||||
if (this.server != null && this.server.getPort() != null && this.server.getPort() > 0) {
|
||||
return this.server.getPort();
|
||||
}
|
||||
return 8080;
|
||||
@@ -95,10 +90,8 @@ public class SimpleDiscoveryClientAutoConfiguration
|
||||
public void onApplicationEvent(WebServerInitializedEvent webServerInitializedEvent) {
|
||||
this.port = webServerInitializedEvent.getWebServer().getPort();
|
||||
if (this.port > 0) {
|
||||
simple.getLocal()
|
||||
.setUri(URI.create("http://"
|
||||
+ this.inet.findFirstNonLoopbackHostInfo().getHostname() + ":"
|
||||
+ this.port));
|
||||
simple.getLocal().setUri(
|
||||
URI.create("http://" + this.inet.findFirstNonLoopbackHostInfo().getHostname() + ":" + this.port));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -31,8 +31,7 @@ public class SimpleReactiveDiscoveryClient implements ReactiveDiscoveryClient {
|
||||
|
||||
private SimpleReactiveDiscoveryProperties simpleDiscoveryProperties;
|
||||
|
||||
public SimpleReactiveDiscoveryClient(
|
||||
SimpleReactiveDiscoveryProperties simpleDiscoveryProperties) {
|
||||
public SimpleReactiveDiscoveryClient(SimpleReactiveDiscoveryProperties simpleDiscoveryProperties) {
|
||||
this.simpleDiscoveryProperties = simpleDiscoveryProperties;
|
||||
}
|
||||
|
||||
|
||||
@@ -52,8 +52,7 @@ import org.springframework.core.annotation.Order;
|
||||
@EnableConfigurationProperties(DiscoveryClientHealthIndicatorProperties.class)
|
||||
@AutoConfigureBefore(ReactiveCommonsClientAutoConfiguration.class)
|
||||
@AutoConfigureAfter(ReactiveCompositeDiscoveryClientAutoConfiguration.class)
|
||||
public class SimpleReactiveDiscoveryClientAutoConfiguration
|
||||
implements ApplicationListener<WebServerInitializedEvent> {
|
||||
public class SimpleReactiveDiscoveryClientAutoConfiguration implements ApplicationListener<WebServerInitializedEvent> {
|
||||
|
||||
@Autowired(required = false)
|
||||
private ServerProperties server;
|
||||
@@ -71,8 +70,8 @@ public class SimpleReactiveDiscoveryClientAutoConfiguration
|
||||
@Bean
|
||||
public SimpleReactiveDiscoveryProperties simpleReactiveDiscoveryProperties() {
|
||||
simple.getLocal().setServiceId(serviceId);
|
||||
simple.getLocal().setUri(URI.create("http://"
|
||||
+ inet.findFirstNonLoopbackHostInfo().getHostname() + ":" + findPort()));
|
||||
simple.getLocal()
|
||||
.setUri(URI.create("http://" + inet.findFirstNonLoopbackHostInfo().getHostname() + ":" + findPort()));
|
||||
return simple;
|
||||
}
|
||||
|
||||
@@ -96,8 +95,8 @@ public class SimpleReactiveDiscoveryClientAutoConfiguration
|
||||
public void onApplicationEvent(WebServerInitializedEvent webServerInitializedEvent) {
|
||||
port = webServerInitializedEvent.getWebServer().getPort();
|
||||
if (port > 0) {
|
||||
simple.getLocal().setUri(URI.create("http://"
|
||||
+ inet.findFirstNonLoopbackHostInfo().getHostname() + ":" + port));
|
||||
simple.getLocal()
|
||||
.setUri(URI.create("http://" + inet.findFirstNonLoopbackHostInfo().getHostname() + ":" + port));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,8 +109,7 @@ public class SimpleReactiveDiscoveryClientAutoConfiguration
|
||||
public ReactiveDiscoveryClientHealthIndicator simpleReactiveDiscoveryClientHealthIndicator(
|
||||
DiscoveryClientHealthIndicatorProperties properties,
|
||||
SimpleReactiveDiscoveryClient simpleReactiveDiscoveryClient) {
|
||||
return new ReactiveDiscoveryClientHealthIndicator(
|
||||
simpleReactiveDiscoveryClient, properties);
|
||||
return new ReactiveDiscoveryClientHealthIndicator(simpleReactiveDiscoveryClient, properties);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -52,8 +52,7 @@ public class CloudHypermediaAutoConfiguration {
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
public RemoteResourceRefresher discoveredResourceRefresher() {
|
||||
return new RemoteResourceRefresher(this.discoveredResources,
|
||||
this.properties.getRefresh().getFixedDelay(),
|
||||
return new RemoteResourceRefresher(this.discoveredResources, this.properties.getRefresh().getFixedDelay(),
|
||||
this.properties.getRefresh().getInitialDelay());
|
||||
}
|
||||
|
||||
|
||||
@@ -48,8 +48,7 @@ public class DiscoveredResource implements RemoteResource {
|
||||
|
||||
private Link link = null;
|
||||
|
||||
public DiscoveredResource(ServiceInstanceProvider provider,
|
||||
TraversalDefinition traversal) {
|
||||
public DiscoveredResource(ServiceInstanceProvider provider, TraversalDefinition traversal) {
|
||||
this.provider = provider;
|
||||
this.traversal = traversal;
|
||||
}
|
||||
@@ -73,8 +72,7 @@ public class DiscoveredResource implements RemoteResource {
|
||||
* {@link RestTemplate} in that case.
|
||||
*/
|
||||
public void setRestOperations(RestOperations restOperations) {
|
||||
this.restOperations = restOperations == null ? new RestTemplate()
|
||||
: restOperations;
|
||||
this.restOperations = restOperations == null ? new RestTemplate() : restOperations;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -133,8 +131,7 @@ public class DiscoveredResource implements RemoteResource {
|
||||
URI uri = service.getUri();
|
||||
String serviceId = service.getServiceId();
|
||||
|
||||
this.log.debug("Discovered {} system at {}. Discovering resource…", serviceId,
|
||||
uri);
|
||||
this.log.debug("Discovered {} system at {}. Discovering resource…", serviceId, uri);
|
||||
|
||||
Traverson traverson = new Traverson(uri, MediaTypes.HAL_JSON);
|
||||
Link link = this.traversal.buildTraversal(traverson).asTemplatedLink();
|
||||
|
||||
@@ -36,8 +36,7 @@ public class RemoteResourceRefresher extends ContextLifecycleScheduledTaskRegist
|
||||
|
||||
private final int initialDelay;
|
||||
|
||||
public RemoteResourceRefresher(List<RemoteResource> discoveredResources,
|
||||
int fixedDelay, int initialDelay) {
|
||||
public RemoteResourceRefresher(List<RemoteResource> discoveredResources, int fixedDelay, int initialDelay) {
|
||||
this.discoveredResources = discoveredResources;
|
||||
this.fixedDelay = fixedDelay;
|
||||
this.initialDelay = initialDelay;
|
||||
|
||||
@@ -64,8 +64,7 @@ public class AsyncLoadBalancerAutoConfiguration {
|
||||
static class LoadBalancerInterceptorConfig {
|
||||
|
||||
@Bean
|
||||
public AsyncLoadBalancerInterceptor asyncLoadBalancerInterceptor(
|
||||
LoadBalancerClient loadBalancerClient) {
|
||||
public AsyncLoadBalancerInterceptor asyncLoadBalancerInterceptor(LoadBalancerClient loadBalancerClient) {
|
||||
return new AsyncLoadBalancerInterceptor(loadBalancerClient);
|
||||
}
|
||||
|
||||
@@ -73,8 +72,7 @@ public class AsyncLoadBalancerAutoConfiguration {
|
||||
public AsyncRestTemplateCustomizer asyncRestTemplateCustomizer(
|
||||
final AsyncLoadBalancerInterceptor loadBalancerInterceptor) {
|
||||
return restTemplate -> {
|
||||
List<AsyncClientHttpRequestInterceptor> list = new ArrayList<>(
|
||||
restTemplate.getInterceptors());
|
||||
List<AsyncClientHttpRequestInterceptor> list = new ArrayList<>(restTemplate.getInterceptors());
|
||||
list.add(loadBalancerInterceptor);
|
||||
restTemplate.setInterceptors(list);
|
||||
};
|
||||
|
||||
@@ -38,22 +38,19 @@ public class AsyncLoadBalancerInterceptor implements AsyncClientHttpRequestInter
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListenableFuture<ClientHttpResponse> intercept(final HttpRequest request,
|
||||
final byte[] body, final AsyncClientHttpRequestExecution execution)
|
||||
throws IOException {
|
||||
public ListenableFuture<ClientHttpResponse> intercept(final HttpRequest request, final byte[] body,
|
||||
final AsyncClientHttpRequestExecution execution) throws IOException {
|
||||
final URI originalUri = request.getURI();
|
||||
String serviceName = originalUri.getHost();
|
||||
return this.loadBalancer.execute(serviceName,
|
||||
new LoadBalancerRequest<ListenableFuture<ClientHttpResponse>>() {
|
||||
@Override
|
||||
public ListenableFuture<ClientHttpResponse> apply(
|
||||
final ServiceInstance instance) throws Exception {
|
||||
HttpRequest serviceRequest = new ServiceRequestWrapper(request,
|
||||
instance, AsyncLoadBalancerInterceptor.this.loadBalancer);
|
||||
return execution.executeAsync(serviceRequest, body);
|
||||
}
|
||||
return this.loadBalancer.execute(serviceName, new LoadBalancerRequest<ListenableFuture<ClientHttpResponse>>() {
|
||||
@Override
|
||||
public ListenableFuture<ClientHttpResponse> apply(final ServiceInstance instance) throws Exception {
|
||||
HttpRequest serviceRequest = new ServiceRequestWrapper(request, instance,
|
||||
AsyncLoadBalancerInterceptor.this.loadBalancer);
|
||||
return execution.executeAsync(serviceRequest, body);
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -41,8 +41,8 @@ public class ClientHttpResponseStatusCodeException extends RetryableStatusCodeEx
|
||||
* @throws IOException Thrown if the {@link ClientHttpResponse} response code cannot
|
||||
* be retrieved.
|
||||
*/
|
||||
public ClientHttpResponseStatusCodeException(String serviceId,
|
||||
ClientHttpResponse response, byte[] body) throws IOException {
|
||||
public ClientHttpResponseStatusCodeException(String serviceId, ClientHttpResponse response, byte[] body)
|
||||
throws IOException {
|
||||
super(serviceId, response.getRawStatusCode(), response, null);
|
||||
this.response = new ClientHttpResponseWrapper(response, body);
|
||||
}
|
||||
|
||||
@@ -43,18 +43,15 @@ public class CompletionContext<RES, T> {
|
||||
this(status, null, response, null);
|
||||
}
|
||||
|
||||
public CompletionContext(Status status, Throwable throwable,
|
||||
Response<T> loadBalancerResponse) {
|
||||
public CompletionContext(Status status, Throwable throwable, Response<T> loadBalancerResponse) {
|
||||
this(status, throwable, loadBalancerResponse, null);
|
||||
}
|
||||
|
||||
public CompletionContext(Status status, Response<T> loadBalancerResponse,
|
||||
RES clientResponse) {
|
||||
public CompletionContext(Status status, Response<T> loadBalancerResponse, RES clientResponse) {
|
||||
this(status, null, loadBalancerResponse, clientResponse);
|
||||
}
|
||||
|
||||
public CompletionContext(Status status, Throwable throwable,
|
||||
Response<T> loadBalancerResponse, RES clientResponse) {
|
||||
public CompletionContext(Status status, Throwable throwable, Response<T> loadBalancerResponse, RES clientResponse) {
|
||||
this.status = status;
|
||||
this.throwable = throwable;
|
||||
this.loadBalancerResponse = loadBalancerResponse;
|
||||
|
||||
@@ -56,8 +56,7 @@ public class InterceptorRetryPolicy implements RetryPolicy {
|
||||
LoadBalancedRetryContext lbContext = (LoadBalancedRetryContext) context;
|
||||
if (lbContext.getRetryCount() == 0 && lbContext.getServiceInstance() == null) {
|
||||
// We haven't even tried to make the request yet so return true so we do
|
||||
lbContext.setServiceInstance(
|
||||
this.serviceInstanceChooser.choose(this.serviceName));
|
||||
lbContext.setServiceInstance(this.serviceInstanceChooser.choose(this.serviceName));
|
||||
return true;
|
||||
}
|
||||
return this.policy.canRetryNextServer(lbContext);
|
||||
|
||||
@@ -33,8 +33,7 @@ public interface LoadBalancedRetryFactory {
|
||||
* @param serviceInstanceChooser Used to get the next server from a load balancer.
|
||||
* @return A retry policy for the service.
|
||||
*/
|
||||
default LoadBalancedRetryPolicy createRetryPolicy(String service,
|
||||
ServiceInstanceChooser serviceInstanceChooser) {
|
||||
default LoadBalancedRetryPolicy createRetryPolicy(String service, ServiceInstanceChooser serviceInstanceChooser) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -72,8 +72,7 @@ public class LoadBalancerAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
public LoadBalancerRequestFactory loadBalancerRequestFactory(
|
||||
LoadBalancerClient loadBalancerClient) {
|
||||
public LoadBalancerRequestFactory loadBalancerRequestFactory(LoadBalancerClient loadBalancerClient) {
|
||||
return new LoadBalancerRequestFactory(loadBalancerClient, this.transformers);
|
||||
}
|
||||
|
||||
@@ -82,19 +81,16 @@ public class LoadBalancerAutoConfiguration {
|
||||
static class LoadBalancerInterceptorConfig {
|
||||
|
||||
@Bean
|
||||
public LoadBalancerInterceptor loadBalancerInterceptor(
|
||||
LoadBalancerClient loadBalancerClient,
|
||||
public LoadBalancerInterceptor loadBalancerInterceptor(LoadBalancerClient loadBalancerClient,
|
||||
LoadBalancerRequestFactory requestFactory) {
|
||||
return new LoadBalancerInterceptor(loadBalancerClient, requestFactory);
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
public RestTemplateCustomizer restTemplateCustomizer(
|
||||
final LoadBalancerInterceptor loadBalancerInterceptor) {
|
||||
public RestTemplateCustomizer restTemplateCustomizer(final LoadBalancerInterceptor loadBalancerInterceptor) {
|
||||
return restTemplate -> {
|
||||
List<ClientHttpRequestInterceptor> list = new ArrayList<>(
|
||||
restTemplate.getInterceptors());
|
||||
List<ClientHttpRequestInterceptor> list = new ArrayList<>(restTemplate.getInterceptors());
|
||||
list.add(loadBalancerInterceptor);
|
||||
restTemplate.setInterceptors(list);
|
||||
};
|
||||
@@ -128,16 +124,12 @@ public class LoadBalancerAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
public RetryLoadBalancerInterceptor loadBalancerInterceptor(
|
||||
LoadBalancerClient loadBalancerClient,
|
||||
LoadBalancerRetryProperties retryProperties,
|
||||
LoadBalancerRequestFactory requestFactory,
|
||||
LoadBalancedRetryFactory loadBalancedRetryFactory,
|
||||
LoadBalancerProperties properties,
|
||||
public RetryLoadBalancerInterceptor loadBalancerInterceptor(LoadBalancerClient loadBalancerClient,
|
||||
LoadBalancerRetryProperties retryProperties, LoadBalancerRequestFactory requestFactory,
|
||||
LoadBalancedRetryFactory loadBalancedRetryFactory, LoadBalancerProperties properties,
|
||||
ReactiveLoadBalancer.Factory<ServiceInstance> loadBalancerFactory) {
|
||||
return new RetryLoadBalancerInterceptor(loadBalancerClient, retryProperties,
|
||||
requestFactory, loadBalancedRetryFactory, properties,
|
||||
loadBalancerFactory);
|
||||
return new RetryLoadBalancerInterceptor(loadBalancerClient, retryProperties, requestFactory,
|
||||
loadBalancedRetryFactory, properties, loadBalancerFactory);
|
||||
}
|
||||
|
||||
@Bean
|
||||
@@ -145,8 +137,7 @@ public class LoadBalancerAutoConfiguration {
|
||||
public RestTemplateCustomizer restTemplateCustomizer(
|
||||
final RetryLoadBalancerInterceptor loadBalancerInterceptor) {
|
||||
return restTemplate -> {
|
||||
List<ClientHttpRequestInterceptor> list = new ArrayList<>(
|
||||
restTemplate.getInterceptors());
|
||||
List<ClientHttpRequestInterceptor> list = new ArrayList<>(restTemplate.getInterceptors());
|
||||
list.add(loadBalancerInterceptor);
|
||||
restTemplate.setInterceptors(list);
|
||||
};
|
||||
|
||||
@@ -53,8 +53,7 @@ public interface LoadBalancerClient extends ServiceInstanceChooser {
|
||||
* @return The result of the LoadBalancerRequest callback on the selected
|
||||
* ServiceInstance.
|
||||
*/
|
||||
<T> T execute(String serviceId, ServiceInstance serviceInstance,
|
||||
LoadBalancerRequest<T> request) throws IOException;
|
||||
<T> T execute(String serviceId, ServiceInstance serviceInstance, LoadBalancerRequest<T> request) throws IOException;
|
||||
|
||||
/**
|
||||
* Creates a proper URI with a real host and port for systems to utilize. Some systems
|
||||
|
||||
@@ -37,8 +37,7 @@ public class LoadBalancerInterceptor implements ClientHttpRequestInterceptor {
|
||||
|
||||
private LoadBalancerRequestFactory requestFactory;
|
||||
|
||||
public LoadBalancerInterceptor(LoadBalancerClient loadBalancer,
|
||||
LoadBalancerRequestFactory requestFactory) {
|
||||
public LoadBalancerInterceptor(LoadBalancerClient loadBalancer, LoadBalancerRequestFactory requestFactory) {
|
||||
this.loadBalancer = loadBalancer;
|
||||
this.requestFactory = requestFactory;
|
||||
}
|
||||
@@ -53,10 +52,8 @@ public class LoadBalancerInterceptor implements ClientHttpRequestInterceptor {
|
||||
final ClientHttpRequestExecution execution) throws IOException {
|
||||
final URI originalUri = request.getURI();
|
||||
String serviceName = originalUri.getHost();
|
||||
Assert.state(serviceName != null,
|
||||
"Request URI does not contain a valid hostname: " + originalUri);
|
||||
return this.loadBalancer.execute(serviceName,
|
||||
this.requestFactory.createRequest(request, body, execution));
|
||||
Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri);
|
||||
return this.loadBalancer.execute(serviceName, this.requestFactory.createRequest(request, body, execution));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -34,8 +34,7 @@ public interface LoadBalancerLifecycle<RC, RES, T> {
|
||||
* @param serverTypeClass The type of Server that the LoadBalancer retrieves
|
||||
* @return <code>true</code> if the lifecycle should be used to process given classes
|
||||
*/
|
||||
default boolean supports(Class requestContextClass, Class responseClass,
|
||||
Class serverTypeClass) {
|
||||
default boolean supports(Class requestContextClass, Class responseClass, Class serverTypeClass) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -36,14 +36,13 @@ public final class LoadBalancerLifecycleValidator {
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static Set<LoadBalancerLifecycle> getSupportedLifecycleProcessors(
|
||||
Map<String, LoadBalancerLifecycle> lifecycleProcessors,
|
||||
Class requestContextClass, Class clientResponseClass, Class serverTypeClass) {
|
||||
Map<String, LoadBalancerLifecycle> lifecycleProcessors, Class requestContextClass,
|
||||
Class clientResponseClass, Class serverTypeClass) {
|
||||
if (lifecycleProcessors == null) {
|
||||
return new HashSet<>();
|
||||
}
|
||||
return lifecycleProcessors.values().stream()
|
||||
.filter(lifecycle -> lifecycle.supports(requestContextClass,
|
||||
clientResponseClass, serverTypeClass))
|
||||
.filter(lifecycle -> lifecycle.supports(requestContextClass, clientResponseClass, serverTypeClass))
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
|
||||
@@ -46,16 +46,13 @@ public class LoadBalancerRequestFactory {
|
||||
this.loadBalancer = loadBalancer;
|
||||
}
|
||||
|
||||
public LoadBalancerRequest<ClientHttpResponse> createRequest(
|
||||
final HttpRequest request, final byte[] body,
|
||||
public LoadBalancerRequest<ClientHttpResponse> createRequest(final HttpRequest request, final byte[] body,
|
||||
final ClientHttpRequestExecution execution) {
|
||||
return instance -> {
|
||||
HttpRequest serviceRequest = new ServiceRequestWrapper(request, instance,
|
||||
this.loadBalancer);
|
||||
HttpRequest serviceRequest = new ServiceRequestWrapper(request, instance, this.loadBalancer);
|
||||
if (this.transformers != null) {
|
||||
for (LoadBalancerRequestTransformer transformer : this.transformers) {
|
||||
serviceRequest = transformer.transformRequest(serviceRequest,
|
||||
instance);
|
||||
serviceRequest = transformer.transformRequest(serviceRequest, instance);
|
||||
}
|
||||
}
|
||||
return execution.execute(serviceRequest, body);
|
||||
|
||||
@@ -53,12 +53,9 @@ public final class LoadBalancerUriTools {
|
||||
// https://github.com/spring-cloud/spring-cloud-gateway/blob/master/spring-cloud-gateway-core/
|
||||
// src/main/java/org/springframework/cloud/gateway/support/ServerWebExchangeUtils.java
|
||||
private static boolean containsEncodedParts(URI uri) {
|
||||
boolean encoded = (uri.getRawQuery() != null
|
||||
&& uri.getRawQuery().contains(PERCENTAGE_SIGN))
|
||||
|| (uri.getRawPath() != null
|
||||
&& uri.getRawPath().contains(PERCENTAGE_SIGN))
|
||||
|| (uri.getRawFragment() != null
|
||||
&& uri.getRawFragment().contains(PERCENTAGE_SIGN));
|
||||
boolean encoded = (uri.getRawQuery() != null && uri.getRawQuery().contains(PERCENTAGE_SIGN))
|
||||
|| (uri.getRawPath() != null && uri.getRawPath().contains(PERCENTAGE_SIGN))
|
||||
|| (uri.getRawFragment() != null && uri.getRawFragment().contains(PERCENTAGE_SIGN));
|
||||
// Verify if it is really fully encoded. Treat partial encoded as unencoded.
|
||||
if (encoded) {
|
||||
try {
|
||||
@@ -107,15 +104,12 @@ public final class LoadBalancerUriTools {
|
||||
}
|
||||
|
||||
boolean encoded = containsEncodedParts(original);
|
||||
return UriComponentsBuilder.fromUri(original).scheme(scheme).host(host).port(port)
|
||||
.build(encoded).toUri();
|
||||
return UriComponentsBuilder.fromUri(original).scheme(scheme).host(host).port(port).build(encoded).toUri();
|
||||
}
|
||||
|
||||
private static String computeScheme(URI original, ServiceInstance serviceInstance) {
|
||||
String originalOrDefault = Optional.ofNullable(original.getScheme())
|
||||
.orElse(DEFAULT_SCHEME);
|
||||
if (serviceInstance.isSecure()
|
||||
&& INSECURE_SCHEME_MAPPINGS.containsKey(originalOrDefault)) {
|
||||
String originalOrDefault = Optional.ofNullable(original.getScheme()).orElse(DEFAULT_SCHEME);
|
||||
if (serviceInstance.isSecure() && INSECURE_SCHEME_MAPPINGS.containsKey(originalOrDefault)) {
|
||||
return INSECURE_SCHEME_MAPPINGS.get(originalOrDefault);
|
||||
}
|
||||
return originalOrDefault;
|
||||
|
||||
@@ -56,11 +56,9 @@ public class RetryLoadBalancerInterceptor implements ClientHttpRequestIntercepto
|
||||
|
||||
private final ReactiveLoadBalancer.Factory<ServiceInstance> loadBalancerFactory;
|
||||
|
||||
public RetryLoadBalancerInterceptor(LoadBalancerClient loadBalancer,
|
||||
LoadBalancerRetryProperties retryProperties,
|
||||
LoadBalancerRequestFactory requestFactory,
|
||||
LoadBalancedRetryFactory lbRetryFactory, LoadBalancerProperties properties,
|
||||
ReactiveLoadBalancer.Factory<ServiceInstance> loadBalancerFactory) {
|
||||
public RetryLoadBalancerInterceptor(LoadBalancerClient loadBalancer, LoadBalancerRetryProperties retryProperties,
|
||||
LoadBalancerRequestFactory requestFactory, LoadBalancedRetryFactory lbRetryFactory,
|
||||
LoadBalancerProperties properties, ReactiveLoadBalancer.Factory<ServiceInstance> loadBalancerFactory) {
|
||||
this.loadBalancer = loadBalancer;
|
||||
this.retryProperties = retryProperties;
|
||||
this.requestFactory = requestFactory;
|
||||
@@ -74,10 +72,8 @@ public class RetryLoadBalancerInterceptor implements ClientHttpRequestIntercepto
|
||||
final ClientHttpRequestExecution execution) throws IOException {
|
||||
final URI originalUri = request.getURI();
|
||||
final String serviceName = originalUri.getHost();
|
||||
Assert.state(serviceName != null,
|
||||
"Request URI does not contain a valid hostname: " + originalUri);
|
||||
final LoadBalancedRetryPolicy retryPolicy = lbRetryFactory
|
||||
.createRetryPolicy(serviceName, loadBalancer);
|
||||
Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri);
|
||||
final LoadBalancedRetryPolicy retryPolicy = lbRetryFactory.createRetryPolicy(serviceName, loadBalancer);
|
||||
RetryTemplate template = createRetryTemplate(serviceName, request, retryPolicy);
|
||||
return template.execute(context -> {
|
||||
ServiceInstance serviceInstance = null;
|
||||
@@ -87,33 +83,27 @@ public class RetryLoadBalancerInterceptor implements ClientHttpRequestIntercepto
|
||||
}
|
||||
Set<LoadBalancerLifecycle> supportedLifecycleProcessors = LoadBalancerLifecycleValidator
|
||||
.getSupportedLifecycleProcessors(
|
||||
loadBalancerFactory.getInstances(serviceName,
|
||||
LoadBalancerLifecycle.class),
|
||||
HttpRequestContext.class, ClientHttpResponse.class,
|
||||
ServiceInstance.class);
|
||||
loadBalancerFactory.getInstances(serviceName, LoadBalancerLifecycle.class),
|
||||
HttpRequestContext.class, ClientHttpResponse.class, ServiceInstance.class);
|
||||
String hint = getHint(serviceName);
|
||||
DefaultRequest<HttpRequestContext> lbRequest = new DefaultRequest<>(
|
||||
new HttpRequestContext(request, hint));
|
||||
supportedLifecycleProcessors
|
||||
.forEach(lifecycle -> lifecycle.onStart(lbRequest));
|
||||
DefaultRequest<HttpRequestContext> lbRequest = new DefaultRequest<>(new HttpRequestContext(request, hint));
|
||||
supportedLifecycleProcessors.forEach(lifecycle -> lifecycle.onStart(lbRequest));
|
||||
if (serviceInstance == null) {
|
||||
serviceInstance = loadBalancer.choose(serviceName, lbRequest);
|
||||
}
|
||||
Response<ServiceInstance> lbResponse = new DefaultResponse(serviceInstance);
|
||||
if (serviceInstance == null) {
|
||||
supportedLifecycleProcessors.forEach(lifecycle -> lifecycle.onComplete(
|
||||
new CompletionContext<ClientHttpResponse, ServiceInstance>(
|
||||
supportedLifecycleProcessors.forEach(
|
||||
lifecycle -> lifecycle.onComplete(new CompletionContext<ClientHttpResponse, ServiceInstance>(
|
||||
CompletionContext.Status.DISCARD, lbResponse)));
|
||||
}
|
||||
ClientHttpResponse response = RetryLoadBalancerInterceptor.this.loadBalancer
|
||||
.execute(serviceName, serviceInstance,
|
||||
requestFactory.createRequest(request, body, execution));
|
||||
ClientHttpResponse response = RetryLoadBalancerInterceptor.this.loadBalancer.execute(serviceName,
|
||||
serviceInstance, requestFactory.createRequest(request, body, execution));
|
||||
int statusCode = response.getRawStatusCode();
|
||||
if (retryPolicy != null && retryPolicy.retryableStatusCode(statusCode)) {
|
||||
byte[] bodyCopy = StreamUtils.copyToByteArray(response.getBody());
|
||||
response.close();
|
||||
throw new ClientHttpResponseStatusCodeException(serviceName, response,
|
||||
bodyCopy);
|
||||
throw new ClientHttpResponseStatusCodeException(serviceName, response, bodyCopy);
|
||||
}
|
||||
return response;
|
||||
}, new LoadBalancedRecoveryCallback<ClientHttpResponse, ClientHttpResponse>() {
|
||||
@@ -121,8 +111,7 @@ public class RetryLoadBalancerInterceptor implements ClientHttpRequestIntercepto
|
||||
// LoadBalancedRecoveryCallback are
|
||||
// the same. In most cases they would be different.
|
||||
@Override
|
||||
protected ClientHttpResponse createResponse(ClientHttpResponse response,
|
||||
URI uri) {
|
||||
protected ClientHttpResponse createResponse(ClientHttpResponse response, URI uri) {
|
||||
return response;
|
||||
}
|
||||
});
|
||||
@@ -132,16 +121,14 @@ public class RetryLoadBalancerInterceptor implements ClientHttpRequestIntercepto
|
||||
LoadBalancedRetryPolicy retryPolicy) {
|
||||
RetryTemplate template = new RetryTemplate();
|
||||
BackOffPolicy backOffPolicy = lbRetryFactory.createBackOffPolicy(serviceName);
|
||||
template.setBackOffPolicy(
|
||||
backOffPolicy == null ? new NoBackOffPolicy() : backOffPolicy);
|
||||
template.setBackOffPolicy(backOffPolicy == null ? new NoBackOffPolicy() : backOffPolicy);
|
||||
template.setThrowLastExceptionOnExhausted(true);
|
||||
RetryListener[] retryListeners = lbRetryFactory.createRetryListeners(serviceName);
|
||||
if (retryListeners != null && retryListeners.length != 0) {
|
||||
template.setListeners(retryListeners);
|
||||
}
|
||||
template.setRetryPolicy(!retryProperties.isEnabled() || retryPolicy == null
|
||||
? new NeverRetryPolicy() : new InterceptorRetryPolicy(request,
|
||||
retryPolicy, loadBalancer, serviceName));
|
||||
template.setRetryPolicy(!retryProperties.isEnabled() || retryPolicy == null ? new NeverRetryPolicy()
|
||||
: new InterceptorRetryPolicy(request, retryPolicy, loadBalancer, serviceName));
|
||||
return template;
|
||||
}
|
||||
|
||||
|
||||
@@ -32,8 +32,7 @@ public class RetryableStatusCodeException extends IOException {
|
||||
|
||||
private final URI uri;
|
||||
|
||||
public RetryableStatusCodeException(String serviceId, int statusCode, Object response,
|
||||
URI uri) {
|
||||
public RetryableStatusCodeException(String serviceId, int statusCode, Object response, URI uri) {
|
||||
super(String.format(MESSAGE, serviceId, statusCode));
|
||||
this.response = response;
|
||||
this.uri = uri;
|
||||
|
||||
@@ -31,8 +31,7 @@ public class ServiceRequestWrapper extends HttpRequestWrapper {
|
||||
|
||||
private final LoadBalancerClient loadBalancer;
|
||||
|
||||
public ServiceRequestWrapper(HttpRequest request, ServiceInstance instance,
|
||||
LoadBalancerClient loadBalancer) {
|
||||
public ServiceRequestWrapper(HttpRequest request, ServiceInstance instance, LoadBalancerClient loadBalancer) {
|
||||
super(request);
|
||||
this.instance = instance;
|
||||
this.loadBalancer = loadBalancer;
|
||||
|
||||
@@ -40,8 +40,7 @@ public class DeferringLoadBalancerExchangeFilterFunction<T extends ExchangeFilte
|
||||
|
||||
private T delegate;
|
||||
|
||||
public DeferringLoadBalancerExchangeFilterFunction(
|
||||
ObjectProvider<T> exchangeFilterFunctionProvider) {
|
||||
public DeferringLoadBalancerExchangeFilterFunction(ObjectProvider<T> exchangeFilterFunctionProvider) {
|
||||
this.exchangeFilterFunctionProvider = exchangeFilterFunctionProvider;
|
||||
}
|
||||
|
||||
@@ -56,8 +55,7 @@ public class DeferringLoadBalancerExchangeFilterFunction<T extends ExchangeFilte
|
||||
if (delegate == null) {
|
||||
delegate = exchangeFilterFunctionProvider.getIfAvailable();
|
||||
if (delegate == null) {
|
||||
throw new IllegalStateException(
|
||||
"ReactorLoadBalancerExchangeFilterFunction not available.");
|
||||
throw new IllegalStateException("ReactorLoadBalancerExchangeFilterFunction not available.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,10 +48,8 @@ public class LoadBalancerBeanPostProcessorAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
public LoadBalancerWebClientBuilderBeanPostProcessor loadBalancerWebClientBuilderBeanPostProcessor(
|
||||
DeferringLoadBalancerExchangeFilterFunction deferringExchangeFilterFunction,
|
||||
ApplicationContext context) {
|
||||
return new LoadBalancerWebClientBuilderBeanPostProcessor(
|
||||
deferringExchangeFilterFunction, context);
|
||||
DeferringLoadBalancerExchangeFilterFunction deferringExchangeFilterFunction, ApplicationContext context) {
|
||||
return new LoadBalancerWebClientBuilderBeanPostProcessor(deferringExchangeFilterFunction, context);
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@@ -62,14 +60,12 @@ public class LoadBalancerBeanPostProcessorAutoConfiguration {
|
||||
@Primary
|
||||
DeferringLoadBalancerExchangeFilterFunction<ReactorLoadBalancerExchangeFilterFunction> reactorDeferringLoadBalancerExchangeFilterFunction(
|
||||
ObjectProvider<ReactorLoadBalancerExchangeFilterFunction> exchangeFilterFunctionProvider) {
|
||||
return new DeferringLoadBalancerExchangeFilterFunction<>(
|
||||
exchangeFilterFunctionProvider);
|
||||
return new DeferringLoadBalancerExchangeFilterFunction<>(exchangeFilterFunctionProvider);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static final class OnAnyLoadBalancerImplementationPresentCondition
|
||||
extends AnyNestedCondition {
|
||||
static final class OnAnyLoadBalancerImplementationPresentCondition extends AnyNestedCondition {
|
||||
|
||||
private OnAnyLoadBalancerImplementationPresentCondition() {
|
||||
super(ConfigurationPhase.REGISTER_BEAN);
|
||||
|
||||
@@ -37,15 +37,13 @@ public class LoadBalancerWebClientBuilderBeanPostProcessor implements BeanPostPr
|
||||
private final ApplicationContext context;
|
||||
|
||||
public LoadBalancerWebClientBuilderBeanPostProcessor(
|
||||
DeferringLoadBalancerExchangeFilterFunction exchangeFilterFunction,
|
||||
ApplicationContext context) {
|
||||
DeferringLoadBalancerExchangeFilterFunction exchangeFilterFunction, ApplicationContext context) {
|
||||
this.exchangeFilterFunction = exchangeFilterFunction;
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object postProcessBeforeInitialization(Object bean, String beanName)
|
||||
throws BeansException {
|
||||
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
|
||||
if (bean instanceof WebClient.Builder) {
|
||||
if (context.findAnnotationOnBean(beanName, LoadBalanced.class) == null) {
|
||||
return bean;
|
||||
|
||||
@@ -40,10 +40,8 @@ public class ReactorLoadBalancerClientAutoConfiguration {
|
||||
@ConditionalOnMissingBean
|
||||
@Bean
|
||||
public ReactorLoadBalancerExchangeFilterFunction loadBalancerExchangeFilterFunction(
|
||||
ReactiveLoadBalancer.Factory loadBalancerFactory,
|
||||
LoadBalancerProperties properties) {
|
||||
return new ReactorLoadBalancerExchangeFilterFunction(loadBalancerFactory,
|
||||
properties);
|
||||
ReactiveLoadBalancer.Factory loadBalancerFactory, LoadBalancerProperties properties) {
|
||||
return new ReactorLoadBalancerExchangeFilterFunction(loadBalancerFactory, properties);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -49,41 +49,33 @@ import org.springframework.web.reactive.function.client.ExchangeFunction;
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
public class ReactorLoadBalancerExchangeFilterFunction implements ExchangeFilterFunction {
|
||||
|
||||
private static final Log LOG = LogFactory
|
||||
.getLog(ReactorLoadBalancerExchangeFilterFunction.class);
|
||||
private static final Log LOG = LogFactory.getLog(ReactorLoadBalancerExchangeFilterFunction.class);
|
||||
|
||||
private final ReactiveLoadBalancer.Factory<ServiceInstance> loadBalancerFactory;
|
||||
|
||||
private final LoadBalancerProperties properties;
|
||||
|
||||
public ReactorLoadBalancerExchangeFilterFunction(
|
||||
ReactiveLoadBalancer.Factory<ServiceInstance> loadBalancerFactory,
|
||||
public ReactorLoadBalancerExchangeFilterFunction(ReactiveLoadBalancer.Factory<ServiceInstance> loadBalancerFactory,
|
||||
LoadBalancerProperties properties) {
|
||||
this.loadBalancerFactory = loadBalancerFactory;
|
||||
this.properties = properties;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<ClientResponse> filter(ClientRequest clientRequest,
|
||||
ExchangeFunction next) {
|
||||
public Mono<ClientResponse> filter(ClientRequest clientRequest, ExchangeFunction next) {
|
||||
URI originalUrl = clientRequest.url();
|
||||
String serviceId = originalUrl.getHost();
|
||||
if (serviceId == null) {
|
||||
String message = String.format(
|
||||
"Request URI does not contain a valid hostname: %s",
|
||||
originalUrl.toString());
|
||||
String message = String.format("Request URI does not contain a valid hostname: %s", originalUrl.toString());
|
||||
if (LOG.isWarnEnabled()) {
|
||||
LOG.warn(message);
|
||||
}
|
||||
return Mono.just(
|
||||
ClientResponse.create(HttpStatus.BAD_REQUEST).body(message).build());
|
||||
return Mono.just(ClientResponse.create(HttpStatus.BAD_REQUEST).body(message).build());
|
||||
}
|
||||
Set<LoadBalancerLifecycle> supportedLifecycleProcessors = LoadBalancerLifecycleValidator
|
||||
.getSupportedLifecycleProcessors(
|
||||
loadBalancerFactory.getInstances(serviceId,
|
||||
LoadBalancerLifecycle.class),
|
||||
ClientRequestContext.class, ClientResponse.class,
|
||||
ServiceInstance.class);
|
||||
loadBalancerFactory.getInstances(serviceId, LoadBalancerLifecycle.class),
|
||||
ClientRequestContext.class, ClientResponse.class, ServiceInstance.class);
|
||||
String hint = getHint(serviceId);
|
||||
DefaultRequest<ClientRequestContext> lbRequest = new DefaultRequest<>(
|
||||
new ClientRequestContext(clientRequest, hint));
|
||||
@@ -95,31 +87,24 @@ public class ReactorLoadBalancerExchangeFilterFunction implements ExchangeFilter
|
||||
if (LOG.isWarnEnabled()) {
|
||||
LOG.warn(message);
|
||||
}
|
||||
supportedLifecycleProcessors.forEach(
|
||||
lifecycle -> lifecycle.onComplete(new CompletionContext<>(
|
||||
CompletionContext.Status.DISCARD, lbResponse)));
|
||||
supportedLifecycleProcessors.forEach(lifecycle -> lifecycle
|
||||
.onComplete(new CompletionContext<>(CompletionContext.Status.DISCARD, lbResponse)));
|
||||
return Mono.just(ClientResponse.create(HttpStatus.SERVICE_UNAVAILABLE)
|
||||
.body(serviceInstanceUnavailableMessage(serviceId)).build());
|
||||
}
|
||||
|
||||
if (LOG.isDebugEnabled()) {
|
||||
LOG.debug(String.format(
|
||||
"Load balancer has retrieved the instance for service %s: %s",
|
||||
serviceId, instance.getUri()));
|
||||
LOG.debug(String.format("Load balancer has retrieved the instance for service %s: %s", serviceId,
|
||||
instance.getUri()));
|
||||
}
|
||||
ClientRequest newRequest = buildClientRequest(clientRequest,
|
||||
reconstructURI(instance, originalUrl));
|
||||
ClientRequest newRequest = buildClientRequest(clientRequest, reconstructURI(instance, originalUrl));
|
||||
return next.exchange(newRequest)
|
||||
.doOnError(throwable -> supportedLifecycleProcessors
|
||||
.forEach(lifecycle -> lifecycle.onComplete(
|
||||
new CompletionContext<ClientResponse, ServiceInstance>(
|
||||
CompletionContext.Status.FAILED, throwable,
|
||||
lbResponse))))
|
||||
.doOnSuccess(clientResponse -> supportedLifecycleProcessors
|
||||
.forEach(lifecycle -> lifecycle.onComplete(
|
||||
new CompletionContext<ClientResponse, ServiceInstance>(
|
||||
CompletionContext.Status.SUCCESS, lbResponse,
|
||||
clientResponse))));
|
||||
.doOnError(throwable -> supportedLifecycleProcessors.forEach(
|
||||
lifecycle -> lifecycle.onComplete(new CompletionContext<ClientResponse, ServiceInstance>(
|
||||
CompletionContext.Status.FAILED, throwable, lbResponse))))
|
||||
.doOnSuccess(clientResponse -> supportedLifecycleProcessors.forEach(
|
||||
lifecycle -> lifecycle.onComplete(new CompletionContext<ClientResponse, ServiceInstance>(
|
||||
CompletionContext.Status.SUCCESS, lbResponse, clientResponse))));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -127,10 +112,8 @@ public class ReactorLoadBalancerExchangeFilterFunction implements ExchangeFilter
|
||||
return LoadBalancerUriTools.reconstructURI(instance, original);
|
||||
}
|
||||
|
||||
protected Mono<Response<ServiceInstance>> choose(String serviceId,
|
||||
Request<ClientRequestContext> request) {
|
||||
ReactiveLoadBalancer<ServiceInstance> loadBalancer = loadBalancerFactory
|
||||
.getInstance(serviceId);
|
||||
protected Mono<Response<ServiceInstance>> choose(String serviceId, Request<ClientRequestContext> request) {
|
||||
ReactiveLoadBalancer<ServiceInstance> loadBalancer = loadBalancerFactory.getInstance(serviceId);
|
||||
if (loadBalancer == null) {
|
||||
return Mono.just(new EmptyResponse());
|
||||
}
|
||||
@@ -142,11 +125,9 @@ public class ReactorLoadBalancerExchangeFilterFunction implements ExchangeFilter
|
||||
}
|
||||
|
||||
private ClientRequest buildClientRequest(ClientRequest request, URI uri) {
|
||||
return ClientRequest.create(request.method(), uri)
|
||||
.headers(headers -> headers.addAll(request.headers()))
|
||||
return ClientRequest.create(request.method(), uri).headers(headers -> headers.addAll(request.headers()))
|
||||
.cookies(cookies -> cookies.addAll(request.cookies()))
|
||||
.attributes(attributes -> attributes.putAll(request.attributes()))
|
||||
.body(request.body()).build();
|
||||
.attributes(attributes -> attributes.putAll(request.attributes())).body(request.body()).build();
|
||||
}
|
||||
|
||||
private String getHint(String serviceId) {
|
||||
|
||||
@@ -45,11 +45,9 @@ import org.springframework.core.env.Environment;
|
||||
* @author Spencer Gibb
|
||||
*/
|
||||
public abstract class AbstractAutoServiceRegistration<R extends Registration>
|
||||
implements AutoServiceRegistration, ApplicationContextAware,
|
||||
ApplicationListener<WebServerInitializedEvent> {
|
||||
implements AutoServiceRegistration, ApplicationContextAware, ApplicationListener<WebServerInitializedEvent> {
|
||||
|
||||
private static final Log logger = LogFactory
|
||||
.getLog(AbstractAutoServiceRegistration.class);
|
||||
private static final Log logger = LogFactory.getLog(AbstractAutoServiceRegistration.class);
|
||||
|
||||
private final ServiceRegistry<R> serviceRegistry;
|
||||
|
||||
@@ -92,8 +90,7 @@ public abstract class AbstractAutoServiceRegistration<R extends Registration>
|
||||
public void bind(WebServerInitializedEvent event) {
|
||||
ApplicationContext context = event.getApplicationContext();
|
||||
if (context instanceof ConfigurableWebServerApplicationContext) {
|
||||
if ("management".equals(((ConfigurableWebServerApplicationContext) context)
|
||||
.getServerNamespace())) {
|
||||
if ("management".equals(((ConfigurableWebServerApplicationContext) context).getServerNamespace())) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -102,8 +99,7 @@ public abstract class AbstractAutoServiceRegistration<R extends Registration>
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setApplicationContext(ApplicationContext applicationContext)
|
||||
throws BeansException {
|
||||
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
|
||||
this.context = applicationContext;
|
||||
this.environment = this.context.getEnvironment();
|
||||
}
|
||||
@@ -133,14 +129,12 @@ public abstract class AbstractAutoServiceRegistration<R extends Registration>
|
||||
// only initialize if nonSecurePort is greater than 0 and it isn't already running
|
||||
// because of containerPortInitializer below
|
||||
if (!this.running.get()) {
|
||||
this.context.publishEvent(
|
||||
new InstancePreRegisteredEvent(this, getRegistration()));
|
||||
this.context.publishEvent(new InstancePreRegisteredEvent(this, getRegistration()));
|
||||
register();
|
||||
if (shouldRegisterManagement()) {
|
||||
registerManagement();
|
||||
}
|
||||
this.context.publishEvent(
|
||||
new InstanceRegisteredEvent<>(this, getConfiguration()));
|
||||
this.context.publishEvent(new InstanceRegisteredEvent<>(this, getConfiguration()));
|
||||
this.running.compareAndSet(false, true);
|
||||
}
|
||||
|
||||
@@ -152,8 +146,7 @@ public abstract class AbstractAutoServiceRegistration<R extends Registration>
|
||||
*/
|
||||
protected boolean shouldRegisterManagement() {
|
||||
if (this.properties == null || this.properties.isRegisterManagement()) {
|
||||
return getManagementPort() != null
|
||||
&& ManagementServerPortUtils.isDifferent(this.context);
|
||||
return getManagementPort() != null && ManagementServerPortUtils.isDifferent(this.context);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -28,8 +28,7 @@ import org.springframework.context.annotation.Import;
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@Import(AutoServiceRegistrationConfiguration.class)
|
||||
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled",
|
||||
matchIfMissing = true)
|
||||
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true)
|
||||
public class AutoServiceRegistrationAutoConfiguration {
|
||||
|
||||
@Autowired(required = false)
|
||||
@@ -41,8 +40,8 @@ public class AutoServiceRegistrationAutoConfiguration {
|
||||
@PostConstruct
|
||||
protected void init() {
|
||||
if (this.autoServiceRegistration == null && this.properties.isFailFast()) {
|
||||
throw new IllegalStateException("Auto Service Registration has "
|
||||
+ "been requested, but there is no AutoServiceRegistration bean");
|
||||
throw new IllegalStateException(
|
||||
"Auto Service Registration has " + "been requested, but there is no AutoServiceRegistration bean");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -25,8 +25,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@EnableConfigurationProperties(AutoServiceRegistrationProperties.class)
|
||||
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled",
|
||||
matchIfMissing = true)
|
||||
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true)
|
||||
public class AutoServiceRegistrationConfiguration {
|
||||
|
||||
}
|
||||
|
||||
@@ -40,10 +40,8 @@ public class ServiceRegistryAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnAvailableEndpoint
|
||||
public ServiceRegistryEndpoint serviceRegistryEndpoint(
|
||||
ServiceRegistry serviceRegistry) {
|
||||
ServiceRegistryEndpoint endpoint = new ServiceRegistryEndpoint(
|
||||
serviceRegistry);
|
||||
public ServiceRegistryEndpoint serviceRegistryEndpoint(ServiceRegistry serviceRegistry) {
|
||||
ServiceRegistryEndpoint endpoint = new ServiceRegistryEndpoint(serviceRegistry);
|
||||
endpoint.setRegistration(this.registration);
|
||||
return endpoint;
|
||||
}
|
||||
|
||||
@@ -51,8 +51,7 @@ public class ServiceRegistryEndpoint {
|
||||
Assert.notNull(status, "status may not by null");
|
||||
|
||||
if (this.registration == null) {
|
||||
return ResponseEntity.status(HttpStatus.NOT_FOUND)
|
||||
.body("no registration found");
|
||||
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("no registration found");
|
||||
}
|
||||
|
||||
this.serviceRegistry.setStatus(this.registration, status);
|
||||
@@ -62,12 +61,10 @@ public class ServiceRegistryEndpoint {
|
||||
@ReadOperation
|
||||
public ResponseEntity getStatus() {
|
||||
if (this.registration == null) {
|
||||
return ResponseEntity.status(HttpStatus.NOT_FOUND)
|
||||
.body("no registration found");
|
||||
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("no registration found");
|
||||
}
|
||||
|
||||
return ResponseEntity.ok()
|
||||
.body(this.serviceRegistry.getStatus(this.registration));
|
||||
return ResponseEntity.ok().body(this.serviceRegistry.getStatus(this.registration));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -49,8 +49,7 @@ public interface ApacheHttpClientConnectionManagerFactory {
|
||||
* manager.
|
||||
* @return A new {@link HttpClientConnectionManager}.
|
||||
*/
|
||||
HttpClientConnectionManager newConnectionManager(boolean disableSslValidation,
|
||||
int maxTotalConnections, int maxConnectionsPerRoute, long timeToLive,
|
||||
TimeUnit timeUnit, RegistryBuilder registryBuilder);
|
||||
HttpClientConnectionManager newConnectionManager(boolean disableSslValidation, int maxTotalConnections,
|
||||
int maxConnectionsPerRoute, long timeToLive, TimeUnit timeUnit, RegistryBuilder registryBuilder);
|
||||
|
||||
}
|
||||
|
||||
@@ -44,34 +44,29 @@ import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
|
||||
* @author Ryan Baxter
|
||||
* @author Michael Wirth
|
||||
*/
|
||||
public class DefaultApacheHttpClientConnectionManagerFactory
|
||||
implements ApacheHttpClientConnectionManagerFactory {
|
||||
public class DefaultApacheHttpClientConnectionManagerFactory implements ApacheHttpClientConnectionManagerFactory {
|
||||
|
||||
private static final Log LOG = LogFactory
|
||||
.getLog(DefaultApacheHttpClientConnectionManagerFactory.class);
|
||||
private static final Log LOG = LogFactory.getLog(DefaultApacheHttpClientConnectionManagerFactory.class);
|
||||
|
||||
public HttpClientConnectionManager newConnectionManager(boolean disableSslValidation,
|
||||
int maxTotalConnections, int maxConnectionsPerRoute) {
|
||||
return newConnectionManager(disableSslValidation, maxTotalConnections,
|
||||
maxConnectionsPerRoute, -1, TimeUnit.MILLISECONDS, null);
|
||||
public HttpClientConnectionManager newConnectionManager(boolean disableSslValidation, int maxTotalConnections,
|
||||
int maxConnectionsPerRoute) {
|
||||
return newConnectionManager(disableSslValidation, maxTotalConnections, maxConnectionsPerRoute, -1,
|
||||
TimeUnit.MILLISECONDS, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpClientConnectionManager newConnectionManager(boolean disableSslValidation,
|
||||
int maxTotalConnections, int maxConnectionsPerRoute, long timeToLive,
|
||||
TimeUnit timeUnit, RegistryBuilder registryBuilder) {
|
||||
public HttpClientConnectionManager newConnectionManager(boolean disableSslValidation, int maxTotalConnections,
|
||||
int maxConnectionsPerRoute, long timeToLive, TimeUnit timeUnit, RegistryBuilder registryBuilder) {
|
||||
if (registryBuilder == null) {
|
||||
registryBuilder = RegistryBuilder.<ConnectionSocketFactory>create()
|
||||
.register(HTTP_SCHEME, PlainConnectionSocketFactory.INSTANCE);
|
||||
registryBuilder = RegistryBuilder.<ConnectionSocketFactory>create().register(HTTP_SCHEME,
|
||||
PlainConnectionSocketFactory.INSTANCE);
|
||||
}
|
||||
if (disableSslValidation) {
|
||||
try {
|
||||
final SSLContext sslContext = SSLContext.getInstance("SSL");
|
||||
sslContext.init(null,
|
||||
new TrustManager[] { new DisabledValidationTrustManager() },
|
||||
new SecureRandom());
|
||||
registryBuilder.register(HTTPS_SCHEME, new SSLConnectionSocketFactory(
|
||||
sslContext, NoopHostnameVerifier.INSTANCE));
|
||||
sslContext.init(null, new TrustManager[] { new DisabledValidationTrustManager() }, new SecureRandom());
|
||||
registryBuilder.register(HTTPS_SCHEME,
|
||||
new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE));
|
||||
}
|
||||
catch (NoSuchAlgorithmException e) {
|
||||
LOG.warn("Error creating SSLContext", e);
|
||||
@@ -81,13 +76,12 @@ public class DefaultApacheHttpClientConnectionManagerFactory
|
||||
}
|
||||
}
|
||||
else {
|
||||
registryBuilder.register("https",
|
||||
SSLConnectionSocketFactory.getSocketFactory());
|
||||
registryBuilder.register("https", SSLConnectionSocketFactory.getSocketFactory());
|
||||
}
|
||||
final Registry<ConnectionSocketFactory> registry = registryBuilder.build();
|
||||
|
||||
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(
|
||||
registry, null, null, null, timeToLive, timeUnit);
|
||||
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry, null,
|
||||
null, null, timeToLive, timeUnit);
|
||||
connectionManager.setMaxTotal(maxTotalConnections);
|
||||
connectionManager.setDefaultMaxPerRoute(maxConnectionsPerRoute);
|
||||
|
||||
@@ -97,13 +91,11 @@ public class DefaultApacheHttpClientConnectionManagerFactory
|
||||
class DisabledValidationTrustManager implements X509TrustManager {
|
||||
|
||||
@Override
|
||||
public void checkClientTrusted(X509Certificate[] x509Certificates, String s)
|
||||
throws CertificateException {
|
||||
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkServerTrusted(X509Certificate[] x509Certificates, String s)
|
||||
throws CertificateException {
|
||||
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -38,8 +38,7 @@ public class DefaultApacheHttpClientFactory implements ApacheHttpClientFactory {
|
||||
*/
|
||||
@Override
|
||||
public HttpClientBuilder createBuilder() {
|
||||
return this.builder.disableContentCompression().disableCookieManagement()
|
||||
.useSystemProperties();
|
||||
return this.builder.disableContentCompression().disableCookieManagement().useSystemProperties();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -25,12 +25,10 @@ import okhttp3.ConnectionPool;
|
||||
*
|
||||
* @author Ryan Baxter
|
||||
*/
|
||||
public class DefaultOkHttpClientConnectionPoolFactory
|
||||
implements OkHttpClientConnectionPoolFactory {
|
||||
public class DefaultOkHttpClientConnectionPoolFactory implements OkHttpClientConnectionPoolFactory {
|
||||
|
||||
@Override
|
||||
public ConnectionPool create(int maxIdleConnections, long keepAliveDuration,
|
||||
TimeUnit timeUnit) {
|
||||
public ConnectionPool create(int maxIdleConnections, long keepAliveDuration, TimeUnit timeUnit) {
|
||||
return new ConnectionPool(maxIdleConnections, keepAliveDuration, timeUnit);
|
||||
}
|
||||
|
||||
|
||||
@@ -53,8 +53,7 @@ public class DefaultOkHttpClientFactory implements OkHttpClientFactory {
|
||||
SSLContext sslContext = SSLContext.getInstance("SSL");
|
||||
sslContext.init(null, trustManagers, new java.security.SecureRandom());
|
||||
SSLSocketFactory disabledSSLSocketFactory = sslContext.getSocketFactory();
|
||||
this.builder.sslSocketFactory(disabledSSLSocketFactory,
|
||||
disabledTrustManager);
|
||||
this.builder.sslSocketFactory(disabledSSLSocketFactory, disabledTrustManager);
|
||||
this.builder.hostnameVerifier(new TrustAllHostnames());
|
||||
}
|
||||
catch (NoSuchAlgorithmException e) {
|
||||
|
||||
@@ -33,8 +33,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
public class HttpClientConfiguration {
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnProperty(name = "spring.cloud.httpclientfactories.apache.enabled",
|
||||
matchIfMissing = true)
|
||||
@ConditionalOnProperty(name = "spring.cloud.httpclientfactories.apache.enabled", matchIfMissing = true)
|
||||
@ConditionalOnClass(HttpClient.class)
|
||||
static class ApacheHttpClientConfiguration {
|
||||
|
||||
@@ -52,16 +51,14 @@ public class HttpClientConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
public ApacheHttpClientFactory apacheHttpClientFactory(
|
||||
HttpClientBuilder builder) {
|
||||
public ApacheHttpClientFactory apacheHttpClientFactory(HttpClientBuilder builder) {
|
||||
return new DefaultApacheHttpClientFactory(builder);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnProperty(name = "spring.cloud.httpclientfactories.ok.enabled",
|
||||
matchIfMissing = true)
|
||||
@ConditionalOnProperty(name = "spring.cloud.httpclientfactories.ok.enabled", matchIfMissing = true)
|
||||
@ConditionalOnClass(OkHttpClient.class)
|
||||
static class OkHttpClientConfiguration {
|
||||
|
||||
|
||||
@@ -34,7 +34,6 @@ public interface OkHttpClientConnectionPoolFactory {
|
||||
* @param timeUnit The time unit for the keep-alive duration.
|
||||
* @return A new {@link ConnectionPool}.
|
||||
*/
|
||||
ConnectionPool create(int maxIdleConnections, long keepAliveDuration,
|
||||
TimeUnit timeUnit);
|
||||
ConnectionPool create(int maxIdleConnections, long keepAliveDuration, TimeUnit timeUnit);
|
||||
|
||||
}
|
||||
|
||||
@@ -45,13 +45,11 @@ public interface OkHttpClientFactory {
|
||||
class DisableValidationTrustManager implements X509TrustManager {
|
||||
|
||||
@Override
|
||||
public void checkClientTrusted(X509Certificate[] x509Certificates, String s)
|
||||
throws CertificateException {
|
||||
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkServerTrusted(X509Certificate[] x509Certificates, String s)
|
||||
throws CertificateException {
|
||||
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -39,8 +39,7 @@ public final class IdUtils {
|
||||
return getDefaultInstanceId(resolver, true);
|
||||
}
|
||||
|
||||
public static String getDefaultInstanceId(PropertyResolver resolver,
|
||||
boolean includeHostname) {
|
||||
public static String getDefaultInstanceId(PropertyResolver resolver, boolean includeHostname) {
|
||||
String vcapInstanceId = resolver.getProperty("vcap.application.instance_id");
|
||||
if (StringUtils.hasText(vcapInstanceId)) {
|
||||
return vcapInstanceId;
|
||||
@@ -54,8 +53,7 @@ public final class IdUtils {
|
||||
|
||||
String namePart = combineParts(hostname, SEPARATOR, appName);
|
||||
|
||||
String indexPart = resolver.getProperty("spring.application.instance_id",
|
||||
resolver.getProperty("server.port"));
|
||||
String indexPart = resolver.getProperty("spring.application.instance_id", resolver.getProperty("server.port"));
|
||||
|
||||
return combineParts(namePart, SEPARATOR, indexPart);
|
||||
}
|
||||
@@ -77,8 +75,7 @@ public final class IdUtils {
|
||||
return DEFAULT_SERVICE_ID_STRING;
|
||||
}
|
||||
|
||||
public static String combineParts(String firstPart, String separator,
|
||||
String secondPart) {
|
||||
public static String combineParts(String firstPart, String separator, String secondPart) {
|
||||
String combined = null;
|
||||
if (firstPart != null && secondPart != null) {
|
||||
combined = firstPart + separator + secondPart;
|
||||
|
||||
@@ -75,8 +75,8 @@ public class InetUtils implements Closeable {
|
||||
InetAddress result = null;
|
||||
try {
|
||||
int lowest = Integer.MAX_VALUE;
|
||||
for (Enumeration<NetworkInterface> nics = NetworkInterface
|
||||
.getNetworkInterfaces(); nics.hasMoreElements();) {
|
||||
for (Enumeration<NetworkInterface> nics = NetworkInterface.getNetworkInterfaces(); nics
|
||||
.hasMoreElements();) {
|
||||
NetworkInterface ifc = nics.nextElement();
|
||||
if (ifc.isUp()) {
|
||||
this.log.trace("Testing interface: " + ifc.getDisplayName());
|
||||
|
||||
@@ -54,8 +54,8 @@ public abstract class SpringFactoryImportSelector<T>
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected SpringFactoryImportSelector() {
|
||||
this.annotationClass = (Class<T>) GenericTypeResolver
|
||||
.resolveTypeArgument(this.getClass(), SpringFactoryImportSelector.class);
|
||||
this.annotationClass = (Class<T>) GenericTypeResolver.resolveTypeArgument(this.getClass(),
|
||||
SpringFactoryImportSelector.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -63,15 +63,15 @@ public abstract class SpringFactoryImportSelector<T>
|
||||
if (!isEnabled()) {
|
||||
return new String[0];
|
||||
}
|
||||
AnnotationAttributes attributes = AnnotationAttributes.fromMap(
|
||||
metadata.getAnnotationAttributes(this.annotationClass.getName(), true));
|
||||
AnnotationAttributes attributes = AnnotationAttributes
|
||||
.fromMap(metadata.getAnnotationAttributes(this.annotationClass.getName(), true));
|
||||
|
||||
Assert.notNull(attributes, "No " + getSimpleName() + " attributes found. Is "
|
||||
+ metadata.getClassName() + " annotated with @" + getSimpleName() + "?");
|
||||
Assert.notNull(attributes, "No " + getSimpleName() + " attributes found. Is " + metadata.getClassName()
|
||||
+ " annotated with @" + getSimpleName() + "?");
|
||||
|
||||
// Find all possible auto configuration classes, filtering duplicates
|
||||
List<String> factories = new ArrayList<>(new LinkedHashSet<>(SpringFactoriesLoader
|
||||
.loadFactoryNames(this.annotationClass, this.beanClassLoader)));
|
||||
List<String> factories = new ArrayList<>(new LinkedHashSet<>(
|
||||
SpringFactoriesLoader.loadFactoryNames(this.annotationClass, this.beanClassLoader)));
|
||||
|
||||
if (factories.isEmpty() && !hasDefaultFactory()) {
|
||||
throw new IllegalStateException("Annotation @" + getSimpleName()
|
||||
|
||||
@@ -28,18 +28,17 @@ import org.springframework.boot.diagnostics.FailureAnalysis;
|
||||
* @author Marcin Grzejszczak
|
||||
* @since 1.3.6
|
||||
*/
|
||||
public final class CompatibilityNotMetFailureAnalyzer
|
||||
extends AbstractFailureAnalyzer<CompatibilityNotMetException> {
|
||||
public final class CompatibilityNotMetFailureAnalyzer extends AbstractFailureAnalyzer<CompatibilityNotMetException> {
|
||||
|
||||
@Override
|
||||
protected FailureAnalysis analyze(Throwable rootFailure,
|
||||
CompatibilityNotMetException cause) {
|
||||
protected FailureAnalysis analyze(Throwable rootFailure, CompatibilityNotMetException cause) {
|
||||
return new FailureAnalysis(getDescription(cause), getAction(cause), cause);
|
||||
}
|
||||
|
||||
private String getDescription(CompatibilityNotMetException ex) {
|
||||
return String.format("Your project setup is incompatible with our requirements "
|
||||
+ "due to following reasons:%s", descriptions(ex.results));
|
||||
return String.format(
|
||||
"Your project setup is incompatible with our requirements " + "due to following reasons:%s",
|
||||
descriptions(ex.results));
|
||||
}
|
||||
|
||||
private String descriptions(List<VerificationResult> results) {
|
||||
@@ -51,8 +50,7 @@ public final class CompatibilityNotMetFailureAnalyzer
|
||||
}
|
||||
|
||||
private String getAction(CompatibilityNotMetException ex) {
|
||||
return String.format("Consider applying the following actions:%s",
|
||||
actions(ex.results));
|
||||
return String.format("Consider applying the following actions:%s", actions(ex.results));
|
||||
}
|
||||
|
||||
private String actions(List<VerificationResult> results) {
|
||||
|
||||
@@ -33,24 +33,20 @@ import org.springframework.context.annotation.Configuration;
|
||||
* @since 1.3.6
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnProperty(value = "spring.cloud.compatibility-verifier.enabled",
|
||||
matchIfMissing = true)
|
||||
@ConditionalOnProperty(value = "spring.cloud.compatibility-verifier.enabled", matchIfMissing = true)
|
||||
@AutoConfigureOrder(0)
|
||||
@EnableConfigurationProperties(CompatibilityVerifierProperties.class)
|
||||
public class CompatibilityVerifierAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
CompositeCompatibilityVerifier compositeCompatibilityVerifier(
|
||||
List<CompatibilityVerifier> verifiers) {
|
||||
CompositeCompatibilityVerifier verifier = new CompositeCompatibilityVerifier(
|
||||
verifiers);
|
||||
CompositeCompatibilityVerifier compositeCompatibilityVerifier(List<CompatibilityVerifier> verifiers) {
|
||||
CompositeCompatibilityVerifier verifier = new CompositeCompatibilityVerifier(verifiers);
|
||||
verifier.verifyDependencies();
|
||||
return verifier;
|
||||
}
|
||||
|
||||
@Bean
|
||||
SpringBootVersionVerifier springBootVersionVerifier(
|
||||
CompatibilityVerifierProperties properties) {
|
||||
SpringBootVersionVerifier springBootVersionVerifier(CompatibilityVerifierProperties properties) {
|
||||
return new SpringBootVersionVerifier(properties.getCompatibleBootVersions());
|
||||
}
|
||||
|
||||
|
||||
@@ -28,8 +28,7 @@ import org.apache.commons.logging.LogFactory;
|
||||
*/
|
||||
class CompositeCompatibilityVerifier {
|
||||
|
||||
private static final Log log = LogFactory
|
||||
.getLog(CompositeCompatibilityVerifier.class);
|
||||
private static final Log log = LogFactory.getLog(CompositeCompatibilityVerifier.class);
|
||||
|
||||
private final List<CompatibilityVerifier> verifiers;
|
||||
|
||||
|
||||
@@ -69,8 +69,7 @@ public class SSLContextFactory {
|
||||
throw new KeyStoreException("Keystore not specified.");
|
||||
}
|
||||
if (!properties.getKeyStore().exists()) {
|
||||
throw new KeyStoreException(
|
||||
"Keystore not exists: " + properties.getKeyStore());
|
||||
throw new KeyStoreException("Keystore not exists: " + properties.getKeyStore());
|
||||
}
|
||||
|
||||
KeyStore result = KeyStore.getInstance(properties.getKeyStoreType());
|
||||
@@ -93,8 +92,8 @@ public class SSLContextFactory {
|
||||
return result;
|
||||
}
|
||||
|
||||
private static void loadKeyStore(KeyStore keyStore, Resource keyStoreResource,
|
||||
char[] keyStorePassword) throws IOException, GeneralSecurityException {
|
||||
private static void loadKeyStore(KeyStore keyStore, Resource keyStoreResource, char[] keyStorePassword)
|
||||
throws IOException, GeneralSecurityException {
|
||||
try (InputStream inputStream = keyStoreResource.getInputStream()) {
|
||||
keyStore.load(inputStream, keyStorePassword);
|
||||
}
|
||||
@@ -105,8 +104,7 @@ public class SSLContextFactory {
|
||||
return null;
|
||||
}
|
||||
if (!properties.getTrustStore().exists()) {
|
||||
throw new KeyStoreException(
|
||||
"KeyStore not exists: " + properties.getTrustStore());
|
||||
throw new KeyStoreException("KeyStore not exists: " + properties.getTrustStore());
|
||||
}
|
||||
|
||||
KeyStore result = KeyStore.getInstance(properties.getTrustStoreType());
|
||||
|
||||
@@ -71,8 +71,7 @@ class SpringBootVersionVerifier implements CompatibilityVerifier {
|
||||
public boolean isCompatible() {
|
||||
try {
|
||||
// deprecated 1.5
|
||||
Class.forName(
|
||||
"org.springframework.boot.context.config.ResourceNotFoundException");
|
||||
Class.forName("org.springframework.boot.context.config.ResourceNotFoundException");
|
||||
return true;
|
||||
}
|
||||
catch (ClassNotFoundException e) {
|
||||
@@ -179,8 +178,7 @@ class SpringBootVersionVerifier implements CompatibilityVerifier {
|
||||
public boolean isCompatible() {
|
||||
try {
|
||||
// since 2.3
|
||||
Class.forName(
|
||||
"org.springframework.boot.context.propertie.BoundConfigurationProperties");
|
||||
Class.forName("org.springframework.boot.context.propertie.BoundConfigurationProperties");
|
||||
return true;
|
||||
}
|
||||
catch (ClassNotFoundException e) {
|
||||
@@ -194,20 +192,18 @@ class SpringBootVersionVerifier implements CompatibilityVerifier {
|
||||
private String errorDescription() {
|
||||
String versionFromManifest = getVersionFromManifest();
|
||||
if (StringUtils.hasText(versionFromManifest)) {
|
||||
return String.format(
|
||||
"Spring Boot [%s] is not compatible with this Spring Cloud release train",
|
||||
return String.format("Spring Boot [%s] is not compatible with this Spring Cloud release train",
|
||||
versionFromManifest);
|
||||
}
|
||||
return "Spring Boot is not compatible with this Spring Cloud release train";
|
||||
}
|
||||
|
||||
private String action() {
|
||||
return String.format(
|
||||
"Change Spring Boot version to one of the following versions %s .\n"
|
||||
+ "You can find the latest Spring Boot versions here [%s]. \n"
|
||||
+ "If you want to learn more about the Spring Cloud Release train compatibility, you "
|
||||
+ "can visit this page [%s] and check the [Release Trains] section.\n"
|
||||
+ "If you want to disable this check, just set the property [spring.cloud.compatibility-verifier.enabled=false]",
|
||||
return String.format("Change Spring Boot version to one of the following versions %s .\n"
|
||||
+ "You can find the latest Spring Boot versions here [%s]. \n"
|
||||
+ "If you want to learn more about the Spring Cloud Release train compatibility, you "
|
||||
+ "can visit this page [%s] and check the [Release Trains] section.\n"
|
||||
+ "If you want to disable this check, just set the property [spring.cloud.compatibility-verifier.enabled=false]",
|
||||
this.acceptedVersions, "https://spring.io/projects/spring-boot#learn",
|
||||
"https://spring.io/projects/spring-cloud#overview");
|
||||
}
|
||||
|
||||
@@ -54,8 +54,7 @@ public abstract class CloudFlux<T> extends Flux<T> {
|
||||
* @return a new {@link reactor.core.publisher.Flux} behaving like the fastest of its
|
||||
* sources
|
||||
*/
|
||||
public static <I> Flux<I> firstNonEmpty(
|
||||
Iterable<? extends Publisher<? extends I>> sources) {
|
||||
public static <I> Flux<I> firstNonEmpty(Iterable<? extends Publisher<? extends I>> sources) {
|
||||
return onAssembly(new FluxFirstNonEmptyEmitting<>(sources));
|
||||
}
|
||||
|
||||
|
||||
@@ -59,12 +59,10 @@ final class FluxFirstNonEmptyEmitting<T> extends Flux<T> implements SourceProduc
|
||||
Iterator<? extends Publisher<? extends T>> it;
|
||||
|
||||
try {
|
||||
it = Objects.requireNonNull(iterable.iterator(),
|
||||
"The iterator returned is null");
|
||||
it = Objects.requireNonNull(iterable.iterator(), "The iterator returned is null");
|
||||
}
|
||||
catch (Throwable e) {
|
||||
Operators.error(actual,
|
||||
Operators.onOperatorError(e, actual.currentContext()));
|
||||
Operators.error(actual, Operators.onOperatorError(e, actual.currentContext()));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -76,8 +74,7 @@ final class FluxFirstNonEmptyEmitting<T> extends Flux<T> implements SourceProduc
|
||||
b = it.hasNext();
|
||||
}
|
||||
catch (Throwable e) {
|
||||
Operators.error(actual,
|
||||
Operators.onOperatorError(e, actual.currentContext()));
|
||||
Operators.error(actual, Operators.onOperatorError(e, actual.currentContext()));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -88,12 +85,10 @@ final class FluxFirstNonEmptyEmitting<T> extends Flux<T> implements SourceProduc
|
||||
Publisher<? extends T> p;
|
||||
|
||||
try {
|
||||
p = Objects.requireNonNull(it.next(),
|
||||
"The Publisher returned by the iterator is null");
|
||||
p = Objects.requireNonNull(it.next(), "The Publisher returned by the iterator is null");
|
||||
}
|
||||
catch (Throwable e) {
|
||||
Operators.error(actual,
|
||||
Operators.onOperatorError(e, actual.currentContext()));
|
||||
Operators.error(actual, Operators.onOperatorError(e, actual.currentContext()));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -118,8 +113,7 @@ final class FluxFirstNonEmptyEmitting<T> extends Flux<T> implements SourceProduc
|
||||
Publisher<? extends T> p = a[0];
|
||||
|
||||
if (p == null) {
|
||||
Operators.error(actual,
|
||||
new NullPointerException("The single source Publisher is null"));
|
||||
Operators.error(actual, new NullPointerException("The single source Publisher is null"));
|
||||
}
|
||||
else {
|
||||
p.subscribe(actual);
|
||||
@@ -176,8 +170,7 @@ final class FluxFirstNonEmptyEmitting<T> extends Flux<T> implements SourceProduc
|
||||
return null;
|
||||
}
|
||||
|
||||
void subscribe(Publisher<? extends T>[] sources, int n,
|
||||
CoreSubscriber<? super T> actual) {
|
||||
void subscribe(Publisher<? extends T>[] sources, int n, CoreSubscriber<? super T> actual) {
|
||||
FirstNonEmptyEmittingSubscriber<T>[] a = subscribers;
|
||||
|
||||
for (int i = 0; i < n; i++) {
|
||||
@@ -195,8 +188,7 @@ final class FluxFirstNonEmptyEmitting<T> extends Flux<T> implements SourceProduc
|
||||
|
||||
if (p == null) {
|
||||
if (WIP.compareAndSet(this, Integer.MIN_VALUE, -1)) {
|
||||
actual.onError(new NullPointerException(
|
||||
"The " + i + " th Publisher source is null"));
|
||||
actual.onError(new NullPointerException("The " + i + " th Publisher source is null"));
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -264,8 +256,8 @@ final class FluxFirstNonEmptyEmitting<T> extends Flux<T> implements SourceProduc
|
||||
|
||||
}
|
||||
|
||||
static final class FirstNonEmptyEmittingSubscriber<T>
|
||||
extends Operators.DeferredSubscription implements InnerOperator<T, T> {
|
||||
static final class FirstNonEmptyEmittingSubscriber<T> extends Operators.DeferredSubscription
|
||||
implements InnerOperator<T, T> {
|
||||
|
||||
final RaceCoordinator<T> parent;
|
||||
|
||||
@@ -275,8 +267,7 @@ final class FluxFirstNonEmptyEmitting<T> extends Flux<T> implements SourceProduc
|
||||
|
||||
boolean won;
|
||||
|
||||
FirstNonEmptyEmittingSubscriber(CoreSubscriber<? super T> actual,
|
||||
RaceCoordinator<T> parent, int index) {
|
||||
FirstNonEmptyEmittingSubscriber(CoreSubscriber<? super T> actual, RaceCoordinator<T> parent, int index) {
|
||||
this.actual = actual;
|
||||
this.parent = parent;
|
||||
this.index = index;
|
||||
|
||||
@@ -30,8 +30,7 @@ import org.springframework.cloud.client.hypermedia.CloudHypermediaAutoConfigurat
|
||||
* @author Dave Syer
|
||||
*/
|
||||
@RunWith(Suite.class)
|
||||
@SuiteClasses({ EnableDiscoveryClientMissingImplTests.class,
|
||||
CloudHypermediaAutoConfigurationIntegrationTests.class })
|
||||
@SuiteClasses({ EnableDiscoveryClientMissingImplTests.class, CloudHypermediaAutoConfigurationIntegrationTests.class })
|
||||
@Ignore
|
||||
public class AdhocTestSuite {
|
||||
|
||||
|
||||
@@ -43,19 +43,14 @@ public class CommonsClientAutoConfigurationTests {
|
||||
|
||||
ApplicationContextRunner applicationContextRunner = new ApplicationContextRunner()
|
||||
.withConfiguration(AutoConfigurations.of(CommonsClientAutoConfiguration.class,
|
||||
SimpleDiscoveryClientAutoConfiguration.class,
|
||||
UtilAutoConfiguration.class));
|
||||
SimpleDiscoveryClientAutoConfiguration.class, UtilAutoConfiguration.class));
|
||||
|
||||
@Test
|
||||
public void beansCreatedNormally() {
|
||||
applicationContextRunner
|
||||
.withConfiguration(
|
||||
AutoConfigurations.of(HealthEndpointAutoConfiguration.class))
|
||||
.withPropertyValues("management.endpoints.web.exposure.include=features")
|
||||
.run(ctxt -> {
|
||||
applicationContextRunner.withConfiguration(AutoConfigurations.of(HealthEndpointAutoConfiguration.class))
|
||||
.withPropertyValues("management.endpoints.web.exposure.include=features").run(ctxt -> {
|
||||
then(ctxt.getBean(DiscoveryClientHealthIndicator.class)).isNotNull();
|
||||
then(ctxt.getBean(DiscoveryCompositeHealthContributor.class))
|
||||
.isNotNull();
|
||||
then(ctxt.getBean(DiscoveryCompositeHealthContributor.class)).isNotNull();
|
||||
then(ctxt.getBean(FeaturesEndpoint.class)).isNotNull();
|
||||
then(ctxt.getBeansOfType(HasFeatures.class).values()).isNotEmpty();
|
||||
});
|
||||
@@ -63,14 +58,10 @@ public class CommonsClientAutoConfigurationTests {
|
||||
|
||||
@Test
|
||||
public void disableAll() {
|
||||
applicationContextRunner
|
||||
.withPropertyValues("spring.cloud.discovery.enabled=false",
|
||||
"management.endpoints.web.exposure.include=features")
|
||||
.run(ctxt -> {
|
||||
assertThat(ctxt)
|
||||
.doesNotHaveBean(DiscoveryClientHealthIndicator.class);
|
||||
assertThat(ctxt)
|
||||
.doesNotHaveBean(DiscoveryCompositeHealthContributor.class);
|
||||
applicationContextRunner.withPropertyValues("spring.cloud.discovery.enabled=false",
|
||||
"management.endpoints.web.exposure.include=features").run(ctxt -> {
|
||||
assertThat(ctxt).doesNotHaveBean(DiscoveryClientHealthIndicator.class);
|
||||
assertThat(ctxt).doesNotHaveBean(DiscoveryCompositeHealthContributor.class);
|
||||
then(ctxt.getBean(FeaturesEndpoint.class)).isNotNull();
|
||||
// features actuator is independent of discovery
|
||||
assertThat(ctxt).doesNotHaveBean(HasFeatures.class);
|
||||
@@ -79,14 +70,10 @@ public class CommonsClientAutoConfigurationTests {
|
||||
|
||||
@Test
|
||||
public void disableBlocking() {
|
||||
applicationContextRunner
|
||||
.withPropertyValues("spring.cloud.discovery.blocking.enabled=false",
|
||||
"management.endpoints.web.exposure.include=features")
|
||||
.run(ctxt -> {
|
||||
assertThat(ctxt)
|
||||
.doesNotHaveBean(DiscoveryClientHealthIndicator.class);
|
||||
assertThat(ctxt)
|
||||
.doesNotHaveBean(DiscoveryCompositeHealthContributor.class);
|
||||
applicationContextRunner.withPropertyValues("spring.cloud.discovery.blocking.enabled=false",
|
||||
"management.endpoints.web.exposure.include=features").run(ctxt -> {
|
||||
assertThat(ctxt).doesNotHaveBean(DiscoveryClientHealthIndicator.class);
|
||||
assertThat(ctxt).doesNotHaveBean(DiscoveryCompositeHealthContributor.class);
|
||||
then(ctxt.getBean(FeaturesEndpoint.class)).isNotNull();
|
||||
// features actuator is independent of discovery
|
||||
assertThat(ctxt).doesNotHaveBean(HasFeatures.class);
|
||||
@@ -95,41 +82,30 @@ public class CommonsClientAutoConfigurationTests {
|
||||
|
||||
@Test
|
||||
public void disableAllIndividually() {
|
||||
applicationContextRunner.withPropertyValues(
|
||||
"spring.cloud.discovery.client.health-indicator.enabled=false",
|
||||
applicationContextRunner.withPropertyValues("spring.cloud.discovery.client.health-indicator.enabled=false",
|
||||
"spring.cloud.discovery.client.composite-indicator.enabled=false",
|
||||
"spring.cloud.features.enabled=false").run(ctxt -> {
|
||||
assertThat(ctxt)
|
||||
.doesNotHaveBean(DiscoveryClientHealthIndicator.class);
|
||||
assertThat(ctxt)
|
||||
.doesNotHaveBean(DiscoveryCompositeHealthContributor.class);
|
||||
assertThat(ctxt).doesNotHaveBean(DiscoveryClientHealthIndicator.class);
|
||||
assertThat(ctxt).doesNotHaveBean(DiscoveryCompositeHealthContributor.class);
|
||||
assertThat(ctxt).doesNotHaveBean(FeaturesEndpoint.class);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void disableHealthIndicator() {
|
||||
applicationContextRunner
|
||||
.withPropertyValues(
|
||||
"spring.cloud.discovery.client.health-indicator.enabled=false")
|
||||
applicationContextRunner.withPropertyValues("spring.cloud.discovery.client.health-indicator.enabled=false")
|
||||
.run(ctxt -> {
|
||||
assertThat(ctxt)
|
||||
.doesNotHaveBean(DiscoveryClientHealthIndicator.class);
|
||||
assertThat(ctxt)
|
||||
.doesNotHaveBean(DiscoveryCompositeHealthContributor.class);
|
||||
assertThat(ctxt).doesNotHaveBean(DiscoveryClientHealthIndicator.class);
|
||||
assertThat(ctxt).doesNotHaveBean(DiscoveryCompositeHealthContributor.class);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void worksWithoutActuator() {
|
||||
applicationContextRunner
|
||||
.withClassLoader(
|
||||
new FilteredClassLoader("org.springframework.boot.actuate"))
|
||||
applicationContextRunner.withClassLoader(new FilteredClassLoader("org.springframework.boot.actuate"))
|
||||
.run(context -> {
|
||||
assertThat(context)
|
||||
.doesNotHaveBean(DiscoveryClientHealthIndicator.class);
|
||||
assertThat(context)
|
||||
.doesNotHaveBean(DiscoveryCompositeHealthContributor.class);
|
||||
assertThat(context).doesNotHaveBean(DiscoveryClientHealthIndicator.class);
|
||||
assertThat(context).doesNotHaveBean(DiscoveryCompositeHealthContributor.class);
|
||||
then(context.getBeansOfType(HasFeatures.class).values()).isEmpty();
|
||||
});
|
||||
}
|
||||
@@ -146,12 +122,10 @@ public class CommonsClientAutoConfigurationTests {
|
||||
|
||||
@Test
|
||||
public void conditionalOnBlockingDiscoveryEnabledWorks() {
|
||||
applicationContextRunner
|
||||
.withUserConfiguration(BlockingDiscoveryEnabledConfig.class)
|
||||
applicationContextRunner.withUserConfiguration(BlockingDiscoveryEnabledConfig.class)
|
||||
.withPropertyValues("spring.cloud.discovery.blocking.enabled=false")
|
||||
.run(context -> assertThat(context).doesNotHaveBean(TestBean.class));
|
||||
applicationContextRunner
|
||||
.withUserConfiguration(BlockingDiscoveryEnabledConfig.class)
|
||||
applicationContextRunner.withUserConfiguration(BlockingDiscoveryEnabledConfig.class)
|
||||
.withPropertyValues("spring.cloud.discovery.blocking.enabled=true")
|
||||
.run(context -> assertThat(context.getBean(TestBean.class)).isNotNull());
|
||||
}
|
||||
|
||||
@@ -40,20 +40,15 @@ public class ReactiveCommonsClientAutoConfigurationTests {
|
||||
|
||||
ApplicationContextRunner applicationContextRunner = new ApplicationContextRunner()
|
||||
.withConfiguration(AutoConfigurations.of(CommonsClientAutoConfiguration.class,
|
||||
SimpleReactiveDiscoveryClientAutoConfiguration.class,
|
||||
UtilAutoConfiguration.class,
|
||||
SimpleReactiveDiscoveryClientAutoConfiguration.class, UtilAutoConfiguration.class,
|
||||
ReactiveCommonsClientAutoConfiguration.class));
|
||||
|
||||
@Test
|
||||
public void beansCreatedNormally() {
|
||||
applicationContextRunner
|
||||
.withPropertyValues("management.endpoints.web.exposure.include=features")
|
||||
applicationContextRunner.withPropertyValues("management.endpoints.web.exposure.include=features")
|
||||
.run(context -> {
|
||||
then(context.getBean(ReactiveDiscoveryClientHealthIndicator.class))
|
||||
.isNotNull();
|
||||
then(context
|
||||
.getBean(ReactiveDiscoveryCompositeHealthContributor.class))
|
||||
.isNotNull();
|
||||
then(context.getBean(ReactiveDiscoveryClientHealthIndicator.class)).isNotNull();
|
||||
then(context.getBean(ReactiveDiscoveryCompositeHealthContributor.class)).isNotNull();
|
||||
then(context.getBean(FeaturesEndpoint.class)).isNotNull();
|
||||
then(context.getBeansOfType(HasFeatures.class).values()).isNotEmpty();
|
||||
});
|
||||
@@ -61,14 +56,10 @@ public class ReactiveCommonsClientAutoConfigurationTests {
|
||||
|
||||
@Test
|
||||
public void disableAll() {
|
||||
applicationContextRunner
|
||||
.withPropertyValues("spring.cloud.discovery.enabled=false",
|
||||
"management.endpoints.web.exposure.include=features")
|
||||
.run(context -> {
|
||||
assertThat(context).doesNotHaveBean(
|
||||
ReactiveDiscoveryClientHealthIndicator.class);
|
||||
assertThat(context).doesNotHaveBean(
|
||||
ReactiveDiscoveryCompositeHealthContributor.class);
|
||||
applicationContextRunner.withPropertyValues("spring.cloud.discovery.enabled=false",
|
||||
"management.endpoints.web.exposure.include=features").run(context -> {
|
||||
assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class);
|
||||
assertThat(context).doesNotHaveBean(ReactiveDiscoveryCompositeHealthContributor.class);
|
||||
// features actuator is independent of discovery
|
||||
then(context.getBean(FeaturesEndpoint.class)).isNotNull();
|
||||
assertThat(context).doesNotHaveBean(HasFeatures.class);
|
||||
@@ -77,14 +68,10 @@ public class ReactiveCommonsClientAutoConfigurationTests {
|
||||
|
||||
@Test
|
||||
public void disableReactive() {
|
||||
applicationContextRunner
|
||||
.withPropertyValues("spring.cloud.discovery.reactive.enabled=false",
|
||||
"management.endpoints.web.exposure.include=features")
|
||||
.run(context -> {
|
||||
assertThat(context).doesNotHaveBean(
|
||||
ReactiveDiscoveryClientHealthIndicator.class);
|
||||
assertThat(context).doesNotHaveBean(
|
||||
ReactiveDiscoveryCompositeHealthContributor.class);
|
||||
applicationContextRunner.withPropertyValues("spring.cloud.discovery.reactive.enabled=false",
|
||||
"management.endpoints.web.exposure.include=features").run(context -> {
|
||||
assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class);
|
||||
assertThat(context).doesNotHaveBean(ReactiveDiscoveryCompositeHealthContributor.class);
|
||||
// features actuator is independent of discovery
|
||||
then(context.getBean(FeaturesEndpoint.class)).isNotNull();
|
||||
assertThat(context).doesNotHaveBean(HasFeatures.class);
|
||||
@@ -93,55 +80,40 @@ public class ReactiveCommonsClientAutoConfigurationTests {
|
||||
|
||||
@Test
|
||||
public void disableAllIndividually() {
|
||||
applicationContextRunner.withPropertyValues(
|
||||
"spring.cloud.discovery.client.health-indicator.enabled=false",
|
||||
applicationContextRunner.withPropertyValues("spring.cloud.discovery.client.health-indicator.enabled=false",
|
||||
"spring.cloud.discovery.client.composite-indicator.enabled=false",
|
||||
"spring.cloud.features.enabled=false").run(context -> {
|
||||
assertThat(context).doesNotHaveBean(
|
||||
ReactiveDiscoveryClientHealthIndicator.class);
|
||||
assertThat(context).doesNotHaveBean(
|
||||
ReactiveDiscoveryCompositeHealthContributor.class);
|
||||
assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class);
|
||||
assertThat(context).doesNotHaveBean(ReactiveDiscoveryCompositeHealthContributor.class);
|
||||
assertThat(context).doesNotHaveBean(FeaturesEndpoint.class);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void disableHealthIndicator() {
|
||||
applicationContextRunner
|
||||
.withPropertyValues(
|
||||
"spring.cloud.discovery.client.health-indicator.enabled=false")
|
||||
applicationContextRunner.withPropertyValues("spring.cloud.discovery.client.health-indicator.enabled=false")
|
||||
.run(context -> {
|
||||
assertThat(context).doesNotHaveBean(
|
||||
ReactiveDiscoveryClientHealthIndicator.class);
|
||||
assertThat(context).doesNotHaveBean(
|
||||
ReactiveDiscoveryCompositeHealthContributor.class);
|
||||
assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class);
|
||||
assertThat(context).doesNotHaveBean(ReactiveDiscoveryCompositeHealthContributor.class);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void worksWithoutActuator() {
|
||||
applicationContextRunner
|
||||
.withClassLoader(
|
||||
new FilteredClassLoader("org.springframework.boot.actuate"))
|
||||
applicationContextRunner.withClassLoader(new FilteredClassLoader("org.springframework.boot.actuate"))
|
||||
.run(context -> {
|
||||
assertThat(context).doesNotHaveBean(
|
||||
ReactiveDiscoveryClientHealthIndicator.class);
|
||||
assertThat(context).doesNotHaveBean(
|
||||
ReactiveDiscoveryCompositeHealthContributor.class);
|
||||
assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class);
|
||||
assertThat(context).doesNotHaveBean(ReactiveDiscoveryCompositeHealthContributor.class);
|
||||
then(context.getBeansOfType(HasFeatures.class).values()).isEmpty();
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void worksWithoutWebflux() {
|
||||
applicationContextRunner
|
||||
.withClassLoader(
|
||||
new FilteredClassLoader("org.springframework.web.reactive"))
|
||||
applicationContextRunner.withClassLoader(new FilteredClassLoader("org.springframework.web.reactive"))
|
||||
.run(context -> {
|
||||
assertThat(context).doesNotHaveBean(
|
||||
ReactiveDiscoveryClientHealthIndicator.class);
|
||||
assertThat(context).doesNotHaveBean(
|
||||
ReactiveDiscoveryCompositeHealthContributor.class);
|
||||
assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class);
|
||||
assertThat(context).doesNotHaveBean(ReactiveDiscoveryCompositeHealthContributor.class);
|
||||
assertThat(context).doesNotHaveBean(HasFeatures.class);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -42,8 +42,7 @@ public class FeaturesEndpointTests {
|
||||
@Before
|
||||
public void setup() {
|
||||
this.context = new AnnotationConfigApplicationContext();
|
||||
this.context.register(JacksonAutoConfiguration.class, FeaturesConfig.class,
|
||||
Config.class);
|
||||
this.context.register(JacksonAutoConfiguration.class, FeaturesConfig.class, Config.class);
|
||||
this.context.refresh();
|
||||
}
|
||||
|
||||
@@ -56,8 +55,7 @@ public class FeaturesEndpointTests {
|
||||
|
||||
@Test
|
||||
public void invokeWorks() {
|
||||
FeaturesEndpoint.Features features = this.context.getBean(FeaturesEndpoint.class)
|
||||
.features();
|
||||
FeaturesEndpoint.Features features = this.context.getBean(FeaturesEndpoint.class).features();
|
||||
then(features).isNotNull();
|
||||
then(features.getEnabled()).hasSize(2).contains(newFeature("foo", Foo.class),
|
||||
newFeature("Baz Feature", Baz.class));
|
||||
@@ -78,8 +76,7 @@ public class FeaturesEndpointTests {
|
||||
|
||||
@Bean
|
||||
HasFeatures localFeatures() {
|
||||
HasFeatures features = HasFeatures.namedFeatures(
|
||||
new NamedFeature("foo", Foo.class),
|
||||
HasFeatures features = HasFeatures.namedFeatures(new NamedFeature("foo", Foo.class),
|
||||
new NamedFeature("Baz Feature", Baz.class));
|
||||
features.getAbstractFeatures().add(Bar.class);
|
||||
return features;
|
||||
|
||||
@@ -26,8 +26,7 @@ public class CustomizerTests {
|
||||
@Test
|
||||
public void testCustomizedOnlyOnce() {
|
||||
AtomicInteger counter = new AtomicInteger(0);
|
||||
final Customizer<AtomicInteger> customizer = Customizer
|
||||
.once(AtomicInteger::incrementAndGet, Object::hashCode);
|
||||
final Customizer<AtomicInteger> customizer = Customizer.once(AtomicInteger::incrementAndGet, Object::hashCode);
|
||||
customizer.customize(counter);
|
||||
customizer.customize(counter);
|
||||
customizer.customize(counter);
|
||||
|
||||
@@ -35,8 +35,7 @@ import static org.assertj.core.api.BDDAssertions.then;
|
||||
* @author Ryan Baxter
|
||||
*/
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(
|
||||
properties = { "spring.cloud.service-registry.auto-registration.enabled: false" })
|
||||
@SpringBootTest(properties = { "spring.cloud.service-registry.auto-registration.enabled: false" })
|
||||
public class AutoRegisterPropertyFalseTests {
|
||||
|
||||
@Autowired(required = false)
|
||||
|
||||
@@ -54,8 +54,7 @@ public class EnableDiscoveryClientImportSelectorTests {
|
||||
public void autoRegistrationIsEnabled() {
|
||||
configureAnnotation(true);
|
||||
String[] imports = this.importSelector.selectImports(this.annotationMetadata);
|
||||
then(this.environment.getProperty(
|
||||
"spring.cloud.service-registry.auto-registration.enabled", Boolean.class,
|
||||
then(this.environment.getProperty("spring.cloud.service-registry.auto-registration.enabled", Boolean.class,
|
||||
true)).isTrue();
|
||||
then(imports).hasSize(1);
|
||||
}
|
||||
@@ -64,9 +63,8 @@ public class EnableDiscoveryClientImportSelectorTests {
|
||||
public void autoRegistrationIsDisabled() {
|
||||
configureAnnotation(false);
|
||||
String[] imports = this.importSelector.selectImports(this.annotationMetadata);
|
||||
then(this.environment.getProperty(
|
||||
"spring.cloud.service-registry.auto-registration.enabled", Boolean.class))
|
||||
.isFalse();
|
||||
then(this.environment.getProperty("spring.cloud.service-registry.auto-registration.enabled", Boolean.class))
|
||||
.isFalse();
|
||||
then(imports).isEmpty();
|
||||
}
|
||||
|
||||
@@ -75,8 +73,7 @@ public class EnableDiscoveryClientImportSelectorTests {
|
||||
given(this.annotationMetadata.isAnnotated(annotationName)).willReturn(true);
|
||||
given(this.annotationMetadata.getAnnotationAttributes(annotationName, true))
|
||||
.willReturn(this.annotationAttributes);
|
||||
given(this.annotationAttributes.getBoolean("autoRegister"))
|
||||
.willReturn(autoRegistration);
|
||||
given(this.annotationAttributes.getBoolean("autoRegister")).willReturn(autoRegistration);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -37,8 +37,8 @@ public class EnableDiscoveryClientMissingImplTests {
|
||||
|
||||
@Test
|
||||
public void testContextFails() {
|
||||
try (ConfigurableApplicationContext context = new SpringApplicationBuilder()
|
||||
.sources(App.class).web(WebApplicationType.NONE).run()) {
|
||||
try (ConfigurableApplicationContext context = new SpringApplicationBuilder().sources(App.class)
|
||||
.web(WebApplicationType.NONE).run()) {
|
||||
// do sth
|
||||
}
|
||||
catch (NestedRuntimeException e) {
|
||||
|
||||
@@ -35,8 +35,8 @@ public class ManagementServerPortUtilsTests {
|
||||
|
||||
@Test
|
||||
public void contextStarts() {
|
||||
try (ConfigurableApplicationContext context = new SpringApplicationBuilder()
|
||||
.web(WebApplicationType.NONE).sources(TestApp.class).run()) {
|
||||
try (ConfigurableApplicationContext context = new SpringApplicationBuilder().web(WebApplicationType.NONE)
|
||||
.sources(TestApp.class).run()) {
|
||||
|
||||
then(ManagementServerPortUtils.hasActuator).isFalse();
|
||||
}
|
||||
|
||||
@@ -60,8 +60,7 @@ public class CompositeDiscoveryClientAutoConfigurationTests {
|
||||
CompositeDiscoveryClient compositeDiscoveryClient = (CompositeDiscoveryClient) this.discoveryClient;
|
||||
then(compositeDiscoveryClient.getDiscoveryClients().get(0).description())
|
||||
.isEqualTo("A custom discovery client");
|
||||
then(compositeDiscoveryClient.getDiscoveryClients().get(1))
|
||||
.isInstanceOf(SimpleDiscoveryClient.class);
|
||||
then(compositeDiscoveryClient.getDiscoveryClients().get(1)).isInstanceOf(SimpleDiscoveryClient.class);
|
||||
}
|
||||
|
||||
@EnableAutoConfiguration
|
||||
|
||||
@@ -55,8 +55,7 @@ public class CompositeDiscoveryClientOrderTest {
|
||||
|
||||
// then:
|
||||
then(discoveryClients.get(0).description()).isEqualTo(CUSTOM_DISCOVERY_CLIENT);
|
||||
then(discoveryClients.get(1).description())
|
||||
.isEqualTo(DEFAULT_ORDER_DISCOVERY_CLIENT);
|
||||
then(discoveryClients.get(1).description()).isEqualTo(DEFAULT_ORDER_DISCOVERY_CLIENT);
|
||||
then(discoveryClients.get(2).description()).isEqualTo("Simple Discovery Client");
|
||||
then(discoveryClients.get(3).description()).isEqualTo(FOURTH_DISCOVERY_CLIENT);
|
||||
}
|
||||
@@ -64,8 +63,7 @@ public class CompositeDiscoveryClientOrderTest {
|
||||
@Test
|
||||
public void shouldOnlyReturnServiceInstancesForTheHighestPrecedenceDiscoveryClient() {
|
||||
// when:
|
||||
List<ServiceInstance> serviceInstances = this.discoveryClient
|
||||
.getInstances(CUSTOM_SERVICE_ID);
|
||||
List<ServiceInstance> serviceInstances = this.discoveryClient.getInstances(CUSTOM_SERVICE_ID);
|
||||
|
||||
// then:
|
||||
then(serviceInstances).hasSize(1);
|
||||
|
||||
@@ -37,11 +37,12 @@ import static org.springframework.cloud.client.discovery.composite.CompositeDisc
|
||||
*/
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(properties = { "spring.application.name=service0",
|
||||
"spring.cloud.discovery.client.simple.instances.service1[0].uri=http://s11:8080",
|
||||
"spring.cloud.discovery.client.simple.instances.service1[1].uri=https://s12:8443",
|
||||
"spring.cloud.discovery.client.simple.instances.service2[0].uri=https://s21:8080",
|
||||
"spring.cloud.discovery.client.simple.instances.service2[1].uri=https://s22:443" },
|
||||
@SpringBootTest(
|
||||
properties = { "spring.application.name=service0",
|
||||
"spring.cloud.discovery.client.simple.instances.service1[0].uri=http://s11:8080",
|
||||
"spring.cloud.discovery.client.simple.instances.service1[1].uri=https://s12:8443",
|
||||
"spring.cloud.discovery.client.simple.instances.service2[0].uri=https://s21:8080",
|
||||
"spring.cloud.discovery.client.simple.instances.service2[1].uri=https://s22:443" },
|
||||
classes = { CompositeDiscoveryClientTestsConfig.class })
|
||||
public class CompositeDiscoveryClientTests {
|
||||
|
||||
@@ -63,8 +64,7 @@ public class CompositeDiscoveryClientTests {
|
||||
|
||||
@Test
|
||||
public void getServicesShouldAggregateAllServiceNames() {
|
||||
then(this.discoveryClient.getServices()).containsOnlyOnce("service1", "service2",
|
||||
"custom");
|
||||
then(this.discoveryClient.getServices()).containsOnlyOnce("service1", "service2", "custom");
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -68,8 +68,8 @@ public class CompositeDiscoveryClientTestsConfig {
|
||||
@Override
|
||||
public List<ServiceInstance> getInstances(String serviceId) {
|
||||
if (serviceId.equals(CUSTOM_SERVICE_ID)) {
|
||||
ServiceInstance s1 = new DefaultServiceInstance("customInstance",
|
||||
CUSTOM_SERVICE_ID, "host", 123, false);
|
||||
ServiceInstance s1 = new DefaultServiceInstance("customInstance", CUSTOM_SERVICE_ID, "host", 123,
|
||||
false);
|
||||
return singletonList(s1);
|
||||
}
|
||||
return Collections.emptyList();
|
||||
|
||||
@@ -34,30 +34,25 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||
class ReactiveCompositeDiscoveryClientAutoConfigurationTests {
|
||||
|
||||
private ApplicationContextRunner contextRunner = new ApplicationContextRunner()
|
||||
.withConfiguration(AutoConfigurations
|
||||
.of(ReactiveCompositeDiscoveryClientAutoConfiguration.class));
|
||||
.withConfiguration(AutoConfigurations.of(ReactiveCompositeDiscoveryClientAutoConfiguration.class));
|
||||
|
||||
@Test
|
||||
public void shouldCreateCompositeReactiveDiscoveryClientWithoutDelegates() {
|
||||
this.contextRunner.run((context) -> {
|
||||
ReactiveDiscoveryClient client = context
|
||||
.getBean(ReactiveDiscoveryClient.class);
|
||||
ReactiveDiscoveryClient client = context.getBean(ReactiveDiscoveryClient.class);
|
||||
assertThat(client).isNotNull();
|
||||
assertThat(client).isInstanceOf(ReactiveCompositeDiscoveryClient.class);
|
||||
assertThat(((ReactiveCompositeDiscoveryClient) client).getDiscoveryClients())
|
||||
.isEmpty();
|
||||
assertThat(((ReactiveCompositeDiscoveryClient) client).getDiscoveryClients()).isEmpty();
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldCreateCompositeReactiveDiscoveryClientWithDelegate() {
|
||||
this.contextRunner.withUserConfiguration(Configuration.class).run((context) -> {
|
||||
ReactiveDiscoveryClient client = context
|
||||
.getBean(ReactiveDiscoveryClient.class);
|
||||
ReactiveDiscoveryClient client = context.getBean(ReactiveDiscoveryClient.class);
|
||||
assertThat(client).isNotNull();
|
||||
assertThat(client).isInstanceOf(ReactiveCompositeDiscoveryClient.class);
|
||||
assertThat(((ReactiveCompositeDiscoveryClient) client).getDiscoveryClients())
|
||||
.hasSize(1);
|
||||
assertThat(((ReactiveCompositeDiscoveryClient) client).getDiscoveryClients()).hasSize(1);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -47,8 +47,7 @@ class ReactiveCompositeDiscoveryClientTests {
|
||||
|
||||
@Test
|
||||
public void shouldReturnEmptyFluxOfServices() {
|
||||
ReactiveCompositeDiscoveryClient client = new ReactiveCompositeDiscoveryClient(
|
||||
emptyList());
|
||||
ReactiveCompositeDiscoveryClient client = new ReactiveCompositeDiscoveryClient(emptyList());
|
||||
|
||||
Flux<String> services = client.getServices();
|
||||
|
||||
@@ -76,15 +75,13 @@ class ReactiveCompositeDiscoveryClientTests {
|
||||
|
||||
Flux<String> services = client.getServices();
|
||||
|
||||
StepVerifier.create(services).expectNext("serviceAFromClient1")
|
||||
.expectNext("serviceBFromClient1").expectNext("serviceCFromClient2")
|
||||
.expectComplete().verify();
|
||||
StepVerifier.create(services).expectNext("serviceAFromClient1").expectNext("serviceBFromClient1")
|
||||
.expectNext("serviceCFromClient2").expectComplete().verify();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldReturnEmptyFluxOfServiceInstances() {
|
||||
ReactiveCompositeDiscoveryClient client = new ReactiveCompositeDiscoveryClient(
|
||||
emptyList());
|
||||
ReactiveCompositeDiscoveryClient client = new ReactiveCompositeDiscoveryClient(emptyList());
|
||||
|
||||
Flux<ServiceInstance> instances = client.getInstances("service");
|
||||
|
||||
@@ -93,32 +90,28 @@ class ReactiveCompositeDiscoveryClientTests {
|
||||
|
||||
@Test
|
||||
public void shouldReturnFluxOfServiceInstances() {
|
||||
DefaultServiceInstance serviceInstance1 = new DefaultServiceInstance("instance",
|
||||
"service", "localhost", 8080, false);
|
||||
DefaultServiceInstance serviceInstance2 = new DefaultServiceInstance("instance2",
|
||||
"service", "localhost", 8080, false);
|
||||
TestPublisher<ServiceInstance> discoveryClient1Publisher = TestPublisher
|
||||
.createCold();
|
||||
DefaultServiceInstance serviceInstance1 = new DefaultServiceInstance("instance", "service", "localhost", 8080,
|
||||
false);
|
||||
DefaultServiceInstance serviceInstance2 = new DefaultServiceInstance("instance2", "service", "localhost", 8080,
|
||||
false);
|
||||
TestPublisher<ServiceInstance> discoveryClient1Publisher = TestPublisher.createCold();
|
||||
discoveryClient1Publisher.emit(serviceInstance1);
|
||||
discoveryClient1Publisher.emit(serviceInstance2);
|
||||
discoveryClient1Publisher.complete();
|
||||
|
||||
TestPublisher<ServiceInstance> discoveryClient2Publisher = TestPublisher
|
||||
.createCold();
|
||||
TestPublisher<ServiceInstance> discoveryClient2Publisher = TestPublisher.createCold();
|
||||
discoveryClient2Publisher.complete();
|
||||
|
||||
when(discoveryClient1.getInstances("service"))
|
||||
.thenReturn(discoveryClient1Publisher.flux());
|
||||
when(discoveryClient2.getInstances("service"))
|
||||
.thenReturn(discoveryClient2Publisher.flux());
|
||||
when(discoveryClient1.getInstances("service")).thenReturn(discoveryClient1Publisher.flux());
|
||||
when(discoveryClient2.getInstances("service")).thenReturn(discoveryClient2Publisher.flux());
|
||||
|
||||
ReactiveCompositeDiscoveryClient client = new ReactiveCompositeDiscoveryClient(
|
||||
asList(discoveryClient1, discoveryClient2));
|
||||
|
||||
Flux<ServiceInstance> instances = client.getInstances("service");
|
||||
|
||||
StepVerifier.create(instances).expectNext(serviceInstance1)
|
||||
.expectNext(serviceInstance2).expectComplete().verify();
|
||||
StepVerifier.create(instances).expectNext(serviceInstance1).expectNext(serviceInstance2).expectComplete()
|
||||
.verify();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -45,9 +45,7 @@ import static org.mockito.Mockito.mock;
|
||||
*/
|
||||
@RunWith(SpringRunner.class)
|
||||
// @checkstyle:off
|
||||
@SpringBootTest(
|
||||
classes = { DiscoveryClientHealthIndicatorTests.Config.class,
|
||||
CommonsClientAutoConfiguration.class },
|
||||
@SpringBootTest(classes = { DiscoveryClientHealthIndicatorTests.Config.class, CommonsClientAutoConfiguration.class },
|
||||
properties = "spring.cloud.discovery.client.health-indicator.include-description:true")
|
||||
// @checkstyle:on
|
||||
public class DiscoveryClientHealthIndicatorTests {
|
||||
@@ -64,18 +62,15 @@ public class DiscoveryClientHealthIndicatorTests {
|
||||
assertHealth(getHealth("testDiscoveryHealthIndicator"), Status.UNKNOWN);
|
||||
assertHealth(getHealth("discoveryClient"), Status.UNKNOWN);
|
||||
|
||||
this.clientHealthIndicator
|
||||
.onApplicationEvent(new InstanceRegisteredEvent<>(this, null));
|
||||
this.clientHealthIndicator.onApplicationEvent(new InstanceRegisteredEvent<>(this, null));
|
||||
|
||||
assertHealth(getHealth("testDiscoveryHealthIndicator"), Status.UNKNOWN);
|
||||
Status status = assertHealth(getHealth("discoveryClient"), Status.UP);
|
||||
then(status.getDescription()).as("status description was wrong")
|
||||
.isEqualTo("TestDiscoveryClient");
|
||||
then(status.getDescription()).as("status description was wrong").isEqualTo("TestDiscoveryClient");
|
||||
}
|
||||
|
||||
private Health getHealth(String name) {
|
||||
HealthContributor delegate = ((CompositeHealthContributor) this.healthContributor)
|
||||
.getContributor(name);
|
||||
HealthContributor delegate = ((CompositeHealthContributor) this.healthContributor).getContributor(name);
|
||||
return ((HealthIndicator) delegate).health();
|
||||
}
|
||||
|
||||
|
||||
@@ -39,15 +39,13 @@ public class DiscoveryCompositeHealthContributorTests {
|
||||
|
||||
@Test
|
||||
public void createWhenIndicatorsAreNullThrowsException() throws Exception {
|
||||
assertThatIllegalArgumentException()
|
||||
.isThrownBy(() -> new DiscoveryCompositeHealthContributor(null))
|
||||
assertThatIllegalArgumentException().isThrownBy(() -> new DiscoveryCompositeHealthContributor(null))
|
||||
.withMessage("'indicators' must not be null");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getContributorReturnsContributor() throws Exception {
|
||||
TestDiscoveryHealthIndicator indicator = new TestDiscoveryHealthIndicator("test",
|
||||
Health.up().build());
|
||||
TestDiscoveryHealthIndicator indicator = new TestDiscoveryHealthIndicator("test", Health.up().build());
|
||||
DiscoveryCompositeHealthContributor composite = new DiscoveryCompositeHealthContributor(
|
||||
Arrays.asList(indicator));
|
||||
HealthIndicator adapted = (HealthIndicator) composite.getContributor("test");
|
||||
@@ -57,8 +55,7 @@ public class DiscoveryCompositeHealthContributorTests {
|
||||
|
||||
@Test
|
||||
public void getContributorWhenMissingReturnsNull() throws Exception {
|
||||
TestDiscoveryHealthIndicator indicator = new TestDiscoveryHealthIndicator("test",
|
||||
Health.up().build());
|
||||
TestDiscoveryHealthIndicator indicator = new TestDiscoveryHealthIndicator("test", Health.up().build());
|
||||
DiscoveryCompositeHealthContributor composite = new DiscoveryCompositeHealthContributor(
|
||||
Arrays.asList(indicator));
|
||||
assertThat((HealthIndicator) composite.getContributor("missing")).isNull();
|
||||
@@ -66,10 +63,8 @@ public class DiscoveryCompositeHealthContributorTests {
|
||||
|
||||
@Test
|
||||
public void iteratorIteratesNamedContributors() throws Exception {
|
||||
TestDiscoveryHealthIndicator indicator1 = new TestDiscoveryHealthIndicator(
|
||||
"test1", Health.up().build());
|
||||
TestDiscoveryHealthIndicator indicator2 = new TestDiscoveryHealthIndicator(
|
||||
"test2", Health.down().build());
|
||||
TestDiscoveryHealthIndicator indicator1 = new TestDiscoveryHealthIndicator("test1", Health.up().build());
|
||||
TestDiscoveryHealthIndicator indicator2 = new TestDiscoveryHealthIndicator("test2", Health.down().build());
|
||||
DiscoveryCompositeHealthContributor composite = new DiscoveryCompositeHealthContributor(
|
||||
Arrays.asList(indicator1, indicator2));
|
||||
List<NamedContributor<HealthContributor>> contributors = new ArrayList<>();
|
||||
@@ -77,14 +72,12 @@ public class DiscoveryCompositeHealthContributorTests {
|
||||
contributors.add(contributor);
|
||||
}
|
||||
assertThat(contributors).hasSize(2);
|
||||
assertThat(contributors).extracting("name").containsExactlyInAnyOrder("test1",
|
||||
"test2");
|
||||
assertThat(contributors).extracting("name").containsExactlyInAnyOrder("test1", "test2");
|
||||
assertThat(contributors).extracting("contributor").extracting("health")
|
||||
.containsExactlyInAnyOrder(indicator1.health(), indicator2.health());
|
||||
}
|
||||
|
||||
private static class TestDiscoveryHealthIndicator
|
||||
implements DiscoveryHealthIndicator {
|
||||
private static class TestDiscoveryHealthIndicator implements DiscoveryHealthIndicator {
|
||||
|
||||
private final String name;
|
||||
|
||||
|
||||
@@ -61,8 +61,7 @@ class ReactiveDiscoveryClientHealthIndicatorTests {
|
||||
|
||||
@Test
|
||||
public void shouldReturnUnknownStatusWhenNotInitialized() {
|
||||
Health expectedHealth = Health.status(
|
||||
new Status(Status.UNKNOWN.getCode(), "Discovery Client not initialized"))
|
||||
Health expectedHealth = Health.status(new Status(Status.UNKNOWN.getCode(), "Discovery Client not initialized"))
|
||||
.build();
|
||||
Mono<Health> health = indicator.health();
|
||||
StepVerifier.create(health).expectNext(expectedHealth).expectComplete().verify();
|
||||
@@ -72,8 +71,8 @@ class ReactiveDiscoveryClientHealthIndicatorTests {
|
||||
public void shouldReturnUpStatusWithoutServices() {
|
||||
when(discoveryClient.description()).thenReturn("Mocked Service Discovery Client");
|
||||
when(discoveryClient.getServices()).thenReturn(Flux.empty());
|
||||
Health expectedHealth = Health.status(new Status(Status.UP.getCode(), ""))
|
||||
.withDetail("services", emptyList()).build();
|
||||
Health expectedHealth = Health.status(new Status(Status.UP.getCode(), "")).withDetail("services", emptyList())
|
||||
.build();
|
||||
|
||||
indicator.onApplicationEvent(new InstanceRegisteredEvent<>(this, null));
|
||||
Mono<Health> health = indicator.health();
|
||||
@@ -87,9 +86,7 @@ class ReactiveDiscoveryClientHealthIndicatorTests {
|
||||
when(discoveryClient.getServices()).thenReturn(Flux.just("service"));
|
||||
when(properties.isIncludeDescription()).thenReturn(true);
|
||||
when(discoveryClient.description()).thenReturn("Mocked Service Discovery Client");
|
||||
Health expectedHealth = Health
|
||||
.status(new Status(Status.UP.getCode(),
|
||||
"Mocked Service Discovery Client"))
|
||||
Health expectedHealth = Health.status(new Status(Status.UP.getCode(), "Mocked Service Discovery Client"))
|
||||
.withDetail("services", singletonList("service")).build();
|
||||
|
||||
indicator.onApplicationEvent(new InstanceRegisteredEvent<>(this, null));
|
||||
@@ -108,8 +105,7 @@ class ReactiveDiscoveryClientHealthIndicatorTests {
|
||||
indicator.onApplicationEvent(new InstanceRegisteredEvent<>(this, null));
|
||||
Mono<Health> health = indicator.health();
|
||||
|
||||
StepVerifier.create(health).expectNext(expectedHealth).expectComplete()
|
||||
.verifyThenAssertThat();
|
||||
StepVerifier.create(health).expectNext(expectedHealth).expectComplete().verifyThenAssertThat();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -54,8 +54,7 @@ class ReactiveDiscoveryCompositeHealthContributorTests {
|
||||
|
||||
@Test
|
||||
void shouldReturnKnownContributor() {
|
||||
ReactiveDiscoveryHealthIndicator indicator = mock(
|
||||
ReactiveDiscoveryHealthIndicator.class);
|
||||
ReactiveDiscoveryHealthIndicator indicator = mock(ReactiveDiscoveryHealthIndicator.class);
|
||||
Health health = Health.up().build();
|
||||
when(indicator.getName()).thenReturn("known");
|
||||
when(indicator.health()).thenReturn(Mono.just(health));
|
||||
@@ -64,19 +63,15 @@ class ReactiveDiscoveryCompositeHealthContributorTests {
|
||||
singletonList(indicator));
|
||||
|
||||
assertThat(healthContributor.getContributor("known")).isNotNull();
|
||||
Iterator<NamedContributor<ReactiveHealthContributor>> iterator = healthContributor
|
||||
.iterator();
|
||||
Iterator<NamedContributor<ReactiveHealthContributor>> iterator = healthContributor.iterator();
|
||||
assertThat(iterator.hasNext()).isTrue();
|
||||
NamedContributor<ReactiveHealthContributor> contributor = iterator.next();
|
||||
assertThat(contributor).isNotNull();
|
||||
assertThat(contributor.getName()).isEqualTo("known");
|
||||
assertThat(contributor.getContributor()).isNotNull();
|
||||
assertThat(contributor.getContributor())
|
||||
.isInstanceOf(ReactiveHealthIndicator.class);
|
||||
ReactiveHealthIndicator healthIndicator = (ReactiveHealthIndicator) contributor
|
||||
.getContributor();
|
||||
StepVerifier.create(healthIndicator.getHealth(true)).expectNext(health)
|
||||
.expectComplete().verify();
|
||||
assertThat(contributor.getContributor()).isInstanceOf(ReactiveHealthIndicator.class);
|
||||
ReactiveHealthIndicator healthIndicator = (ReactiveHealthIndicator) contributor.getContributor();
|
||||
StepVerifier.create(healthIndicator.getHealth(true)).expectNext(health).expectComplete().verify();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -32,8 +32,7 @@ import static org.assertj.core.api.BDDAssertions.then;
|
||||
* @author Ryan Baxter
|
||||
*/
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(
|
||||
classes = ReactiveSimpleDiscoveryPropertiesAutoConfigurationTests.Config.class,
|
||||
@SpringBootTest(classes = ReactiveSimpleDiscoveryPropertiesAutoConfigurationTests.Config.class,
|
||||
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
|
||||
properties = "spring.main.web-application-type=reactive")
|
||||
public class ReactiveSimpleDiscoveryPropertiesAutoConfigurationTests {
|
||||
|
||||
@@ -32,8 +32,7 @@ import static org.assertj.core.api.BDDAssertions.then;
|
||||
* @author Ryan Baxter
|
||||
*/
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(
|
||||
classes = ServletSimpleDiscoveryPropertiesAutoConfigurationTests.Config.class,
|
||||
@SpringBootTest(classes = ServletSimpleDiscoveryPropertiesAutoConfigurationTests.Config.class,
|
||||
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
|
||||
public class ServletSimpleDiscoveryPropertiesAutoConfigurationTests {
|
||||
|
||||
|
||||
@@ -56,16 +56,13 @@ public class SimpleDiscoveryClientPropertiesMappingTests {
|
||||
then(this.props.getInstances().get("service1").size()).isEqualTo(2);
|
||||
then(this.props.getInstances().get("service1").get(0).getHost()).isEqualTo("s11");
|
||||
then(this.props.getInstances().get("service1").get(0).getPort()).isEqualTo(8080);
|
||||
then(this.props.getInstances().get("service1").get(0).getUri())
|
||||
.isEqualTo(URI.create("http://s11:8080"));
|
||||
then(this.props.getInstances().get("service1").get(0).isSecure())
|
||||
.isEqualTo(false);
|
||||
then(this.props.getInstances().get("service1").get(0).getUri()).isEqualTo(URI.create("http://s11:8080"));
|
||||
then(this.props.getInstances().get("service1").get(0).isSecure()).isEqualTo(false);
|
||||
|
||||
then(this.props.getInstances().get("service2").size()).isEqualTo(2);
|
||||
then(this.props.getInstances().get("service2").get(0).getHost()).isEqualTo("s21");
|
||||
then(this.props.getInstances().get("service2").get(0).getPort()).isEqualTo(8080);
|
||||
then(this.props.getInstances().get("service2").get(0).getUri())
|
||||
.isEqualTo(URI.create("https://s21:8080"));
|
||||
then(this.props.getInstances().get("service2").get(0).getUri()).isEqualTo(URI.create("https://s21:8080"));
|
||||
then(this.props.getInstances().get("service2").get(0).isSecure()).isEqualTo(true);
|
||||
}
|
||||
|
||||
@@ -83,8 +80,7 @@ public class SimpleDiscoveryClientPropertiesMappingTests {
|
||||
|
||||
@Test
|
||||
public void testGetServices() {
|
||||
then(this.discoveryClient.getServices()).containsExactlyInAnyOrder("service1",
|
||||
"service2");
|
||||
then(this.discoveryClient.getServices()).containsExactlyInAnyOrder("service1", "service2");
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -42,10 +42,8 @@ public class SimpleDiscoveryClientTests {
|
||||
SimpleDiscoveryProperties simpleDiscoveryProperties = new SimpleDiscoveryProperties();
|
||||
|
||||
Map<String, List<SimpleServiceInstance>> map = new HashMap<>();
|
||||
SimpleServiceInstance service1Inst1 = new SimpleServiceInstance(
|
||||
URI.create("http://host1:8080"));
|
||||
SimpleServiceInstance service1Inst2 = new SimpleServiceInstance(
|
||||
URI.create("https://host2:8443"));
|
||||
SimpleServiceInstance service1Inst1 = new SimpleServiceInstance(URI.create("http://host1:8080"));
|
||||
SimpleServiceInstance service1Inst2 = new SimpleServiceInstance(URI.create("https://host2:8443"));
|
||||
map.put("service1", Arrays.asList(service1Inst1, service1Inst2));
|
||||
simpleDiscoveryProperties.setInstances(map);
|
||||
simpleDiscoveryProperties.init();
|
||||
@@ -54,8 +52,7 @@ public class SimpleDiscoveryClientTests {
|
||||
|
||||
@Test
|
||||
public void shouldBeAbleToRetrieveServiceDetailsByName() {
|
||||
List<ServiceInstance> instances = this.simpleDiscoveryClient
|
||||
.getInstances("service1");
|
||||
List<ServiceInstance> instances = this.simpleDiscoveryClient.getInstances("service1");
|
||||
then(instances.size()).isEqualTo(2);
|
||||
then(instances.get(0).getServiceId()).isEqualTo("service1");
|
||||
then(instances.get(0).getHost()).isEqualTo("host1");
|
||||
|
||||
@@ -34,27 +34,21 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||
*/
|
||||
class SimpleReactiveDiscoveryClientAutoConfigurationTests {
|
||||
|
||||
private ApplicationContextRunner contextRunner = new ApplicationContextRunner()
|
||||
.withConfiguration(AutoConfigurations.of(
|
||||
SimpleReactiveDiscoveryClientAutoConfiguration.class,
|
||||
UtilAutoConfiguration.class));
|
||||
private ApplicationContextRunner contextRunner = new ApplicationContextRunner().withConfiguration(
|
||||
AutoConfigurations.of(SimpleReactiveDiscoveryClientAutoConfiguration.class, UtilAutoConfiguration.class));
|
||||
|
||||
@Test
|
||||
public void shouldUseDefaults() {
|
||||
this.contextRunner.run((context) -> {
|
||||
ReactiveDiscoveryClient client = context
|
||||
.getBean(ReactiveDiscoveryClient.class);
|
||||
ReactiveDiscoveryClient client = context.getBean(ReactiveDiscoveryClient.class);
|
||||
assertThat(client).isNotNull();
|
||||
assertThat(client.getOrder())
|
||||
.isEqualTo(ReactiveDiscoveryClient.DEFAULT_ORDER);
|
||||
assertThat(client.getOrder()).isEqualTo(ReactiveDiscoveryClient.DEFAULT_ORDER);
|
||||
InetUtils inet = context.getBean(InetUtils.class);
|
||||
assertThat(inet).isNotNull();
|
||||
SimpleReactiveDiscoveryProperties properties = context
|
||||
.getBean(SimpleReactiveDiscoveryProperties.class);
|
||||
SimpleReactiveDiscoveryProperties properties = context.getBean(SimpleReactiveDiscoveryProperties.class);
|
||||
assertThat(properties).isNotNull();
|
||||
assertThat(properties.getLocal().getServiceId()).isEqualTo("application");
|
||||
assertThat(properties.getLocal().getHost())
|
||||
.isEqualTo(inet.findFirstNonLoopbackHostInfo().getHostname());
|
||||
assertThat(properties.getLocal().getHost()).isEqualTo(inet.findFirstNonLoopbackHostInfo().getHostname());
|
||||
assertThat(properties.getLocal().getPort()).isEqualTo(8080);
|
||||
});
|
||||
}
|
||||
@@ -63,11 +57,9 @@ class SimpleReactiveDiscoveryClientAutoConfigurationTests {
|
||||
public void shouldUseCustomConfiguration() {
|
||||
this.contextRunner.withUserConfiguration(Configuration.class)
|
||||
.withPropertyValues("spring.application.name=my-service",
|
||||
"spring.cloud.discovery.client.simple.order=1",
|
||||
"server.port=8443")
|
||||
"spring.cloud.discovery.client.simple.order=1", "server.port=8443")
|
||||
.run((context) -> {
|
||||
ReactiveDiscoveryClient client = context
|
||||
.getBean(ReactiveDiscoveryClient.class);
|
||||
ReactiveDiscoveryClient client = context.getBean(ReactiveDiscoveryClient.class);
|
||||
assertThat(client).isNotNull();
|
||||
assertThat(client.getOrder()).isEqualTo(1);
|
||||
InetUtils inet = context.getBean(InetUtils.class);
|
||||
@@ -75,8 +67,7 @@ class SimpleReactiveDiscoveryClientAutoConfigurationTests {
|
||||
SimpleReactiveDiscoveryProperties properties = context
|
||||
.getBean(SimpleReactiveDiscoveryProperties.class);
|
||||
assertThat(properties).isNotNull();
|
||||
assertThat(properties.getLocal().getServiceId())
|
||||
.isEqualTo("my-service");
|
||||
assertThat(properties.getLocal().getServiceId()).isEqualTo("my-service");
|
||||
assertThat(properties.getLocal().getHost())
|
||||
.isEqualTo(inet.findFirstNonLoopbackHostInfo().getHostname());
|
||||
assertThat(properties.getLocal().getPort()).isEqualTo(8443);
|
||||
|
||||
@@ -36,22 +36,19 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||
*/
|
||||
public class SimpleReactiveDiscoveryClientTests {
|
||||
|
||||
private final SimpleServiceInstance service1Inst1 = new SimpleServiceInstance(
|
||||
URI.create("http://host1:8080"));
|
||||
private final SimpleServiceInstance service1Inst1 = new SimpleServiceInstance(URI.create("http://host1:8080"));
|
||||
|
||||
private final SimpleServiceInstance service1Inst2 = new SimpleServiceInstance(
|
||||
URI.create("https://host2:8443"));
|
||||
private final SimpleServiceInstance service1Inst2 = new SimpleServiceInstance(URI.create("https://host2:8443"));
|
||||
|
||||
private SimpleReactiveDiscoveryClient client;
|
||||
|
||||
@BeforeEach
|
||||
public void setUp() {
|
||||
SimpleReactiveDiscoveryProperties simpleReactiveDiscoveryProperties = new SimpleReactiveDiscoveryProperties();
|
||||
simpleReactiveDiscoveryProperties.setInstances(
|
||||
singletonMap("service", Arrays.asList(service1Inst1, service1Inst2)));
|
||||
simpleReactiveDiscoveryProperties
|
||||
.setInstances(singletonMap("service", Arrays.asList(service1Inst1, service1Inst2)));
|
||||
simpleReactiveDiscoveryProperties.init();
|
||||
this.client = new SimpleReactiveDiscoveryClient(
|
||||
simpleReactiveDiscoveryProperties);
|
||||
this.client = new SimpleReactiveDiscoveryClient(simpleReactiveDiscoveryProperties);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -75,8 +72,7 @@ public class SimpleReactiveDiscoveryClientTests {
|
||||
@Test
|
||||
public void shouldReturnFluxOfServiceInstances() {
|
||||
Flux<ServiceInstance> services = this.client.getInstances("service");
|
||||
StepVerifier.create(services).expectNext(service1Inst1).expectNext(service1Inst2)
|
||||
.expectComplete().verify();
|
||||
StepVerifier.create(services).expectNext(service1Inst1).expectNext(service1Inst2).expectComplete().verify();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -36,20 +36,16 @@ import static org.assertj.core.api.BDDAssertions.then;
|
||||
*/
|
||||
public class CloudHypermediaAutoConfigurationIntegrationTests {
|
||||
|
||||
private static ConfigurableApplicationContext getApplicationContext(
|
||||
Class<?> configuration) {
|
||||
return new SpringApplicationBuilder(configuration).properties("server.port=0")
|
||||
.run();
|
||||
private static ConfigurableApplicationContext getApplicationContext(Class<?> configuration) {
|
||||
return new SpringApplicationBuilder(configuration).properties("server.port=0").run();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void picksUpHypermediaProperties() {
|
||||
|
||||
try (ConfigurableApplicationContext context = getApplicationContext(
|
||||
ConfigWithRemoteResource.class)) {
|
||||
try (ConfigurableApplicationContext context = getApplicationContext(ConfigWithRemoteResource.class)) {
|
||||
|
||||
CloudHypermediaProperties properties = context
|
||||
.getBean(CloudHypermediaProperties.class);
|
||||
CloudHypermediaProperties properties = context.getBean(CloudHypermediaProperties.class);
|
||||
|
||||
then(properties.getRefresh().getInitialDelay()).isEqualTo(50000);
|
||||
then(properties.getRefresh().getFixedDelay()).isEqualTo(10000);
|
||||
@@ -59,8 +55,7 @@ public class CloudHypermediaAutoConfigurationIntegrationTests {
|
||||
@Test
|
||||
public void doesNotCreateCloudHypermediaPropertiesifNotActive() {
|
||||
|
||||
try (ConfigurableApplicationContext context = getApplicationContext(
|
||||
Config.class)) {
|
||||
try (ConfigurableApplicationContext context = getApplicationContext(Config.class)) {
|
||||
then(context.getBeanNamesForType(CloudHypermediaProperties.class)).hasSize(0);
|
||||
}
|
||||
}
|
||||
@@ -68,8 +63,7 @@ public class CloudHypermediaAutoConfigurationIntegrationTests {
|
||||
@Test
|
||||
public void doesNotRegisterResourceRefresherIfNoDiscoveredResourceIsDefined() {
|
||||
|
||||
try (ConfigurableApplicationContext context = getApplicationContext(
|
||||
Config.class)) {
|
||||
try (ConfigurableApplicationContext context = getApplicationContext(Config.class)) {
|
||||
|
||||
then(context.getBeansOfType(RemoteResource.class).values()).hasSize(0);
|
||||
then(context.getBeanNamesForType(RemoteResourceRefresher.class)).hasSize(0);
|
||||
@@ -79,8 +73,7 @@ public class CloudHypermediaAutoConfigurationIntegrationTests {
|
||||
@Test
|
||||
public void registersResourceRefresherIfDiscoverredResourceIsDefined() {
|
||||
|
||||
try (ConfigurableApplicationContext context = getApplicationContext(
|
||||
ConfigWithRemoteResource.class)) {
|
||||
try (ConfigurableApplicationContext context = getApplicationContext(ConfigWithRemoteResource.class)) {
|
||||
|
||||
then(context.getBeansOfType(RemoteResource.class).values()).hasSize(1);
|
||||
then(context.getBean(RemoteResourceRefresher.class)).isNotNull();
|
||||
@@ -101,8 +94,7 @@ public class CloudHypermediaAutoConfigurationIntegrationTests {
|
||||
public RemoteResource resource() {
|
||||
|
||||
ServiceInstanceProvider provider = new StaticServiceInstanceProvider(
|
||||
new DefaultServiceInstance("instance", "service", "localhost", 80,
|
||||
false));
|
||||
new DefaultServiceInstance("instance", "service", "localhost", 80, false));
|
||||
return new DiscoveredResource(provider, traverson -> traverson.follow("rel"));
|
||||
}
|
||||
|
||||
|
||||
@@ -59,8 +59,7 @@ public class DiscoveredResourceUnitTests {
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
when(this.traversal.buildTraversal(Matchers.any(Traverson.class)))
|
||||
.thenReturn(this.builder);
|
||||
when(this.traversal.buildTraversal(Matchers.any(Traverson.class))).thenReturn(this.builder);
|
||||
|
||||
this.resource = new DiscoveredResource(this.provider, this.traversal);
|
||||
this.resource.setRestOperations(this.operations);
|
||||
@@ -76,8 +75,8 @@ public class DiscoveredResourceUnitTests {
|
||||
|
||||
Link link = new Link("target", "rel");
|
||||
|
||||
when(this.provider.getServiceInstance()).thenReturn(new DefaultServiceInstance(
|
||||
"instance", "service", "localhost", 8080, false));
|
||||
when(this.provider.getServiceInstance())
|
||||
.thenReturn(new DefaultServiceInstance("instance", "service", "localhost", 8080, false));
|
||||
when(this.builder.asTemplatedLink()).thenReturn(link);
|
||||
|
||||
this.resource.verifyOrDiscover();
|
||||
@@ -103,8 +102,7 @@ public class DiscoveredResourceUnitTests {
|
||||
|
||||
verificationTriggersDiscovery();
|
||||
|
||||
doThrow(RestClientException.class).when(this.operations)
|
||||
.headForHeaders(anyString());
|
||||
doThrow(RestClientException.class).when(this.operations).headForHeaders(anyString());
|
||||
this.resource.verifyOrDiscover();
|
||||
|
||||
then(this.resource.getLink()).isNull();
|
||||
|
||||
@@ -42,8 +42,7 @@ public class DynamicServiceInstanceProviderUnitTests {
|
||||
|
||||
@Test
|
||||
public void returnsNoServiceInCaseNoneIsAvailable() {
|
||||
then(new DynamicServiceInstanceProvider(this.client, "service")
|
||||
.getServiceInstance()).isNull();
|
||||
then(new DynamicServiceInstanceProvider(this.client, "service").getServiceInstance()).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -52,11 +51,9 @@ public class DynamicServiceInstanceProviderUnitTests {
|
||||
ServiceInstance first = mock(ServiceInstance.class);
|
||||
ServiceInstance second = mock(ServiceInstance.class);
|
||||
|
||||
when(this.client.getInstances(anyString()))
|
||||
.thenReturn(Arrays.asList(first, second));
|
||||
when(this.client.getInstances(anyString())).thenReturn(Arrays.asList(first, second));
|
||||
|
||||
then(new DynamicServiceInstanceProvider(this.client, "service")
|
||||
.getServiceInstance()).isEqualTo(first);
|
||||
then(new DynamicServiceInstanceProvider(this.client, "service").getServiceInstance()).isEqualTo(first);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user