找回密码
 立即注册
首页 业界区 安全 OpenFeign实战:Spring Cloud微服务间优雅调用指南 ...

OpenFeign实战:Spring Cloud微服务间优雅调用指南

铵滔 4 小时前
前言

OpenFeign 是 Spring Cloud 官方推荐的声明式 HTTP 客户端,让微服务间调用像调用本地方法一样简单。本文带你全面掌握 OpenFeign 的核心用法。
一、引入依赖
  1. <dependency>
  2.     <groupId>org.springframework.cloud</groupId>
  3.     spring-cloud-starter-openfeign</artifactId>
  4. </dependency>
  5. // 启动类开启 Feign
  6. @SpringBootApplication
  7. @EnableFeignClients
  8. public class OrderApplication {
  9.     public static void main(String[] args) {
  10.         SpringApplication.run(OrderApplication.class, args);
  11.     }
  12. }
复制代码
二、声明 Feign 客户端
  1. // 调用 user-service 的 Feign 接口
  2. @FeignClient(name = "user-service", path = "/api/users")
  3. public interface UserFeignClient {
  4.     @GetMapping("/{id}")
  5.     User getUserById(@PathVariable("id") Long id);
  6.     @PostMapping
  7.     User createUser(@RequestBody User user);
  8.     @GetMapping
  9.     List<User> listUsers(@RequestParam("page") int page,
  10.                           @RequestParam("size") int size);
  11.     @DeleteMapping("/{id}")
  12.     void deleteUser(@PathVariable("id") Long id);
  13. }
  14. // 在 Service 中注入使用
  15. @Service
  16. public class OrderService {
  17.     @Autowired
  18.     private UserFeignClient userFeignClient;
  19.     public Order createOrder(Long userId, Long productId) {
  20.         // 像调用本地方法一样调用远程服务
  21.         User user = userFeignClient.getUserById(userId);
  22.         // 业务逻辑...
  23.     }
  24. }
复制代码
三、配置超时和重试
  1. # application.yml
  2. feign:
  3.   client:
  4.     config:
  5.       default:
  6.         connectTimeout: 5000
  7.         readTimeout: 10000
  8.         loggerLevel: FULL
  9.       user-service:
  10.         connectTimeout: 3000
  11.         readTimeout: 5000
  12. # 全局超时配置
  13. ribbon:
  14.   ConnectTimeout: 3000
  15.   ReadTimeout: 5000
  16.   MaxAutoRetries: 1
  17.   MaxAutoRetriesNextServer: 2
复制代码
四、Feign 日志配置
  1. @Configuration
  2. public class FeignConfig {
  3.     @Bean
  4.     public Logger.Level feignLoggerLevel() {
  5.         return Logger.Level.FULL;  // 记录完整请求响应
  6.     }
  7. }
  8. // 在 FeignClient 中使用自定义配置
  9. @FeignClient(name = "user-service",
  10.              configuration = FeignConfig.class)
  11. public interface UserFeignClient {
  12.     // ...
  13. }
  14. # 日志级别说明
  15. # NONE: 无日志(默认)
  16. # BASIC: 仅记录请求方法、URL、响应状态码、执行时间
  17. # HEADERS: 记录 BASIC + 请求/响应头
  18. # FULL: 记录 HEADERS + 请求/响应体
复制代码
五、请求拦截器(传递 Token)
  1. @Component
  2. public class FeignAuthInterceptor implements RequestInterceptor {
  3.     @Override
  4.     public void apply(RequestTemplate template) {
  5.         // 从请求上下文获取 Token
  6.         ServletRequestAttributes attributes = (ServletRequestAttributes)
  7.             RequestContextHolder.getRequestAttributes();
  8.         if (attributes != null) {
  9.             HttpServletRequest request = attributes.getRequest();
  10.             String token = request.getHeader("Authorization");
  11.             if (token != null) {
  12.                 // 将 Token 传递给下游服务
  13.                 template.header("Authorization", token);
  14.             }
  15.         }
  16.     }
  17. }
  18. // 配置拦截器
  19. @Configuration
  20. public class FeignConfig {
  21.     @Bean
  22.     public RequestInterceptor feignAuthInterceptor() {
  23.         return new FeignAuthInterceptor();
  24.     }
  25. }
复制代码
六、Fallback 降级
  1. @FeignClient(name = "user-service",
  2.              fallbackFactory = UserFeignFallbackFactory.class)
  3. public interface UserFeignClient {
  4.     @GetMapping("/{id}")
  5.     User getUserById(@PathVariable("id") Long id);
  6. }
  7. // 降级工厂:可以获取到异常信息
  8. @Component
  9. public class UserFeignFallbackFactory
  10.         implements FallbackFactory<UserFeignClient> {
  11.     @Override
  12.     public UserFeignClient create(Throwable cause) {
  13.         return new UserFeignClient() {
  14.             @Override
  15.             public User getUserById(Long id) {
  16.                 log.error("调用 user-service 失败", cause);
  17.                 return new User(id, "默认用户", "降级数据");
  18.             }
  19.         };
  20.     }
  21. }
  22. # 开启降级
  23. feign.circuitbreaker.enabled: true
复制代码
总结

OpenFeign 让微服务间调用变得优雅简洁。核心要点:声明式接口定义、配置超时重试、拦截器传递上下文、Fallback 实现降级保护。配合 Nacos 实现服务发现,配合 Sentinel 实现限流熔断,构建完整的微服务通信方案。

觉得有帮助请点赞收藏!有问题欢迎评论区交流
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册
发帖

0

粉丝关注

23

主题发布

板块介绍填写区域,请于后台编辑