Spring Cloud Ribbon 客户端负载均衡~ ILoadBalancer 初始化

本文详细介绍了Spring Cloud Ribbon客户端负载均衡的初始化过程,特别是ILoadBalancer对象的创建和配置。通过RibbonClientSpecification,我们可以为特定服务或所有服务定制配置,配置优先级遵循特定服务>全部服务>默认配置。同时,文章还提到了自定义配置类的位置和使用属性配置来指定负载均衡的相关实现类。初始化通常在第一次请求服务时发生,但可通过属性调整以在启动时初始化。
摘要由CSDN通过智能技术生成

RestTemplate通过添加LoadBalancerInterceptor拦截器处理请求,LoadBalancerInterceptor依赖LoadBalancerClient实现负载均衡,而LoadBalancerClient实际是委托ILoadBalancer进行负载均衡逻辑处理。

public class RibbonLoadBalancerClient implements LoadBalancerClient {
   
	//...
	
	private SpringClientFactory clientFactory
	
	@Override
	public <T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException {
   
		ILoadBalancer loadBalancer = getLoadBalancer(serviceId);
		Server server = getServer(loadBalancer);
		if (server == null) {
   
			throw new IllegalStateException("No instances available for " + serviceId);
		}
		RibbonServer ribbonServer = new RibbonServer(serviceId, server, isSecure(server,serviceId), serverIntrospector(serviceId).getMetadata(server));

		return execute(serviceId, ribbonServer, request);
	}
	
	protected ILoadBalancer getLoadBalancer(String serviceId) {
   
		return this.clientFactory.getLoadBalancer(serviceId);
	}
	
	//...
}

本节将关注ILoadBalancer对象的初始化,此对象由SpringClientFactory的父类NamedContextFactory#createContext(String name)完成初始化。

public class SpringClientFactory extends NamedContextFactory<RibbonClientSpecification> {
   

	//...
	static final String NAMESPACE = "ribbon";

	public SpringClientFactory() {
   
		super(RibbonClientConfiguration.class, NAMESPACE, "ribbon.client.name");
	}
	
	public ILoadBalancer getLoadBalancer(String name) {
   
		return getInstance(name, ILoadBalancer.class);
	}
	
	@Override
	public <C> C getInstance(String name, Class<C> type) {
   
		C instance = super.getInstance(name, type);
		if (instance != null) {
   
			return instance;
		}
		IClientConfig config = getInstance(name, IClientConfig.class);
		return instantiateWithConfig(getContext(name), type, config);
	}

	@Override
	protected AnnotationConfigApplicationContext getContext(String name) {
   
		return super.getContext(name);
	}

	//...
}
public abstract class NamedContextFactory<C extends NamedContextFactory.Specification>
		implements DisposableBean, ApplicationContextAware {
   

	//...

	private Map<String, AnnotationConfigApplicationContext> contexts = new ConcurrentHashMap<>();
	
	private Map<String, C> configurations = new ConcurrentHashMap<>();
		
	private Class<?> defaultConfigType;
	private final String propertySourceName;
	private final String propertyName;

	public NamedContextFactory(Class<?> defaultConfigType, String propertySourceName,String propertyName) {
   
		this.defaultConfigType = defaultConfigType;
		this.propertySourceName = propertySourceName;
		this.propertyName = propertyName;
	}

	public void setConfigurations(List<C> configurations) {
   
		for (C client : configurations) {
   
			this.configurations.put(client
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值