源码

在Controller里注入LoadBalancerClient,通过choose方法得到服务具体信息,而eureka是通过DiscoveryClient的getInstances方法获取。
Spring Cloud——ribbon(负载均衡源码分析、算法详解、总结)-LMLPHP
Spring Cloud——ribbon(负载均衡源码分析、算法详解、总结)-LMLPHP
自旋死循环来拿到server,线程安全

负载均衡算法

负载均衡算法:随机 轮训 权重 iphash
1.RoundRobinRule–轮询 请求次数 % 机器数量 2.RandomRule–随机 3.权重 4. iphash 3.AvailabilityFilteringRule --会先过滤掉由于多次访问故障处于断路器跳闸状态的服 务,还有并发的连接数量超过阈值的服务,然后对于剩余的服务列表按照轮询的策略进行访问 4.WeightedResponseTimeRule–根据平均响应时间计算所有服务的权重,响应时间越快服 务权重越大被选中的概率越大。刚启动时如果同统计信息不足,则使用轮询的策略,等统计信 息足够会切换到自身规则
5.RetryRule-- 先按照轮询的策略获取服务,如果获取服务失败则在指定的时间内会进行重 试,获取可用的服务 6.BestAvailableRule --会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后 选择一个并发量小的服务 7.ZoneAvoidanceRule – 默认规则,复合判断 Server 所在区域的性能和 Server 的可用 行选择服务器。
Ribbon 默认使用哪一个负载均衡算法: ZoneAvoidanceRule :区间内亲和轮询的算法!通过一个 key 来区分

访问不同服务使用不同算法

在yml文件中,第一行写提供者名称(集群名)
Spring Cloud——ribbon(负载均衡源码分析、算法详解、总结)-LMLPHP

# 访问不同的服务使用不同的算法规则
provider-a: #先写服务提供者的应用名称
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 算法名

若想在全局改,则进入启动类中,通过@Bean实现

@Bean
public IRule myRule() {
	//指定调用所有的服务都用此算法 
	return new RandomRule();
}

总结

ribbon: #全局的设置 
	eager-load:
		enabled: false # ribbon 一启动不会主动去拉取服务列表,当实际使用时才 去拉取 是否立即加载 
	http:
		client:
			enabled: false # 在 ribbon 最后要发起 Http 的调用调用,我们认为是 RestTemplate 完成的,其实最后是 HttpURLConnection 来完成的,这里面设置为 true , 可以把 HttpUrlConnection->HttpClient 
	okhttp:
		enabled: false #HttpUrlConnection 来完成的,这里面设置为 true ,可以 把 HttpUrlConnection->OkHttpClient(也是发 http 请求的,它在移动端的开发用的多) provider: #提供者的服务名称,那么访问该服务的时候就会按照自定义的负载均衡算法 ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #修改默认负载均衡算法,几种算法的全限定类名 # NFLoadBalancerClassName: #loadBalance 策略 # NFLoadBalancerPingClassName: #ping 机制策略 # NIWSServerListClassName: #服务列表策略 # NIWSServerListFilterClassName: #服务列表过滤策略 ZonePreferenceServerListFilter 默认是优先过滤非一个区的服务列表

Ribbon 是客户端实现负载均衡的远程调用组件,用法简单
Ribbon 源码核心:
ILoadBalancer 接口:起到承上启下的作用

  1. 承上:从 eureka 拉取服务列表
  2. 启下:使用 IRule 算法实现客户端调用的负载均衡
    Spring Cloud——ribbon(负载均衡源码分析、算法详解、总结)-LMLPHP
07-25 17:41