分享
获课地址:666it.top/13474/
负载均衡的内核:Feign 与 Spring Cloud LoadBalancer 的协同作战
在微服务的世界里,一个服务通常以集群的方式部署,拥有多个实例。当我们通过 Feign 调用 @FeignClient("user-service") 时,问题来了:"user-service" 是一个逻辑服务名,Feign 如何知道该向哪一个具体的 IP 和端口发起请求?答案就是负载均衡。本文将深入探讨 Feign 是如何与 Spring Cloud 的负载均衡组件(以 Spring Cloud LoadBalancer 为例)深度集成,共同完成服务发现与路由的重任。
一、从 Feign 到 LoadBalancer:请求的接力
回顾上一篇文章,我们提到 Feign 最终通过 Client 接口的实现来发送 HTTP 请求。在 Spring Cloud 环境中,这个默认的实现是 LoadBalancerFeignClient。顾名思义,它是一个"装饰者",在原有的 HTTP 客户端能力之上,增加了负载均衡的逻辑。
当 Feign 构建好请求模板(包含服务名、路径、参数等)后,会将这个请求交给 LoadBalancerFeignClient.execute() 方法。此时,最关键的一步发生了:服务名解析。LoadBalancerFeignClient 并不会自己去实现服务发现,而是将"将服务名解析为具体地址"这个任务,委托给了 Spring Cloud LoadBalancer。
二、服务发现:获取候选实例列表
Spring Cloud LoadBalancer 接收到服务名(例如 "user-service")后,它的首要任务是获取这个服务所有健康的实例列表。它通过与服务注册中心(如 Nacos, Eureka, Consul)集成的 DiscoveryClient 来达成此目的。DiscoveryClient 会从注册中心查询"user-service"下所有已注册的实例信息,每个实例信息通常包含:IP 地址、端口号、健康状态、元数据等。
这样,LoadBalancer 就获得了一个可用的服务器列表,我们称之为 "ServiceInstance" 列表。这个列表是动态的,会随着服务的上线、下线和健康检查结果而实时更新。
三、负载均衡算法:做出关键选择
拥有了候选实例列表,下一步就是从中选择一个最"合适"的实例。这就是负载均衡算法的用武之地。Spring Cloud LoadBalancer 默认提供了两种核心策略:
轮询:按顺序依次选择列表中的下一个实例。这是一种简单且公平的分配方式,能够保证所有实例的请求量大致平均。
随机:从列表中随机选择一个实例。
除了内置策略,LoadBalancer 还支持自定义负载均衡规则。你可以基于实例的元数据(如权重)、当前的系统负载、响应时间等更复杂的因素来实现自己的选择逻辑,例如实现加权轮询或最小连接数算法。
四、完成调用:地址替换与请求转发
一旦 LoadBalancer 通过其算法选定了一个目标实例(例如 IP: 192.168.1.10, Port: 8080),它会将这个信息返回给 LoadBalancerFeignClient。此时,LoadBalancerFeignClient 会执行一个关键的"偷梁换柱"操作:它从原始的请求模板中提取出 URL(原本可能是 http://user-service/api/users/1),将其中的逻辑服务名 "user-service" 替换为选定的真实地址,形成一个新的 URL(如 http://192.168.1.10:8080/api/users/1)。
最后,LoadBalancerFeignClient 会使用其内部封装的、不具负载均衡功能的"普通" HTTP Client(默认仍是 JDK 的 HttpURLConnection),向这个真实地址发起最终的 HTTP 请求。
通过这一系列精妙的协作,Feign 成功地将声明式接口的调用,无缝地对接到了微服务的动态网络环境中,实现了客户端侧的智能负载均衡。然而,服务间的通信只是微服务架构的一面,另一面是统一的入口和边界。接下来,我们将目光转向微服务体系的守门人——Spring Cloud Gateway。
有疑问加站长微信联系(非本文作者))
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信139 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传