客户端负载均衡
在生产环境中,每个服务节点都必须保证高可用,因此需要对服务节点进行负载均衡处理。传统的负载均衡属于服务端负载均衡,利用负载硬件或软件实现,如Nginx、LVS、HAProxy都是部署在服务端,如图3-18所示。
图3-18 服务端负载
在微服务架构下,负载均衡方式发生了明显的变化,如图3-19所示,库存服务部署了两个节点,分别位于10.1.22.31和10.1.22.41两台服务器上。当服务启动时,它们都会将自己的IP地址和端口信息发送给注册中心,因此注册表中就会存储两条库存服务的注册记录。
当订单服务请求库存服务时,从注册中心获取注册表信息时就会发现两个可用的库存服务(10.1.22.31:8801、10.1.22.41:8801),订单服务选择其中一个IP地址和端口进行请求即可,每次请求都根据负载策略决定。
图3-19 微服务客户端负载原理
整个负载的过程发生在调用方(客户端),因此称之为客户端负载均衡。客户端负载均衡很好地避免了负载设备的引入,服务节点之间依然可以直接通信,极大地提高了微服务的交互性能,这也是其与
Nginx等服务端负载技术的核心区别。
客户端负载均衡策略主要有以下8种。
(1) 轮询策略:依次向微服务发送请求,一般为默认策略。
(2) 最小并发数策略:选择一个最小并发请求数的服务。
(3) 最小连接数策略:选择一个连接数最小的服务进行调用。
(4) 可用性过滤策略:过滤那些不可用,或者被标记为已中断的服务。
(5) 响应时间权重策略:根据微服务响应的时长计算权重,将请求更多地发送至权重较大的服务上。
(6) 重试策略:使用重试机制,在选择目标服务失败时,重新尝试选择。
(7) 随机策略:随机选择一个微服务进行调用。
(8) 可用区域策略:判断微服务所在的区(一般一个区是一个数据中心)是否可用,只选择可用区的服务进行调用。
Spring Cloud框架中使用Ribbon组件实现负载均衡,默认使用轮询策略,具体细节这里不再深入。