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

Feign 远程调用:调用的是对方项目的 Controller,不是 Service

目录

一、核心结论

二、举完整例子

1)提供者服务(user-service)Controller(对外入口)

2)消费者 Feign 接口(对齐 Controller)

3)消费者业务 Service 调用 Feign

三、关键区分

四、常见误区

补充:如果是 Dubbo 就不一样


一、核心结论

  1. 服务提供方(被调用方)对外暴露接口写在Controller,接收 HTTP 请求; Service 只是内部业务实现,不对外暴露网络接口。
  2. 服务消费方(调用方,Feign 这边)Feign 定义的接口,签名必须和对方 Controller 完全对应,模拟 HTTP 请求去访问对方 Controller。
  3. Service 只存在于各自服务内部,跨服务不能直接调用 Service。

二、举完整例子

1)提供者服务(user-service)Controller(对外入口)

@RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @GetMapping("/get/{id}") public User getById(@PathVariable Long id) { // 内部调用自己的Service return userService.getById(id); } }

2)消费者 Feign 接口(对齐 Controller)

// Feign接口 = 远程Controller的镜像 @FeignClient(name = "user-service") public interface UserFeignClient { // 路径、请求方式、参数、注解 完全和对方Controller一致 @GetMapping("/user/get/{id}") User getUser(@PathVariable Long id); }

3)消费者业务 Service 调用 Feign

@Service public class OrderService { @Autowired private UserFeignClient userFeignClient; public void createOrder(Long userId) { // 通过Feign发起HTTP,远程访问 user-service 的 UserController User user = userFeignClient.getUser(userId); } }

三、关键区分

  1. Controller:网络出入口处理 HTTP,跨服务通信唯一入口,Feign 实际访问的目标。
  2. Service:本地业务层仅本项目内部使用,没有 HTTP 能力,无法远程访问。
  3. Feign 本质是 HTTP 客户端,走网络请求,只能访问 HTTP 接口(Controller)。

四、常见误区

  • ❌ 错误:Feign 对应对方 Service Service 没有请求路径、没有 @GetMapping,无法接收网络调用;
  • ✅ 正确:Feign 是远程 Controller 的镜像接口,用来拼装 HTTP 请求。

补充:如果是 Dubbo 就不一样

Dubbo 走 RPC,直接暴露 Service 接口远程调用; Feign 基于 OpenFeign + HTTP,是 REST 风格,只能对接 Controller。

http://www.cnnetsun.cn/news/3053830.html

相关文章:

  • Windows风扇控制终极指南:用Fan Control彻底告别噪音烦恼
  • 从FIR与IIR的群延迟差异,看滤波器如何塑造信号
  • nlohmann/json:现代C++ JSON处理的终极完整指南
  • RSA非对称加密在登录模块的实战应用:从原理到前后端完整实现
  • TPIC7710EVM评估板实战:从硬件解析到GUI软件驱动的电机控制芯片验证
  • 为什么同样叫海参,有的卖5000,有的卖1500?
  • 2026手机抠图工具实操指南:免费无水印APP与轻量工具使用教程
  • 渗透测试工具实战指南:从信息收集到报告撰写的全流程解析
  • 保持对代码的理解,不要完全依赖AI Coding——由一段Babylon.js开发出现的bug引发的感慨
  • 在皓贝一口腔医院就诊是怎样一种体验?
  • NifSkope终极指南:免费开源的游戏文件编辑器完全解析
  • LLM 直接写量化策略,到底靠不靠谱?
  • 5分钟快速掌握uesave:终极虚幻引擎存档处理工具指南
  • 如何永久保存微信聊天记录:WeChatMsg完整备份与AI数据管理指南
  • 远程Linux开发如何获得和展示高频log数据
  • TAS5756M数字音频放大器:BD调制、零检测与miniDSP实战解析
  • HS2-HF Patch专业级汉化与插件集成实战指南:三步打造进阶游戏体验
  • CTF实战入门:从Web4题目解析PHP弱类型与反序列化漏洞
  • MHMarkets迈汇:“美股分化凸显板块轮动”
  • VMPDump:如何快速掌握逆向工程中的动态脱壳与导入修复技术
  • DedeCMS文件上传漏洞复现与防御:从代码审计到安全加固实战
  • 番外篇 F05:电机控制与PID调节实战《电机控制中的PID调节:位置式/增量式算法解析与使用场景全攻略》
  • Vue 性能优化策略
  • 解决 Python 依赖冲突,ROCm 环境下安装深度学习库的技巧
  • 依赖引入与适用场景
  • python爬虫实战项目|第97篇:爬虫系统测试与持续集成
  • 企业网络安全立体防线:DDoS、CC、XSS与ARP攻击防御实战
  • RLHF的原罪:当AI对齐撞上Arrow不可能定理
  • Spring Boot接口防探测实战:从信息泄露到多层安全加固
  • FactoryBluePrints:3000+戴森球计划工厂布局的终极解决方案