Ribbon相关
Q:Ribbon的总体流程?
A: 针对被@LoadBalanced修饰的RestTemplate,给该RestTemplate增加LoadBalancerInterceptor拦截器,从而实现对负载均衡器的调用。负载均衡器通过服务名获取过滤后的服务列表,通过负载均衡算法获取其中某台实例,并进行调用
Q:Ribbon如何选择调用哪个实例?
A:
1、获取服务列表:为了减少服务的延迟,客户端会通过eureka.instance.metadata-map.zone指定的zone对服务列表进行过滤
2、负载均衡:通过负载均衡策略从服务列表中获得其中一台,默认是RoundRobinRule轮询策略,再对服务端进行调用
Q:服务列表的获取过程?
A:
1、服务列表默认是基于服务发现的,在应用启动时Ribbon就会从Eureka服务器中获取所有注册服务的列表数据,并保持同步。也可以通过动态设置的方式在配置文件中进行指定
2、通过ServerListFilter对服务器列表进行过滤
ZoneAffinityServerListFilter:基于区域感知的方式,实现对服务实例的过滤,仅返回与本身所处区域一直的服务提供者实例列表;
ServerListSubsetFilter:该过滤器继承自ZoneAffinityServerListFilter,在进行区域感知过滤后,仅返回一个固定大小的服务列表。默认将返回20个服务实例,可以通过ribbon.ServerListSubsetFilter.size进行设置;
ZonePreferenceServerListFilter:使用Eureka和Ribbon时默认的过滤器。实现通过配置或者Eureka所属区域来过滤出同区域的服务实例列表。
Q:Ribbon如何避免调用失效实例?
A:
1、通过IPing检测实例,如果检测到某服务实例不存在/一定时间未响应,则会从持有服务列表中及时移除
2、保留zone的统计数据,ribbon可以避免可能访问失效的zone(剔除无实例、实例故障率大于阈值)
Q:Ribbon有哪些负载均衡策略?
A:
1. 负载平衡的意义什么?
简单来说: 先将集群,集群就是把一个的事情交给多个人去做,假如要做1000个产品给一个人做要10天,我叫10个人做就是一天,这就是集群,负载均衡的话就是用来控制集群,他把做的最多的人让他慢慢做休息会,把做的最少的人让他加量让他做多点。在计算中,负载平衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多种计算资源的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免任何单一资源的过载。使用多个组件进行负载平衡而不是单个组件可能会通过冗余来提高可靠性和可用性。负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务器进程。
2. Ribbon是什么?
Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法。
Ribbon客户端组件提供一系列完善的配置项,如连接超时,重试等。简单的说,就是在配置文件中列出后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。(有点类似Nginx)
3. Nginx与Ribbon的区别
Nginx是反向代理同时可以实现负载均衡,nginx拦截客户端请求采用负载均衡策略根据upstream配置进行转发,相当于请求通过nginx服务器进行转发。Ribbon是客户端负载均衡,从注册中心读取目标服务器信息,然后客户端采用轮询策略对服务直接访问,全程在客户端操作。
4. Ribbon底层实现原理
Ribbon使用discoveryClient从注册中心读取目标服务信息,对同一接口请求进行计数,使用%取余算法获取目标服务集群索引,返回获取到的目标服务信息。
@LoadBalanced注解的作用开启客户端负载均衡。