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

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 ZooKeeperNacos2. Consumer订阅服务Consumer → 注册中心订阅 UserService返回Invoker列表关键 Invoker Provider封装对象3. 本地缓存重点Consumer不会每次都查注册中心而是本地维护 ListInvoker例如[ 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. 关键步骤选地址LoadBalanceDubbo核心流程Invoker列表 ↓ LoadBalance负载均衡 ↓ 选一个Invoker ↓ 得到真实地址例如10.1.1.11:208806. RPC请求发送NettyClient → TCP → ProviderDubbo总结链路动态代理 ↓ Invoker列表本地缓存 ↓ LoadBalance ↓ 选出Provider地址 ↓ Netty发送RPC三、Feign 是怎么找到 URL 的Feign本质是HTTP客户端 服务发现 负载均衡1. 启动阶段获取服务实例列表例如FeignClient(user-service)注册中心返回user-service: - 10.1.1.10:8080 - 10.1.1.11:80802. 存入本地服务列表ServiceInstanceListSupplier ↓ 本地缓存3. 动态代理调用userClient.get(1L);进入FeignInvocationHandler4. 关键步骤选实例LoadBalancerFeign通过Spring Cloud LoadBalancer或 Ribbon旧版本流程实例列表 ↓ LoadBalancer ↓ 选一个实例例如10.1.1.10:80805. 拼接 URLFeign会根据注解拼URLGetMapping(/user/{id})最终变成http://10.1.1.10:8080/user/16. 发HTTP请求HttpClient / OkHttp ↓ TCP连接池 ↓ 服务端ControllerFeign总结链路动态代理 ↓ 服务实例列表本地缓存 ↓ LoadBalancer ↓ 拼HTTP URL ↓ HTTP请求四、核心区别面试重点对比点DubboFeign地址来源InvokerRPC封装对象ServiceInstance路由方式LoadBalance选InvokerLoadBalancer选实例URL生成不需要URL必须拼HTTP URL协议TCP RPCHTTP本地缓存Invoker列表Instance列表五、最核心本质一定要记住Dubbo 找的是 InvokerRPC对象 不是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请求