SpringCloud 微服务Feigin 用的完整调用端和被调用的示例

在 Spring Cloud 微服务架构中,OpenFeign 是一种声明式的 HTTP 客户端,它允许开发者像调用本地方法一样发起远程服务请求。

以下是一个完整的示例,包含**被调用端(服务提供者 user-service 调用端(服务消费者 order-service)**的核心代码及配置。

一、 被调用端:用户服务 (user-service)

这是提供基础接口的服务。

1. 配置文件 (application.yml)
yaml 复制代码
server:
  port: 8081
spring:
  application:
    name: user-service # 注册到注册中心的服务名
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 假设使用 Nacos 作为注册中心
2. 启动类 (UserApplication.java)
java 复制代码
@SpringBootApplication
@EnableDiscoveryClient // 开启服务发现
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }
}
3. 实体类与接口 (UserController.java)
java 复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserDTO {
    private Long id;
    private String name;
}

@RestController
@RequestMapping("/users")
public class UserController {

    @GetMapping("/{id}")
    public UserDTO getUserById(@PathVariable Long id) {
        // 模拟数据库查询
        return new UserDTO(id, "张三-" + id);
    }
}

二、 调用端:订单服务 (order-service)

这是通过 Feign 调用 user-service 的服务。

1. 引入核心依赖 (pom.xml)

需要引入 OpenFeign 以及服务发现的依赖:

xml 复制代码
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>
2. 配置文件 (application.yml)

建议配置超时时间,避免高延迟场景下服务卡死:

yaml 复制代码
server:
  port: 8082
spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

# Feign 超时配置
feign:
  client:
    config:
      default:
        connectTimeout: 5000 # 连接超时时长(毫秒)
        readTimeout: 5000    # 读取超时时长(毫秒)
3. 启动类 (OrderApplication.java)

关键步骤: 必须添加 @EnableFeignClients 注解来开启 Feign 客户端扫描。

java 复制代码
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients // 开启OpenFeign客户端扫描
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}
4. 定义 Feign 客户端接口 (UserFeignClient.java)

通过 @FeignClient 绑定远程服务,方法签名与被调用端的 Controller 保持一致:

java 复制代码
@FeignClient(name = "user-service") // name 为被调用方在注册中心的服务名
public interface UserFeignClient {

    @GetMapping("/users/{id}")
    UserDTO getUserById(@PathVariable("id") Long id);
}
5. 业务调用 (OrderService.java)

直接注入 Feign 接口,像调用本地方法一样完成远程通信:

java 复制代码
@Service
public class OrderService {

    @Autowired
    private UserFeignClient userFeignClient;

    public String createOrder(Long userId) {
        // 底层会自动发起 HTTP GET 请求到 user-service
        UserDTO user = userFeignClient.getUserById(userId);
        return "订单创建成功!关联用户信息:" + user.getName();
    }
}

💡 开发避坑提示:

  1. 参数注解不能省 :Feign 接口方法的参数上必须显式加上 @PathVariable@RequestParam@RequestBody 等注解,否则可能导致参数传递失败。
  2. GET 请求限制 :Feign 的 GET 请求不支持使用 @RequestBody 传递复杂对象参数,如需传递对象请使用 POST 请求或使用 @SpringQueryMap 注解。
  3. 生产环境建议 :在实际项目中,强烈建议在 @FeignClient 中配置 fallbackfallbackFactory 属性,结合 Sentinel 或 Hystrix 实现熔断降级,防止单个服务故障导致整个系统雪崩。
相关推荐
Wang's Blog1 小时前
Java框架快速入门: Spring Security+OAuth2之过滤器与过滤器链
java·开发语言·spring
谢尔登1 小时前
01_Java基础速通
java·开发语言
lemon_sjdk2 小时前
javafx-Image图像(2)
java·javafx
小七在进步2 小时前
C++入门(2)
java·jvm·c++
To0R2 小时前
Agent 上线前必须过的五道门(附 Spring Boot 实现)
java
vipxieliang2 小时前
固定电话验证详解:区号、号码、分机号的完整验证
java·spring boot
步行cgn2 小时前
Spring Boot 主入口类上的 @Enable 和 @Scan 注解详解
java·spring boot·后端
lhldsg2 小时前
全民健身解决方案软件开发实战:从架构设计到部署指南
java·前端·数据库·小程序
两点王爷3 小时前
Java 与前端加载 MVT 数据:从服务端切片到浏览器渲染
java·前端·状态模式
TinyMemory3 小时前
Java 面向对象核心入门(九):方法重写 Override|彻底分清重载与重写
java·面向对象·override·方法重写·重载与重写