分享
  1. 首页
  2. 文章

百战程序员-AI算法工程师就业班-2022

egwegerhtyf · · 139 次点击 · · 开始浏览

获课地址: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
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏