springcloud-ribbon客户端负载均衡

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

serviceId:originalUri.getHost();

springboot自动配置RibbonAutoConfiguration,默认RibbonLoadBalancerClient

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

直接上主流程代码

@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 ribbonServer = new RibbonServer(serviceId, server, isSecure(server,
			serviceId), serverIntrospector(serviceId).getMetadata(server));
	// 执行服务调用
	return execute(serviceId, ribbonServer, request);
}
  1. 获取loadBalancer

这里写图片描述

// 是如何获取到的?
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> 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 ribbonServer = new RibbonServer(serviceId, server, isSecure(server,
			serviceId), serverIntrospector(serviceId).getMetadata(server));
	// 执行服务调用
	return execute(serviceId, ribbonServer, request);
}
  1. 获取loadBalancer

这里写图片描述

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

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值