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

今天我们继续探讨已经加载到Spring容器中的RibbonEurekaAutoConfiguration自动配置类是如何进行初始化的。

RibbonEurekaAutoConfiguration

java 复制代码
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties
@ConditionalOnRibbonAndEurekaEnabled
@AutoConfigureAfter(RibbonAutoConfiguration.class)
@RibbonClients(defaultConfiguration = EurekaRibbonClientConfiguration.class)
public class RibbonEurekaAutoConfiguration {

}

RibbonEurekaAutoConfiguration自动配置类注入到Spring容器之前,会为Ribbon客户端设置默认配置,同时在RibbonAutoConfiguration类被加载之后才会被注入到Spring容器中。

我们分别来看下RibbonAutoConfiguration和EurekaRibbonClientConfiguration

RibbonAutoConfiguration

java 复制代码
@Configuration
@Conditional({RibbonClassesConditions.class})
@RibbonClients
@AutoConfigureAfter(
    name = {"org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration"}
)
@AutoConfigureBefore({LoadBalancerAutoConfiguration.class, AsyncLoadBalancerAutoConfiguration.class})
@EnableConfigurationProperties({RibbonEagerLoadProperties.class, ServerIntrospectorProperties.class})
public class RibbonAutoConfiguration {
    ......
}
  • 生效的条件:在EurekaClientAutoConfiguration类加载之后被加载,且在LoadBalancerAutoConfiguration和 AsyncLoadBalancerAutoConfiguration类加载之前加载,同时Ribbon 相关类存在时才生效。
  • 日志
java 复制代码
RibbonAutoConfiguration matched:
      - AllNestedConditions 4 matched 0 did not; NestedCondition on RibbonAutoConfiguration.RibbonClassesConditions.RibbonPresent @ConditionalOnClass found required class 'com.netflix.ribbon.Ribbon'; NestedCondition on RibbonAutoConfiguration.RibbonClassesConditions.AsyncRestTemplatePresent @ConditionalOnClass found required class 'org.springframework.web.client.AsyncRestTemplate'; NestedCondition on RibbonAutoConfiguration.RibbonClassesConditions.RestTemplatePresent @ConditionalOnClass found required class 'org.springframework.web.client.RestTemplate'; NestedCondition on RibbonAutoConfiguration.RibbonClassesConditions.IClientPresent @ConditionalOnClass found required class 'com.netflix.client.IClient' (RibbonAutoConfiguration.RibbonClassesConditions)

   RibbonAutoConfiguration#loadBalancerClient matched:
      - @ConditionalOnMissingBean (types: org.springframework.cloud.client.loadbalancer.LoadBalancerClient; SearchStrategy: all) did not find any beans (OnBeanCondition)

   RibbonAutoConfiguration#propertiesFactory matched:
      - @ConditionalOnMissingBean (types: org.springframework.cloud.netflix.ribbon.PropertiesFactory; SearchStrategy: all) did not find any beans (OnBeanCondition)

   RibbonAutoConfiguration#springClientFactory matched:
      - @ConditionalOnMissingBean (types: org.springframework.cloud.netflix.ribbon.SpringClientFactory; SearchStrategy: all) did not find any beans (OnBeanCondition)

小结:RibbonAutoConfiguration会被注入到Spring容器中。

EurekaRibbonClientConfiguration

该配置类是为使用 Eureka 进行服务发现的 Ribbon 客户端提供自动配置。以实现负载均衡和服务发现的功能。

该配置类初始化的时候,会创建3个bean。

  1. ribbonPing(IClientConfig config)方法
java 复制代码
    @Bean
	@ConditionalOnMissingBean
	public IPing ribbonPing(IClientConfig config) {
		if (this.propertiesFactory.isSet(IPing.class, serviceId)) {
			return this.propertiesFactory.get(IPing.class, config, serviceId);
		}
		NIWSDiscoveryPing ping = new NIWSDiscoveryPing();
		ping.initWithNiwsConfig(config);
		return ping;
	}

创建IPing类型的 Bean,用于检查Ribbon 客户端所调用的后端服务实例的健康状态。

  1. ribbonServerList(IClientConfig config, Provider<EurekaClient> eurekaClientProvider)方法
java 复制代码
    @Bean
	@ConditionalOnMissingBean
	public ServerList<?> ribbonServerList(IClientConfig config,
			Provider<EurekaClient> eurekaClientProvider) {
		if (this.propertiesFactory.isSet(ServerList.class, serviceId)) {
			return this.propertiesFactory.get(ServerList.class, config, serviceId);
		}
		DiscoveryEnabledNIWSServerList discoveryServerList = new DiscoveryEnabledNIWSServerList(
				config, eurekaClientProvider);
		DomainExtractingServerList serverList = new DomainExtractingServerList(
				discoveryServerList, config, this.approximateZoneFromHostname);
		return serverList;
	}

创建ServerList<?>类型的 Bean,用于获取可用的后端服务实例列表。

  1. serverIntrospector()方法
java 复制代码
    @Bean
	public ServerIntrospector serverIntrospector() {
		return new EurekaServerIntrospector();
	}

创建ServerIntrospector类型的 Bean,用于获取服务实例的详细信息。

在该EurekaRibbonClientConfiguration类被初始化完成之后,还会调用preprocess()方法,进行一些预处理的操作。

至此,RibbonEurekaAutoConfiguration自动配置类完成了在Spring容器中的初始化,使得在分布式系统中,Ribbon 和 Eureka 能够协同工作,确保服务的高可用性和可靠性。

相关推荐
用户8181870627462 分钟前
第26章 Kafka vs RocketMQ vs RabbitMQ真实选型对比
java·后端
lv__pf4 分钟前
09-深入理解AQS之独占锁ReentrantLock源码分析【TL 并发 09】
java·开发语言
letisgo54 分钟前
JAVA 高级进阶18篇《生产级RAG:切分、检索、评估与Graph RAG全链路实战》
java·面试·检索增强·rag·graph rag
随遇而安zx7 分钟前
【并发】---Disruptor 原理、源码与实战 深度解析
java·并发·disruptor
Lyyaoo.11 分钟前
【二分查找】【困难】寻找两个有序数组的中位数
java·数据结构·算法
小兔崽子去哪了12 分钟前
深度学习 2 / CNN 神经网络
后端·python
小羊没烦恼!24 分钟前
Memory 记忆设计讨论:Agent Memory 的安全边界:权限、删除、版本与回执
java·大数据·word·powerpoint·.net
这是程序猿24 分钟前
Java线程池深度剖析:源码原理、核心参数、任务调度与生产调优实战
java·开发语言·python
rannn_11126 分钟前
【Java面试八股】Java基础篇|数据类型、面向对象、关键字、反射、注解、异常、新特性、序列化、设计模式、IO
java·后端·面试
用户83562907805135 分钟前
Python 实现 Word 文档域的插入与管理
后端·python