当前位置: 首页 > news >正文

dubbo和oppenFeign是如何找到正确的url请求地址的

这个问题本质是在问一句话:

动态代理只是入口,真正“找到 URL/地址”的是“服务发现 + 本地缓存 + 负载均衡”。

Dubbo 和 OpenFeign 都是“代理 + 路由系统”,但实现路径不一样。


一、核心结论(先记住)

Dubbo: 注册中心 → 订阅服务 → 本地Invoker列表 → 负载均衡选地址 → 发RPC Feign: 注册中心 → 获取服务实例列表 → LoadBalancer选实例 → 拼HTTP URL → 发请求

二、Dubbo 是怎么找到地址的?

1. 启动阶段:先“拿到所有Provider地址”

Provider注册

UserService → 10.1.1.10:20880 → 10.1.1.11:20880 → 10.1.1.12:20880

注册中心:

  • Apache ZooKeeper
  • Nacos

2. Consumer订阅服务

Consumer → 注册中心订阅 UserService

返回:

Invoker列表(关键!!) Invoker = Provider封装对象

3. 本地缓存(重点)

Consumer不会每次都查注册中心,而是:

本地维护: List<Invoker>

例如:

[ Invoker(10.1.1.10:20880), Invoker(10.1.1.11:20880), Invoker(10.1.1.12:20880) ]

4. 动态代理调用时发生什么

userService.queryUser(1L);

进入代理:

InvocationHandler.invoke()

5. 关键步骤:选地址(LoadBalance)

Dubbo核心流程:

Invoker列表 ↓ LoadBalance(负载均衡) ↓ 选一个Invoker ↓ 得到真实地址

例如:

10.1.1.11:20880

6. RPC请求发送

NettyClient → TCP → Provider

Dubbo总结链路

动态代理 ↓ Invoker列表(本地缓存) ↓ LoadBalance ↓ 选出Provider地址 ↓ Netty发送RPC

三、Feign 是怎么找到 URL 的?

Feign本质是:

HTTP客户端 + 服务发现 + 负载均衡

1. 启动阶段:获取服务实例列表

例如:

@FeignClient("user-service")

注册中心返回:

user-service: - 10.1.1.10:8080 - 10.1.1.11:8080

2. 存入本地服务列表

ServiceInstanceListSupplier ↓ 本地缓存

3. 动态代理调用

userClient.get(1L);

进入:

FeignInvocationHandler

4. 关键步骤:选实例(LoadBalancer)

Feign通过:

  • Spring Cloud LoadBalancer
  • 或 Ribbon(旧版本)

流程:

实例列表 ↓ LoadBalancer ↓ 选一个实例

例如:

10.1.1.10:8080

5. 拼接 URL

Feign会根据注解拼URL:

@GetMapping("/user/{id}")

最终变成:

http://10.1.1.10:8080/user/1

6. 发HTTP请求

HttpClient / OkHttp ↓ TCP连接池 ↓ 服务端Controller

Feign总结链路

动态代理 ↓ 服务实例列表(本地缓存) ↓ LoadBalancer ↓ 拼HTTP URL ↓ HTTP请求

四、核心区别(面试重点)

对比点DubboFeign
地址来源Invoker(RPC封装对象)ServiceInstance
路由方式LoadBalance选InvokerLoadBalancer选实例
URL生成不需要URL必须拼HTTP URL
协议TCP + RPCHTTP
本地缓存Invoker列表Instance列表

五、最核心本质(一定要记住)

Dubbo: 找的是 Invoker(RPC对象) 不是URL Feign: 找的是 ServiceInstance 然后拼 URL

六、面试标准答案

可以这样回答:

Dubbo 和 OpenFeign 都是通过动态代理发起调用,但地址解析是在代理之后完成的。

Dubbo 在启动时会从注册中心订阅服务,将 Provider 地址封装成 Invoker 对象缓存到本地。调用时通过动态代理进入 InvocationHandler,然后结合 LoadBalance 从 Invoker 列表中选择一个具体的 Provider,直接通过 Netty 发起 RPC 调用,不依赖 URL。

OpenFeign 则是在启动时从注册中心获取服务实例列表,缓存为 ServiceInstance。调用时通过动态代理进入 FeignHandler,再通过 Spring Cloud LoadBalancer 选择一个实例,然后根据接口注解(如 @GetMapping)拼接成完整 HTTP URL,再发起 HTTP 请求。


一句话总结

Dubbo:代理 → 选Invoker → RPC直连 Feign:代理 → 选实例 → 拼URL → HTTP请求
http://www.zskr.cn/news/1499378.html

相关文章:

  • 2026 消费电子异形磁铁赛道 多家源头厂商技术能力多维对比 - 变量人生001
  • 2026 成都迪奥回收最新行情,经典款与新款二手流通价差解析 - 奢侈品回收评测
  • 2026选店指南,哈尔滨黄金回收门店参考手册 - 奢侈品回收测评
  • 摸底上海黄金回收渠道:2026年6月最新测评5家合规门店结果分享 - 奢侈品回收评测
  • S32K3安全机制实战:手把手教你用EIM模块注入ECC错误(附MCAL配置)
  • 新手选店攻略,对比哈尔滨各区黄金回收门店快速避坑 - 奢侈品回收测评
  • 无锡闲置包包出手指南,2026名牌包包回收没盒子还能高价出 - 奢侈品回收评测
  • 2026 合肥生成式引擎优化(GEO)行业权威测评报告 —— 基于第三方数据、产业底座与商业实效的中立评估 - 安徽工业
  • UVM验证进阶:深入start_item源码,解锁指定sequencer发送item的两种隐藏技巧
  • 2026揭阳防水补漏哪家靠谱?正规公司排名及避坑价格指南 - 苏易修缮
  • 2026 合肥生成式引擎优化(GEO)服务商权威测评报告 —— 基于第三方数据、产业底座与商业实效的中立评估 - 安徽工业
  • 2026年 哈尔滨短视频运营/代运营/企业获客/工厂推广,抖音全托管与制造业实战获客榜单推荐 - 品牌发掘
  • 手把手教你用STM32F103驱动TPC116S8 DAC模块(附完整工程代码)
  • 2026年风管来料加工全流程技术解析:降损提质实操指南 - 起跑123
  • 2026年稻花香大米源头厂家/五常稻花香/稻花香2号推荐榜:自产优质与正宗精选优质品牌深度解析 - 品牌发掘
  • Blender - Study Notes 9
  • 别再只装系统了!惠普光影精灵2升级固态硬盘后,这样设置才能让开机速度飞起来(Win10引导分区详解)
  • 唐山市中级经济师工商管理/人力资源管理:适配人群、岗位匹配与备考全攻略 - 众智商学院课程中心
  • 南宁黄金回收门店优选指南:认准正规品牌,轻松稳妥变现 - 奢侈品回收评测
  • 2026汕尾防水补漏哪家靠谱?正规公司排名及避坑价格指南 - 苏易修缮
  • 2026成都多门店横向测评香奈儿回收,五金掉色成色扣价标准实拍 - 奢侈品回收评测
  • 告别过拟合!用迁移学习和标签平滑提升你的高光谱Transformer模型精度
  • 2026 无锡手表芝柏、欧米茄回收,高端复杂腕表回收 - 奢侈品回收评测
  • 2026苏州建筑防水补漏市场适配指南:苏州鼎壹万防水补漏公司及优质服务商解析 - 鼎壹万修缮说
  • 2026年 奔驰C/E/S车窗膜品牌推荐榜:隔热防爆与原厂级隐形守护之选 - 品牌发掘
  • 关于CR2格式转换JPG格式的三种有效方法
  • 横向对比!济南LV迪奥回收,出价高低当场见分晓 - 奢侈品回收评测
  • 2026福州二手包包回收机构硬核测评:鉴定 / 报价 / 回款全维度打分 - 奢侈品回收评测
  • 2026年权威机构依据国标严选东莞靠谱软糖铁盒定制工厂 - 变量人生001
  • 5个被低估的pandas高效技巧:at、explode、assign、query、pipe实战解析