OpenFeign 在 Spring Cloud 中默认集成了 Ribbon 作为负载均衡器。当使用 OpenFeign 调用服务时,它会根据服务名称从注册中心获取服务实例列表,然后通过 Ribbon 来选择一个合适的实例进行请求发送。
负载均衡是一种计算机技术,用于在多个计算资源(如服务器、网络链路等)之间分配工作负载,以优化资源使用、提高系统的整体性能、可靠性和可扩展性。其目的是避免单点资源过载,同时充分利用所有可用资源,确保系统能够高效稳定地运行。
负载均衡器是负载均衡的核心组件,它位于客户端和后端服务器集群之间,负责接收客户端的请求,并根据预先定义的算法将请求分配到后端的服务器上。例如,在一个 Web 应用场景中,负载均衡器会接收来自用户浏览器的 HTTP 请求,然后决定将这些请求转发到哪一台 Web 服务器进行处理。
轮询(Round - Robin):这是一种简单且公平的算法。按照顺序依次将请求分配给后端服务器。例如,假设有服务器 A、B、C,第一个请求发送到 A,第二个请求发送到 B,第三个请求发送到 C,然后又从 A 开始循环分配。这种算法适用于所有服务器性能相近的场景。
加权轮询(Weighted Round - Robin):考虑到服务器性能的差异,给不同的服务器分配不同的权重。性能高的服务器分配较高的权重,会接收更多的请求。比如,服务器 A 的权重为 3,服务器 B 的权重为 2,服务器 C 的权重为 1,那么在分配请求时,会按照 3:2:1 的比例将请求分配给 A、B、C。
最少连接(Least - Connections):负载均衡器会跟踪每个服务器当前正在处理的连接数,将新的请求分配给当前连接数最少的服务器。这样可以确保不会将请求分配到已经负载过重的服务器上,适用于服务器处理请求的时间差异较大的场景。
源 IP 哈希(Source IP Hash):根据客户端的 IP 地址计算出一个哈希值,然后通过这个哈希值将请求固定分配到某一台服务器上。这样可以保证来自同一客户端的请求始终由同一台服务器处理,适用于需要保持会话状态(如用户登录后的操作)的场景。
在 Spring Boot 项目中,只要引入了 Spring Cloud OpenFeign 和相关的注册中心(如 Eureka、Consul 等)依赖,并且在接口上使用 @FeignClient 注解指定服务名称,OpenFeign 就会自动利用 Ribbon 实现负载均衡。
在 IDEA 中,复制“ServiceDemoApplication”Rrun/Debug Configurations,添加 JVM 参数“-Dserver.port=8091”,且命名为“ServiceDemoApplication(1)”。然后,分别启动这些服务,最终状态如下图:
上图共四个服务,两个 ServiceDemoApplication、一个 NetflixEurekaServerApplication 和 DemoOpenFeignApplicaion 服务。
使用浏览器访问 http://localhost:8761 地址,打开 Eureka 控制台,如下图:
在服务端,提供一个 info() 方法,该方法将返回 APP 名称和端口,用来区分具体调用的哪个服务。代码如下:
@GetMapping("/info") public String info() { return "appName=" + appName + " appPort=" + appPort + " uuid=" + UUID.randomUUID().toString(); }
使用 @GetMapping 映射上面的服务:
// 负载均衡 @GetMapping("/info") String info();
通过 Feign 客户端调用服务:
// 负载均衡 @GetMapping("/info") public String info() { return simpleFeign.info(); }
运行效果: