探究 Eureka 在 Spring Boot 中的配置注入与统一管理机制(下)——第三节

今天我们来探讨下已经加载到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 生态中更推荐的负载均衡解决方案。

相关推荐
花酒锄作田2 分钟前
KRaft部署单点三实例Kafka集群
后端
BingoGo3 分钟前
重新学习 PHP 目前短运算符 简化你得代码
后端·php
就是帅我不改4 分钟前
从“写循环”到“写思想”:Java Stream 流的高级实战与底层原理剖析
后端·面试·架构
自由的疯5 分钟前
Java 通过接口方式使用 DeepSeek 详解
java·后端·trae
Cache技术分享5 分钟前
163. Java Lambda 表达式 - Function 的链式组合
前端·后端
AskHarries7 分钟前
如何让你的 GitHub 开源项目获得腾讯 EdgeOne 免费 CDN 加速:完整申请流程解读
后端
雨落倾城夏未凉26 分钟前
5.通过拷贝构造函数复制一个对象,假如对象的成员中有个指针类型的变量,如何避免拷贝出来的副本中的该成员之下行同一块内存(等价于默认拷贝构造函数有没有缺点)
c++·后端
雨落倾城夏未凉28 分钟前
4.深拷贝VS浅拷贝
c++·后端
dl74331 分钟前
一文看懂spring配置原理
后端