springcloud-ribbon客户端负载均衡

  1. 注入了LoadBalanced的restTemplate
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
	return new RestTemplate();
}
  1. 使用restTemplate调用API是会被LoadBalancerInterceptor拦截
@Override
public  T execute(String serviceId, LoadBalancerRequest 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);
}

serviceId:originalUri.getHost();

springboot自动配置RibbonAutoConfiguration,默认RibbonLoadBalancerClient

@Bean
@ConditionalOnMissingBean(LoadBalancerClient.class)
public LoadBalancerClient loadBalancerClient() {
	return new RibbonLoadBalancerClient(springClientFactory());
}

直接上主流程代码

@Override
public  T execute(String serviceId, LoadBalancerRequest request) throws IOException {
	// 获取负载均衡器
	ILoadBalancer loadBalancer = getLoadBalancer(serviceId);
	// 通过负载均衡器,依据相应策略获取服务
	Server server = getServer(loadBalancer);
	if (server == null) {
		throw new IllegalStateException("No instances available for " + serviceId);
	}
	// 封装为ribbonServer
	RibbonServer ribbonServer = new RibbonServer(serviceId, server, isSecure(server,
			serviceId), serverIntrospector(serviceId).getMetadata(server));
	// 执行服务调用
	return execute(serviceId, ribbonServer, request);
}
  1. 获取loadBalancer

springcloud-ribbon客户端负载均衡_第1张图片

// 是如何获取到的?
protected ILoadBalancer getLoadBalancer(String serviceId) {
	return this.clientFactory.getLoadBalancer(serviceId);
}
  1. 获取server

springboot自动配置RibbonAutoConfiguration,默认RibbonLoadBalancerClient

@Bean
@ConditionalOnMissingBean(LoadBalancerClient.class)
public LoadBalancerClient loadBalancerClient() {
	return new RibbonLoadBalancerClient(springClientFactory());
}

直接上主流程代码

@Override
public  T execute(String serviceId, LoadBalancerRequest request) throws IOException {
	// 获取负载均衡器
	ILoadBalancer loadBalancer = getLoadBalancer(serviceId);
	// 通过负载均衡器,依据相应策略获取服务
	Server server = getServer(loadBalancer);
	if (server == null) {
		throw new IllegalStateException("No instances available for " + serviceId);
	}
	// 封装为ribbonServer
	RibbonServer ribbonServer = new RibbonServer(serviceId, server, isSecure(server,
			serviceId), serverIntrospector(serviceId).getMetadata(server));
	// 执行服务调用
	return execute(serviceId, ribbonServer, request);
}
  1. 获取loadBalancer

springcloud-ribbon客户端负载均衡_第2张图片

// 是如何获取到的?
// 默认提供的是ZoneAwareLoadBalancer
protected ILoadBalancer getLoadBalancer(String serviceId) {
	return this.clientFactory.getLoadBalancer(serviceId);
}
  1. 获取server

springcloud-ribbon客户端负载均衡_第3张图片

你可能感兴趣的:(springcloud)