负载均衡
在 Spring Cloud 中,能够使用的负载均衡,如下:
- spring-cloud-netflix-ribbon ,基于 Ribbon 实现。
- spring-cloud-loadbalancer ,提供简单的负载均衡功能。
以上的实现,都是基于 spring-cloud-commons 的 loadbalancer 的 ServiceInstanceChooser 接口,实现统一的服务的选择。并且,负载均衡组件在选择需要调用的服务之后,还提供调用该服务的功能,具体方法见 LoadBalancerClient 接口的 #execute(…) 方法。
为什么要负载均衡?
简单来说,随着业务的发展,单台服务无法支撑访问的需要,于是搭建多个服务形成集群。那么随之要解决的是,每次请求,调用哪个服务,也就是需要进行负载均衡。
目前负载均衡有两种模式:
- 客户端模式
- 服务端模式
在 Spring Cloud 中,我们使用前者,即客户端模式。
详细的内容,可以看看 《客户端负载均衡与服务端负载均衡》 。
🦅 负载平衡的意义什么?
在计算中,负载平衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多种计算资源的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免任何单一资源的过载。使用多个组件进行负载平衡而不是单个组件可能会通过冗余来提高可靠性和可用性。负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务器进程。
Ribbon
- 作用:主要提供客户侧的软件负载均衡算法。
- 简介:Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于 Netflix Ribbon 实现。通过 Spring Cloud 的封装,可以让我们轻松地将面向服务的 REST 模版请求自动转换成客户端负载均衡的服务调用。
- 注意看上图,关键点就是将外界的 rest 调用,根据负载均衡策略转换为微服务调用。
Ribbon 原理,整体如下图:
关于 Ribbon 的源码解析,可以看看艿艿整理的 《Ribbon 源码解析系列》 。
Ribbon 有哪些负载均衡算法?
其中,默认的负载均衡算法是 Round Robin 算法,顺序向下轮询。
聊聊 Ribbon 缓存机制?
还是 《Eureka 缓存细节以及生产环境的最佳配置》 这篇文章,Ribbon 的缓存,可能也坑道蛮多人了。
聊聊 Ribbon 重试机制?
除了重试次数,还有请求的超时可以配置。
Ribbon 是怎么和 Eureka 整合的?
对着我们看到那张 Ribbon 原理图:
- 首先,Ribbon 会从 Eureka Client 里获取到对应的服务列表。
- 然后,Ribbon 使用负载均衡算法获得使用的服务。
- 最后,Ribbon 调用对应的服务。
另外,此处的 Eureka 仅仅是作为注册中心的举例,也是可以配合其它的注册中心使用,例如 Zookeeper 。可参考 《以 Zookeeper 为注册中心搭建 Spring Cloud 环境》 文章。


