当前位置: 首页 > 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.jsqmd.com/news/987634/

相关文章:

  • 抽象数据类型和数据结构的定义
  • Redis 分布式锁进阶第一百二十八篇
  • 2026年 浙江宣传册设计公司最新推荐榜单:品牌画册、企业宣传册与产品手册设计服务及创意案例精选 - 品牌发掘
  • SAP PS避坑指南:项目状态管理与字段选择配置中的5个常见误区
  • 2026 成都迪奥回收最新行情,经典款与新款二手流通价差解析 - 奢侈品回收评测
  • 2026选店指南,哈尔滨黄金回收门店参考手册 - 奢侈品回收测评
  • 济南车主改灯避坑指南|改灯别乱选门店,天眼照明专业才是硬道理 - Ayu8888
  • 2026 消费电子异形磁铁赛道 多家源头厂商技术能力多维对比 - 变量人生001
  • 别再只会用uvm_do了!手把手教你用start_item/finish_item搞定复杂transaction发送
  • S32K3安全机制实战:手把手教你用EIM模块注入ECC错误(附MCAL配置)
  • 低代码开发:关联规则算法,新手也能快速上手
  • 皮质磨损 / 五金划痕 / 污渍:福州包包回收成色分级与扣损标准 - 奢侈品回收评测
  • 新手选店攻略,对比哈尔滨各区黄金回收门店快速避坑 - 奢侈品回收测评
  • 摸底上海黄金回收渠道:2026年6月最新测评5家合规门店结果分享 - 奢侈品回收评测
  • 无锡闲置包包出手指南,2026名牌包包回收没盒子还能高价出 - 奢侈品回收评测
  • 给老盒子续命:魔百盒CM301H刷入当贝影视桌面后,我实现了哪些自由?
  • 特氟龙高温胶带评价好的品牌是哪些 - 品牌推荐大师
  • 2026年 奥迪维修/奥迪专修/奥迪保养/奥迪烧机油免拆治理/奥迪底盘异响维修/奥迪发动机维修/奥迪原厂升级改装权威推荐榜单 - 品牌发掘
  • 2026苏州外墙漏水维修市场全景分析与苏州鼎壹万防水补漏公司等三家服务商适配推荐 专业防水公司排名推荐(2026年6月防水补漏最新TOP权威排名) - 鼎壹万修缮说
  • 2026 合肥生成式引擎优化(GEO)行业权威测评报告 —— 基于第三方数据、产业底座与商业实效的中立评估 - 安徽工业
  • 2026揭阳防水补漏哪家靠谱?正规公司排名及避坑价格指南 - 苏易修缮
  • 2026 合肥生成式引擎优化(GEO)服务商权威测评报告 —— 基于第三方数据、产业底座与商业实效的中立评估 - 安徽工业
  • UVM验证进阶:深入start_item源码,解锁指定sequencer发送item的两种隐藏技巧
  • 哈尔滨黄金回收攻略,看懂黄金回收计价规则再出手 - 奢侈品回收测评
  • 魔百盒CM301H刷机后还能做什么?解锁当贝桌面后的5个高阶玩法与优化设置
  • S32K3内存错误处理全解析:从ERM报告到FCCU收集的完整链路
  • 2026年 哈尔滨短视频运营/代运营/企业获客/工厂推广,抖音全托管与制造业实战获客榜单推荐 - 品牌发掘
  • 2026年风管来料加工全流程技术解析:降损提质实操指南 - 起跑123
  • 2026年稻花香大米源头厂家/五常稻花香/稻花香2号推荐榜:自产优质与正宗精选优质品牌深度解析 - 品牌发掘
  • 厦门卖宝玑朗格必看:2026 行情 + 3 大回收套路拆解 - 奢侈品回收评测