今天我们来探讨下已经加载到Spring容器中的LoadBalancerEurekaAutoConfiguration自动配置类是如何进行初始化的。
LoadBalancerEurekaAutoConfiguration
java
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties
@ConditionalOnClass(LoadBalancerClientConfigurationRegistrar.class)
@LoadBalancerClients(defaultConfiguration = EurekaLoadBalancerClientConfiguration.class)
@ConditionalOnProperty(name = "eureka.client.enabled", matchIfMissing = true)
public class LoadBalancerEurekaAutoConfiguration {
......
}
该配置类用在spring cloud环境中,为Spring Cloud LoadBalancer与Eureka的集成提供自动配置支持。
初始化时创建的Bean有两个,分别是eurekaLoadBalancerProperties和zoneConfig。
eurekaLoadBalancerProperties负责配置Eureka负载均衡器的相关属性。
java
@Bean
@ConditionalOnMissingBean
EurekaLoadBalancerProperties eurekaLoadBalancerProperties() {
return new EurekaLoadBalancerProperties();
}
例如,可以通过配置文件设置spring.cloud.loadbalancer.eureka.approximateZoneFromHostname=true来开启从主机名中提取区域信息的功能。
java
@ConfigurationProperties("spring.cloud.loadbalancer.eureka")
public class EurekaLoadBalancerProperties {
/**
* Used to determine whether we should try to get the `zone` value from host name.
*/
private boolean approximateZoneFromHostname = false;
public boolean isApproximateZoneFromHostname() {
return approximateZoneFromHostname;
}
public void setApproximateZoneFromHostname(boolean approximateZoneFromHostname) {
this.approximateZoneFromHostname = approximateZoneFromHostname;
}
}
zoneConfig负责配置负载均衡器的区域信息。
java
public static final String LOADBALANCER_ZONE = "spring.cloud.loadbalancer.zone";
@Bean
@ConditionalOnMissingBean
LoadBalancerZoneConfig zoneConfig(Environment environment) {
return new LoadBalancerZoneConfig(environment.getProperty(LOADBALANCER_ZONE));
}
这两个bean的创建条件都是Spring容器中不存在时才会创建。
接下来,我们看下@LoadBalancerClients注解
java
@Configuration
@ConditionalOnBean({ LoadBalancerZoneConfig.class, EurekaLoadBalancerProperties.class })
public class EurekaLoadBalancerClientConfiguration {
......
}
该注解会将负载均衡默认的配置设置为EurekaLoadBalancerClientConfiguration配置类。
该配置类生效的条件是类路径中存在LoadBalancerZoneConfig和EurekaLoadBalancerProperties类。
该配置类实例化后,LoadBalancerZoneConfig会绑定区域的配置为eurekaClientConfig的区域属性。
java
@PostConstruct
public void postprocess() {
if (!StringUtils.isEmpty(zoneConfig.getZone())) {
return;
}
String zone = getZoneFromEureka();
if (!StringUtils.isEmpty(zone)) {
if (LOG.isDebugEnabled()) {
LOG.debug("Setting the value of '" + LOADBALANCER_ZONE + "' to " + zone);
}
zoneConfig.setZone(zone);
}
最后简单来聊聊Spring Cloud LoadBalancer与Ribbon**。**
Spring Cloud LoadBalancer是 Spring Cloud 生态的新一代负载均衡解决方案。而Ribbon是 Netflix 开源的客户端负载均衡工具。
Ribbon曾经是 Spring Cloud 中主要的负载均衡工具。随着 Spring Cloud 的不断演进,Ribbon的地位逐渐被 Spring Cloud LoadBalancer 所取代,它是 Spring Cloud 生态中更推荐的负载均衡解决方案。