Ribbon utilities

parent 84f56ec3
...@@ -26,6 +26,8 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -26,6 +26,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.cloud.netflix.ribbon.PropertiesFactory; import org.springframework.cloud.netflix.ribbon.PropertiesFactory;
import org.springframework.cloud.netflix.ribbon.RibbonClientName;
import org.springframework.cloud.netflix.ribbon.RibbonUtils;
import org.springframework.cloud.netflix.ribbon.ServerIntrospector; import org.springframework.cloud.netflix.ribbon.ServerIntrospector;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
...@@ -41,10 +43,6 @@ import com.netflix.loadbalancer.ServerList; ...@@ -41,10 +43,6 @@ import com.netflix.loadbalancer.ServerList;
import com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList; import com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList;
import com.netflix.niws.loadbalancer.NIWSDiscoveryPing; import com.netflix.niws.loadbalancer.NIWSDiscoveryPing;
import static com.netflix.client.config.CommonClientConfigKey.DeploymentContextBasedVipAddresses;
import static com.netflix.client.config.CommonClientConfigKey.EnableZoneAffinity;
import static org.springframework.cloud.netflix.ribbon.RibbonUtils.setRibbonProperty;
/** /**
* Preprocessor that configures defaults for eureka-discovered ribbon clients. Such as: * Preprocessor that configures defaults for eureka-discovered ribbon clients. Such as:
* <code>@zone</code>, NIWSServerListClassName, DeploymentContextBasedVipAddresses, * <code>@zone</code>, NIWSServerListClassName, DeploymentContextBasedVipAddresses,
...@@ -62,7 +60,7 @@ public class EurekaRibbonClientConfiguration { ...@@ -62,7 +60,7 @@ public class EurekaRibbonClientConfiguration {
@Value("${ribbon.eureka.approximateZoneFromHostname:false}") @Value("${ribbon.eureka.approximateZoneFromHostname:false}")
private boolean approximateZoneFromHostname = false; private boolean approximateZoneFromHostname = false;
@Value("${ribbon.client.name}") @RibbonClientName
private String serviceId = "client"; private String serviceId = "client";
@Autowired(required = false) @Autowired(required = false)
...@@ -145,9 +143,7 @@ public class EurekaRibbonClientConfiguration { ...@@ -145,9 +143,7 @@ public class EurekaRibbonClientConfiguration {
} }
} }
} }
setRibbonProperty(this.serviceId, DeploymentContextBasedVipAddresses.key(), RibbonUtils.initializeRibbonDefaults(serviceId);
this.serviceId);
setRibbonProperty(this.serviceId, EnableZoneAffinity.key(), "true");
} }
} }
...@@ -17,11 +17,11 @@ ...@@ -17,11 +17,11 @@
package org.springframework.cloud.netflix.ribbon; package org.springframework.cloud.netflix.ribbon;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import com.netflix.client.AbstractLoadBalancerAwareClient; import com.netflix.client.AbstractLoadBalancerAwareClient;
import com.netflix.client.RetryHandler; import com.netflix.client.RetryHandler;
import com.netflix.client.config.IClientConfig; import com.netflix.client.config.IClientConfig;
...@@ -36,7 +36,7 @@ import com.netflix.servo.monitor.Monitors; ...@@ -36,7 +36,7 @@ import com.netflix.servo.monitor.Monitors;
@Configuration @Configuration
@RibbonAutoConfiguration.ConditionalOnRibbonRestClient @RibbonAutoConfiguration.ConditionalOnRibbonRestClient
class RestClientRibbonConfiguration { class RestClientRibbonConfiguration {
@Value("${ribbon.client.name}") @RibbonClientName
private String name = "client"; private String name = "client";
/** /**
......
...@@ -21,7 +21,6 @@ import javax.annotation.PostConstruct; ...@@ -21,7 +21,6 @@ import javax.annotation.PostConstruct;
import org.apache.http.client.params.ClientPNames; import org.apache.http.client.params.ClientPNames;
import org.apache.http.client.params.CookiePolicy; import org.apache.http.client.params.CookiePolicy;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.commons.httpclient.HttpClientConfiguration; import org.springframework.cloud.commons.httpclient.HttpClientConfiguration;
...@@ -70,7 +69,7 @@ public class RibbonClientConfiguration { ...@@ -70,7 +69,7 @@ public class RibbonClientConfiguration {
public static final int DEFAULT_CONNECT_TIMEOUT = 1000; public static final int DEFAULT_CONNECT_TIMEOUT = 1000;
public static final int DEFAULT_READ_TIMEOUT = 1000; public static final int DEFAULT_READ_TIMEOUT = 1000;
@Value("${ribbon.client.name}") @RibbonClientName
private String name = "client"; private String name = "client";
// TODO: maybe re-instate autowired load balancers: identified by name they could be // TODO: maybe re-instate autowired load balancers: identified by name they could be
......
package org.springframework.cloud.netflix.ribbon;
import org.springframework.beans.factory.annotation.Value;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Annotation at the field or method/constructor parameter level that injects the
* Ribbon Client Name that got allocated at runtime. Provides a convenient
* alternative for <code>&#064;Value(&quot;${ribbon.client.name}&quot;)</code>.
*
* @author Spencer Gibb
* @since 2.0.0
*/
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER,
ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Value("${ribbon.client.name}")
public @interface RibbonClientName {
}
...@@ -2,6 +2,7 @@ package org.springframework.cloud.netflix.ribbon; ...@@ -2,6 +2,7 @@ package org.springframework.cloud.netflix.ribbon;
import java.net.URI; import java.net.URI;
import com.netflix.client.config.IClientConfigKey;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.web.util.UriComponentsBuilder; import org.springframework.web.util.UriComponentsBuilder;
import com.netflix.client.config.CommonClientConfigKey; import com.netflix.client.config.CommonClientConfigKey;
...@@ -14,6 +15,17 @@ import com.netflix.loadbalancer.Server; ...@@ -14,6 +15,17 @@ import com.netflix.loadbalancer.Server;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import static com.netflix.client.config.CommonClientConfigKey.DeploymentContextBasedVipAddresses;
import static com.netflix.client.config.CommonClientConfigKey.EnableZoneAffinity;
import static com.netflix.client.config.CommonClientConfigKey.Port;
import static com.netflix.client.config.CommonClientConfigKey.SecurePort;
import static com.netflix.client.config.DefaultClientConfigImpl.DEFAULT_CONNECT_TIMEOUT;
import static com.netflix.client.config.DefaultClientConfigImpl.DEFAULT_FOLLOW_REDIRECTS;
import static com.netflix.client.config.DefaultClientConfigImpl.DEFAULT_MAX_TOTAL_CONNECTIONS;
import static com.netflix.client.config.DefaultClientConfigImpl.DEFAULT_OK_TO_RETRY_ON_ALL_OPERATIONS;
import static com.netflix.client.config.DefaultClientConfigImpl.DEFAULT_PORT;
import static com.netflix.client.config.DefaultClientConfigImpl.DEFAULT_READ_TIMEOUT;
/** /**
* @author Spencer Gibb * @author Spencer Gibb
* @author Jacques-Etienne Beaudet * @author Jacques-Etienne Beaudet
...@@ -22,7 +34,6 @@ import java.util.Map; ...@@ -22,7 +34,6 @@ import java.util.Map;
public class RibbonUtils { public class RibbonUtils {
public static final String VALUE_NOT_SET = "__not__set__"; public static final String VALUE_NOT_SET = "__not__set__";
public static final String DEFAULT_NAMESPACE = "ribbon"; public static final String DEFAULT_NAMESPACE = "ribbon";
private static final Map<String, String> unsecureSchemeMapping; private static final Map<String, String> unsecureSchemeMapping;
...@@ -33,6 +44,100 @@ public class RibbonUtils { ...@@ -33,6 +44,100 @@ public class RibbonUtils {
unsecureSchemeMapping.put("ws", "wss"); unsecureSchemeMapping.put("ws", "wss");
} }
public static void initializeRibbonDefaults(String serviceId) {
setRibbonProperty(serviceId, DeploymentContextBasedVipAddresses.key(),
serviceId);
setRibbonProperty(serviceId, EnableZoneAffinity.key(), "true");
}
public static RibbonProperties from(IClientConfig config) {
return new RibbonProperties(config);
}
//TODO: add more commonly used properties
//TODO: refactor s-c-netflix to use this class where possible
public static class RibbonProperties {
private final IClientConfig config;
RibbonProperties(IClientConfig config) {
this.config = config;
}
public Integer getPort() {
return get(Port);
}
public int port() {
return get(Port, DEFAULT_PORT);
}
public Integer getSecurePort() {
return this.config.get(SecurePort);
}
public Boolean getSecure() {
return get(CommonClientConfigKey.IsSecure);
}
public boolean isSecure() {
return get(CommonClientConfigKey.IsSecure, false);
}
public Integer getReadTimeout() {
return get(CommonClientConfigKey.ReadTimeout);
}
public int readTimeout() {
return get(CommonClientConfigKey.ReadTimeout, DEFAULT_READ_TIMEOUT);
}
public Integer getConnectTimeout() {
return get(CommonClientConfigKey.ConnectTimeout);
}
public int connectTimeout() {
return get(CommonClientConfigKey.ConnectTimeout, DEFAULT_CONNECT_TIMEOUT);
}
public Boolean getOkToRetryOnAllOperations() {
return get(CommonClientConfigKey.OkToRetryOnAllOperations);
}
public boolean isOkToRetryOnAllOperations() {
return get(CommonClientConfigKey.OkToRetryOnAllOperations,
DEFAULT_OK_TO_RETRY_ON_ALL_OPERATIONS);
}
public Boolean getFollowRedirects() {
return get(CommonClientConfigKey.FollowRedirects);
}
public boolean isFollowRedirects() {
return get(CommonClientConfigKey.FollowRedirects,
DEFAULT_FOLLOW_REDIRECTS);
}
public Integer getMaxTotalConnections() {
return get(CommonClientConfigKey.MaxTotalConnections);
}
public int maxTotalConnections() {
return get(CommonClientConfigKey.MaxTotalConnections, DEFAULT_MAX_TOTAL_CONNECTIONS);
}
public <T> boolean has(IClientConfigKey<T> key) {
return this.config.containsProperty(key);
}
public <T> T get(IClientConfigKey<T> key) {
return this.config.get(key);
}
public <T> T get(IClientConfigKey<T> key, T defaultValue) {
return this.config.get(key, defaultValue);
}
}
public static void setRibbonProperty(String serviceId, String suffix, String value) { public static void setRibbonProperty(String serviceId, String suffix, String value) {
// how to set the namespace properly? // how to set the namespace properly?
String key = getRibbonKey(serviceId, suffix); String key = getRibbonKey(serviceId, suffix);
......
...@@ -20,13 +20,14 @@ package org.springframework.cloud.netflix.ribbon.apache; ...@@ -20,13 +20,14 @@ package org.springframework.cloud.netflix.ribbon.apache;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.annotation.PreDestroy; import javax.annotation.PreDestroy;
import org.apache.http.client.config.RequestConfig; import org.apache.http.client.config.RequestConfig;
import org.apache.http.config.RegistryBuilder; import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.HttpClientConnectionManager; import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.CloseableHttpClient;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
...@@ -35,9 +36,11 @@ import org.springframework.cloud.client.loadbalancer.LoadBalancedBackOffPolicyFa ...@@ -35,9 +36,11 @@ import org.springframework.cloud.client.loadbalancer.LoadBalancedBackOffPolicyFa
import org.springframework.cloud.client.loadbalancer.LoadBalancedRetryPolicyFactory; import org.springframework.cloud.client.loadbalancer.LoadBalancedRetryPolicyFactory;
import org.springframework.cloud.commons.httpclient.ApacheHttpClientConnectionManagerFactory; import org.springframework.cloud.commons.httpclient.ApacheHttpClientConnectionManagerFactory;
import org.springframework.cloud.commons.httpclient.ApacheHttpClientFactory; import org.springframework.cloud.commons.httpclient.ApacheHttpClientFactory;
import org.springframework.cloud.netflix.ribbon.RibbonClientName;
import org.springframework.cloud.netflix.ribbon.ServerIntrospector;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.cloud.netflix.ribbon.ServerIntrospector;
import com.netflix.client.AbstractLoadBalancerAwareClient; import com.netflix.client.AbstractLoadBalancerAwareClient;
import com.netflix.client.RetryHandler; import com.netflix.client.RetryHandler;
import com.netflix.client.config.CommonClientConfigKey; import com.netflix.client.config.CommonClientConfigKey;
...@@ -53,7 +56,7 @@ import com.netflix.servo.monitor.Monitors; ...@@ -53,7 +56,7 @@ import com.netflix.servo.monitor.Monitors;
@ConditionalOnClass(name = "org.apache.http.client.HttpClient") @ConditionalOnClass(name = "org.apache.http.client.HttpClient")
@ConditionalOnProperty(name = "ribbon.httpclient.enabled", matchIfMissing = true) @ConditionalOnProperty(name = "ribbon.httpclient.enabled", matchIfMissing = true)
public class HttpClientRibbonConfiguration { public class HttpClientRibbonConfiguration {
@Value("${ribbon.client.name}") @RibbonClientName
private String name = "client"; private String name = "client";
@Configuration @Configuration
......
...@@ -17,12 +17,10 @@ ...@@ -17,12 +17,10 @@
package org.springframework.cloud.netflix.ribbon.okhttp; package org.springframework.cloud.netflix.ribbon.okhttp;
import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.annotation.PreDestroy; import javax.annotation.PreDestroy;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
...@@ -31,9 +29,11 @@ import org.springframework.cloud.client.loadbalancer.LoadBalancedBackOffPolicyFa ...@@ -31,9 +29,11 @@ import org.springframework.cloud.client.loadbalancer.LoadBalancedBackOffPolicyFa
import org.springframework.cloud.client.loadbalancer.LoadBalancedRetryPolicyFactory; import org.springframework.cloud.client.loadbalancer.LoadBalancedRetryPolicyFactory;
import org.springframework.cloud.commons.httpclient.OkHttpClientConnectionPoolFactory; import org.springframework.cloud.commons.httpclient.OkHttpClientConnectionPoolFactory;
import org.springframework.cloud.commons.httpclient.OkHttpClientFactory; import org.springframework.cloud.commons.httpclient.OkHttpClientFactory;
import org.springframework.cloud.netflix.ribbon.RibbonClientName;
import org.springframework.cloud.netflix.ribbon.ServerIntrospector; import org.springframework.cloud.netflix.ribbon.ServerIntrospector;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import com.netflix.client.AbstractLoadBalancerAwareClient; import com.netflix.client.AbstractLoadBalancerAwareClient;
import com.netflix.client.RetryHandler; import com.netflix.client.RetryHandler;
import com.netflix.client.config.CommonClientConfigKey; import com.netflix.client.config.CommonClientConfigKey;
...@@ -42,6 +42,9 @@ import com.netflix.client.config.IClientConfig; ...@@ -42,6 +42,9 @@ import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.ILoadBalancer; import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.servo.monitor.Monitors; import com.netflix.servo.monitor.Monitors;
import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient;
/** /**
* @author Spencer Gibb * @author Spencer Gibb
*/ */
...@@ -49,7 +52,7 @@ import com.netflix.servo.monitor.Monitors; ...@@ -49,7 +52,7 @@ import com.netflix.servo.monitor.Monitors;
@ConditionalOnProperty("ribbon.okhttp.enabled") @ConditionalOnProperty("ribbon.okhttp.enabled")
@ConditionalOnClass(name = "okhttp3.OkHttpClient") @ConditionalOnClass(name = "okhttp3.OkHttpClient")
public class OkHttpRibbonConfiguration { public class OkHttpRibbonConfiguration {
@Value("${ribbon.client.name}") @RibbonClientName
private String name = "client"; private String name = "client";
@Configuration @Configuration
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment