探究 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 生态中更推荐的负载均衡解决方案。

相关推荐
终端行者1 分钟前
K8s中部署Minio集群 如何部署minio集群
云原生·容器·kubernetes·1024程序员节
抹香鲸之海33 分钟前
Prometheus+Grafana实现Springboot服务监控
spring boot·grafana·prometheus
摇滚侠1 小时前
Spring Boot 3零基础教程,WEB 开发 内嵌服务器底层源码分析 笔记48
spring boot·笔记
Tony Bai2 小时前
【Go 网络编程全解】12 本地高速公路:Unix 域套接字与网络设备信息
开发语言·网络·后端·golang·unix
萌新小码农‍2 小时前
SpringBoot+alibaba的easyexcel实现前端使用excel表格批量插入
前端·spring boot·excel
韩立学长2 小时前
【开题答辩实录分享】以《租房小程序的设计和实现》为例进行答辩实录分享
java·spring boot·小程序
zl9798992 小时前
SpringBoot-数据访问之MyBatis与Redis
java·spring boot·spring
重生之我是Java开发战士3 小时前
【Java EE】快速上手Spring Boot
java·spring boot·java-ee
Yeats_Liao3 小时前
Go Web 编程快速入门 06 - 响应 ResponseWriter:状态码与头部
开发语言·后端·golang
mit6.8243 小时前
[Agent可视化] 编排工作流(Go) | Temporal引擎 | DAG调度器 | ReAct模式实现
开发语言·后端·golang