一、什么是 LoadBalancer?
LoadBalancer(负载均衡器)是一种网络设备或软件机制,用于分发传入的网络流量负载(请求)到多个后端目标服务器上,从而实现系统资源的均衡利用和提高系统的可用性和性能。
1.1 负载均衡分类
服务器负载均衡是在服务端通过硬件设备(如 F5)或软件(如 Nginx)接收客户端请求并依据算法将其分发至后端多个服务器以平衡负载
客户端负载均衡是客户端自身维护可用服务列表并按特定算法自主选择服务实例来发送请求。
1.2 常见负载均衡策略
静态负载均衡策略
这类策略不考虑服务器的实时负载情况,根据预设的规则进行请求分配。
-
轮询(Round Robin)
-
负载均衡器按照顺序依次将客户端请求分配给后端服务器列表中的每一台服务器,当分配到列表末尾时,再从头开始。
-
例如,有三台服务器 A、B、C,请求 1 分配给 A,请求 2 分配给 B,请求 3 分配给 C,请求 4 又分配给 A,以此类推。该策略简单易实现,适用于各服务器性能相近的场景。
-
-
加权轮询(Weighted Round Robin)
-
考虑到后端服务器的性能差异,为每台服务器分配一个权重值,负载均衡器根据权重比例来分配请求。
-
比如,服务器 A、B、C 的权重分别为 2、3、1,那么在分配请求时,每 6 个请求中,服务器 A 会收到 2 个,服务器 B 会收到 3 个,服务器 C 会收到 1 个。这种策略能更合理地利用不同性能的服务器资源。
-
-
IP 哈希(IP Hash)
-
根据客户端的 IP 地址进行哈希计算,将计算结果与后端服务器数量取模,得到的结果对应服务器列表中的索引,从而将请求分配到该服务器上。
-
这意味着同一客户端的请求总是会被分配到同一台服务器上,适合需要保持会话状态的应用场景,如购物车、用户登录等。
-
动态负载均衡策略
这类策略会实时监测服务器的负载情况,根据服务器的当前状态来分配请求。
-
最少连接(Least Connections)
-
负载均衡器会将新的请求分配给当前连接数最少的服务器,以确保各服务器的负载相对均衡。
-
例如,服务器 A 当前有 10 个连接,服务器 B 有 5 个连接,服务器 C 有 8 个连接,那么新的请求会被分配给服务器 B。该策略能动态地适应服务器的负载变化,充分利用服务器资源。
-
-
加权最少连接(Weighted Least Connections)
-
结合了服务器的权重和当前连接数来分配请求。在考虑服务器连接数的同时,也考虑服务器的性能差异。
-
给性能高的服务器分配更高的权重,在分配请求时,会综合计算服务器的连接数和权重,选择相对负载最轻的服务器。比如,服务器 A 权重为 2,当前连接数为 10;服务器 B 权重为 1,当前连接数为 5,可能会根据特定的计算公式来判断将请求分配给哪台服务器更合适。
-
-
响应时间(Response Time)
-
负载均衡器会实时监测后端服务器的响应时间,将请求分配给响应时间最短的服务器。
-
这样可以保证客户端能够更快地得到响应,提高用户体验。例如,在电商网站的促销活动期间,不同服务器的处理能力和负载可能会有较大差异,通过响应时间策略可以将请求导向处理速度快的服务器。
-
二、LoadBalancer在微服务中的作用
流量分发与负载均衡
-
均匀分配请求:微服务通常会部署多个实例以应对高并发和提高可用性。LoadBalancer 能将客户端的请求均匀地分发到这些实例上,避免部分实例过载而部分闲置的情况。例如,一个电商系统的商品服务部署了多个实例,LoadBalancer 可根据各实例的负载状态,将商品查询请求合理分配,确保每个实例的工作负载相对均衡。
-
应对流量高峰:在业务流量高峰期,如电商的促销活动期间,LoadBalancer 能够动态调整请求的分配,将更多的流量导向负载较轻的实例,保障系统的整体性能和稳定性,防止因某个实例不堪重负而崩溃。
高可用性与容错
-
实例健康检查:LoadBalancer 会定期对后端的微服务实例进行健康检查,判断实例是否正常运行。若发现某个实例出现故障或响应异常,会自动将其从可用实例列表中移除,不再向其分配请求。比如,当一个用户服务实例因代码异常无法正常响应时,LoadBalancer 能及时发现并停止向该实例分发新的用户登录、注册等请求。
-
故障转移:当某个微服务实例出现故障时,LoadBalancer 会迅速将后续请求转发到其他正常的实例上,实现故障转移,确保服务的连续性。例如,支付服务的一个实例突然崩溃,LoadBalancer 会立即把支付请求路由到其他健康的支付服务实例,让用户的支付操作不受太大影响。
服务发现与路由
-
服务发现集成:在微服务环境中,服务的实例数量和位置可能会动态变化。LoadBalancer 可以与服务发现组件(如 Consul、Eureka)集成,实时获取微服务实例的注册信息和状态。这样,当有新的实例加入或旧的实例下线时,LoadBalancer 能及时更新可用实例列表,保证请求的正确分发。
-
智能路由:根据不同的业务规则和请求特征,LoadBalancer 可以实现智能路由。例如,根据请求的来源地、用户身份、请求的内容等信息,将请求路由到特定的微服务实例或服务版本。比如,对于来自特定地区的用户请求,将其路由到距离该地区最近的数据中心的服务实例,以提高响应速度。
安全与隔离
-
访问控制:LoadBalancer 可以作为一道安全屏障,对进入微服务系统的请求进行访问控制。可以设置访问规则,如限制特定 IP 地址的访问、对请求进行身份验证和授权等,防止非法请求进入系统,保护微服务的安全。
-
服务隔离:通过将不同类型的微服务请求分配到不同的实例组或集群,实现服务之间的隔离。这样,当某个微服务出现问题时,不会影响到其他微服务的正常运行,提高了系统的整体稳定性和安全性。例如,将核心业务服务和非核心业务服务的请求分别路由到不同的实例组,避免非核心业务的故障影响核心业务。
三、如何使用?
在项目中添加 Spring Cloud OpenFeign 和注册中心如 Nacos 之后,再添加 Spring Cloud LoadBalancer 则会在进行接口调用时直接使用 Spring Cloud LoadBalancer。
四、默认负载均衡策略
轮询
五、随机负载均策略
5.1 创建随机负载均衡器
public class RandomLoadBalancerConfig {@Beanpublic ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty("loadbalancer.client.name");return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name,ServiceInstanceListSupplier.class), name);}
}
5.2 设置随机负载均衡器 (局部设置)
@Service
@FeignClient("loadbalancer-service")
设置局部负载均衡策略
//@LoadBalancerClient(name = "loadbalancer-service",
// configuration = CustomLoadBalancerConfig.class)
public interface UserService {@RequestMapping("/user/getname")String getName(@RequestParam("id") Integer id);
}
5.3 设置全局负载均衡器
@SpringBootApplication
@EnableFeignClients // 开启 Openfeign
设置全局的负载均衡策略
//@LoadBalancerClients(defaultConfiguration =
// CustomLoadBalancerConfig.class)
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}}