【JAVA】Java微服务—Spring Cloud 里用来做服务调用的工具OpenFeign

OpenFeignSpring Cloud 里用来做服务调用的工具

OpenFeign 可以让你像调用本地 Java 方法一样,去调用另一个微服务的接口。

在一个简单的下单储存的项目里,就是:

复制代码
order 服务调用 stock 服务

以前可能用 RestTemplate,现在更常用 OpenFeign


1. 没有 OpenFeign 时怎么调用?

比如 order 服务要调用 stock 服务扣库存。

RestTemplate 可能这样写:

复制代码
String result = restTemplate.getForObject(
    "http://stock-service/stock/reduct",
    String.class
);

这段代码的意思是:

复制代码
order 服务主动发送 HTTP 请求,调用 stock 服务的 /stock/reduct 接口

但是这种写法有点像 Python 里的:

复制代码
requests.get("http://stock-service/stock/reduct")

能用,但写多了会乱。


2. OpenFeign 是怎么做的?

OpenFeign 的思想是:

你只需要写一个 Java 接口,告诉它要调用哪个服务、哪个接口,剩下的 HTTP 请求由 OpenFeign 自动完成。

比如:

复制代码
@FeignClient("stock-service")
public interface StockFeignService {

    @GetMapping("/stock/reduct")
    String reduct();
}

这段代码看起来只是一个接口,但它的意思是:

复制代码
我要调用名叫 stock-service 的服务
调用它的 /stock/reduct 接口
返回 String 结果

然后在 order 服务里直接调用:

复制代码
stockFeignService.reduct();

这就像调用本地方法一样。


3. OpenFeign 在 order + stock 项目里的位置

你的项目大概是:

复制代码
xs-springcloudalibaba
├── order
└── stock

业务流程是:

复制代码
浏览器 / Postman
    ↓
order 服务:/order/add
    ↓
OpenFeign 调用
    ↓
stock 服务:/stock/reduct

也就是说:

复制代码
OpenFeign 负责 order 服务调用 stock 服务

4. RestTemplate 和 OpenFeign 的区别

方式 写法 特点
RestTemplate 手动拼 URL 比较原始
OpenFeign 写接口调用 更优雅,更适合微服务

RestTemplate 写法

复制代码
restTemplate.getForObject(
    "http://stock-service/stock/reduct",
    String.class
);

OpenFeign 写法

复制代码
stockFeignService.reduct();

明显后者更像正常 Java 方法调用。


5. OpenFeign 怎么用?


第一步:在 order 服务的 pom.xml 加依赖

因为是 order 调用别人,所以依赖加在 order 服务里。

复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

如果你还用 Nacos 服务发现,也要有 Nacos 依赖:

复制代码
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

第二步:在启动类上开启 Feign

OrderApplication.java

复制代码
@SpringBootApplication
@EnableFeignClients
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

重点是这个注解:

复制代码
@EnableFeignClients

意思是:

开启 OpenFeign 功能。


第三步:写 Feign 接口

在 IDEA 里的目录结构大概是:

复制代码
order
└── src
    └── main
        └── java
            └── com.tulingxueyuan.order
                ├── controller
                │   └── OrderController.java
                ├── feign
                │   └── StockFeignService.java
                └── OrderApplication.java

order 服务下面建一个包:

复制代码
com.tulingxueyuan.order.feign

然后写:

复制代码
package com.tulingxueyuan.order.feign;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient("stock-service")
public interface StockFeignService {

    @GetMapping("/stock/reduct")
    String reduct();
}

解释一下:

复制代码
@FeignClient("stock-service")

表示:

复制代码
我要调用 Nacos 里名字叫 stock-service 的服务

@GetMapping("/stock/reduct")

表示:

复制代码
我要调用 stock-service 服务里的 /stock/reduct 接口

6. Controller 里怎么用?

OrderController.java

复制代码
package com.tulingxueyuan.order.controller;

import com.tulingxueyuan.order.feign.StockFeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private StockFeignService stockFeignService;

    @GetMapping("/add")
    public String add() {

        System.out.println("创建订单成功");

        String result = stockFeignService.reduct();

        return "下单成功," + result;
    }
}

当你访问:

复制代码
http://localhost:8081/order/add

执行过程是:

复制代码
进入 OrderController 的 add()
    ↓
打印:创建订单成功
    ↓
调用 stockFeignService.reduct()
    ↓
OpenFeign 自动请求 stock 服务的 /stock/reduct
    ↓
stock 服务返回结果
    ↓
order 服务把结果返回给浏览器

7. stock 服务要有什么接口?

StockController.java

复制代码
package com.tulingxueyuan.stock.controller;

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/stock")
public class StockController {

    @GetMapping("/reduct")
    public String reduct() {
        System.out.println("扣减库存成功");
        return "库存扣减成功";
    }
}

8. Nacos 和 OpenFeign 的关系

OpenFeign 本身负责:

复制代码
发起服务调用

Nacos 负责:

复制代码
告诉 OpenFeign:stock-service 到底在哪台机器、哪个端口

比如 stock-service 注册到 Nacos:

复制代码
stock-service -> 127.0.0.1:8082

那么 OpenFeign 调用:

复制代码
@FeignClient("stock-service")

它会去 Nacos 找 stock-service 的真实地址。

所以它们的关系是:

复制代码
Nacos:负责找服务
OpenFeign:负责调用服务

9. 可以这样记

在 Spring Cloud Alibaba 里:

复制代码
Nacos:服务注册与发现
OpenFeign:服务之间互相调用
Seata:保证多个服务的数据一致
Sentinel:限流、熔断、降级

针对你的项目:

复制代码
order 调用 stock:用 OpenFeign
order 找到 stock:靠 Nacos
order 和 stock 事务一致:靠 Seata

10. 总结

OpenFeign 就是微服务之间的 HTTP 调用工具。

它把这种写法:

复制代码
restTemplate.getForObject("http://stock-service/stock/reduct", String.class);

变成这种写法:

复制代码
stockFeignService.reduct();

所以可以先记住:

OpenFeign 的作用是:让一个服务调用另一个服务时,写起来像调用本地方法一样。

相关推荐
开源推荐官1 小时前
2026 年主流优质 B2B2C 多商户商城系统推荐
java·架构·开源
真实的菜1 小时前
Java 微服务优雅停机:从踩坑到最佳实践
java·微服务·linq
码不停蹄的玄黓1 小时前
Arthas 核心使用场景
java
1104.北光c°1 小时前
深度剖析 Spring 灵魂:IOC 容器与自动装配的原理、设计与实现
java·开发语言·笔记·后端·spring·rpc·ioc
爱吃羊的老虎1 小时前
【JAVA】Java微服务—阿里开源的服务注册中心 + 配置中心Nacos
java·微服务·开源
傻啦嘿哟1 小时前
日志分析:利用OpenClaw日志排查“403”和“503”错误
java·git·github
小小龙学IT1 小时前
Go语言云原生后端开发实践:从单体到微服务的演进之路
微服务·云原生·golang
Volunteer Technology1 小时前
Spring6.0新特性
java·开发语言·spring
social-man1 小时前
开源渗透测试 AI 助手 ComPilot Scan:LangGraph + 终端 + Playwright + 知识库一体化
人工智能·开源