springCloud的LoadBalance源码分析

本文详细分析了SpringCloud中的LoadBalancer核心类、LoadBalanced注解及其功能,以及源码实现。通过@LoadBalanced注解,RestTemplate能实现自动负载均衡。源码解析包括LoadBalancerAutoConfiguration配置类的条件判断,以及RibbonAutoConfiguration中如何创建Ribbon实现的负载均衡客户端。文章还提及Eureka客户端默认使用Ribbon的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

springCloud的LoadBalance源码分析


欢迎查看Eetal的第二十篇博客–SpringCloud的LoadBalance源码分析

相关核心类

LoadBalanced
LoadBalancerClient
LoadBalancerAutoConfiguration
LoadBalancerInterceptor
RibbonAutoConfiguration
RibbonClassesConditions
AllNestedConditions
AbstractNestedCondition
AbstractNestedCondition.MemberMatchOutcomes
AbstractNestedCondition.MemberConditions
SpringBootCondition
ConditionOutcome

LoadBalanced注解与功能

通过在创建的RestTemplate上加入LoadBalanced注解,则该RestTemplate会自动成为负载均衡的RestTeplate,请求的url的hostname会作为服务名称去解析
用法如下

	@LoadBalanced
	@Bean
    public RestTemplate restTemplate() {
   
   
        return new RestTemplate();
    }
	
	public String requestTest(){
   
   
	String url = "http://8781-eurekaClient/getClient2Info";
	return restTemplate.getForObject(url, String.class);
		}	

等价于以下写法

@Autowired
	RestTemplate restTemplate;
	
	@Autowired
    private LoadBalancerClient client;
	
	@RequestMapping("/getProviderInfo")
	public String getProviderInfo() {
   
   
		ServiceInstance instance = client.choose("8780-eurekaClient");
        String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/getInfo";
        return restTemplate.getForObject(url, String.class);
	}

源码分析

1.LoadBalanced注解

@Target({
   
    ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Qualifier
public @interface LoadBalanced {
   
   

}

这里注意,该注解被标记了@Qualifier注解,后续使用@Autowired注解注入时,如果注解的属性也被LoadBalanced注解,则只装载一样被LoadBalanced注解的符合autowired的对象
2.LoadBalnceAutoConfigure

@Configuration
@ConditionalOnClass(RestTemplate.class)
@ConditionalOnBean(LoadBalancerClient.class)
@EnableConfigurationProperties(LoadBalancerRetryProperties.class)
public class LoadBalancerAutoConfiguration {
   
   

	@LoadBalanced
	@Autowired(required = false)
	private List<RestTemplate> restTemplates = Collections.emptyList();

	@Autowired(required = false)
	private List<LoadBalancerRequestTransformer> transformers = Collections.emptyList();

	@Bean
	public SmartInitializingSingleton loadBalancedRestTemplateInitializerDeprecated(
			final ObjectProvider<List<RestTemplateCustomizer>> restTemplateCustomizers) {
   
   
		return () -> restTemplateCustomizers.ifAvailable(customizers -> {
   
   
			for (RestTemplate restTemplate : LoadBalancerAutoConfiguration.this.restTemplates) {
   
   
				for (RestTemplateCustomizer customizer : customizers) {
   
   
					customizer.customize(restTemplate);
				}
			}
		});
	}

	@Bean
	@ConditionalOnMissingBean
	public LoadBalancerRequestFactory loadBalancerRequestFactory(
			LoadBalancerClient loadBalancerClient) {
   
   
		return new LoadBalancerRequestFactory(loadBalancerClient, this.transformers);
	}

	@Configuration
	@ConditionalOnMissingClass("org.springframework.retry.support.RetryTemplate")
	static class LoadBalancerInterceptorConfig {
   
   

		@Bean
		public LoadBalancerInterceptor ribbonInterceptor(
				LoadBalancerClient loadBalancerClient,
				LoadBalancerRequestFactory requestFactory) {
   
   
			return new LoadBalancerInterceptor(loadBalancerClient, requestFactory);
		}

		@Bean
		@ConditionalOnMissingBean
		public RestTemplateCustomizer restTemplateCustomizer(
				final LoadBalanc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值