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

OpenFeign 学习笔记

OpenFeign 学习笔记

一、基础入门

1.1 简介

  • OpenFeign 是基于声明式的 REST 客户端,用于简化服务间远程调用。(编程式 REST 客户端(RestTemplate))

  • 通过接口+注解方式定义 HTTP 请求,自动实现服务调用。

    注解驱动

    ​ • 指定远程地址:@FeignClient

    ​ • 指定请求方式:@GetMapping、@PostMapping、@DeleteMapping …

    • 指定携带数据:@RequestHeader、@RequestParam、@RequestBody …

    ​ • 指定结果返回:响应模型

  • 官网:https://docs.spring.io/spring-cloud-openfeign/reference/spring-cloud-openfeign.html#spring-cloud-feign

  • 人话总结:OpenFeign是一种替代RestTemplate的工具,专门用来实现不同微服务之间实现远程调用的业务API,相比RestTemplate功能更强大,操作更简介。

在这里插入图片描述

1.2 引入依赖

<!-- Spring Cloud OpenFeign 核心依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

1.3 开启功能

在主启动类添加注解:

@EnableFeignClients // 启用 OpenFeign 客户端功能
@SpringBootApplication
public class Application { ... }

1.4 远程调用

  1. 定义 Feign 客户端接口:(客户端:发送请求 服务端:接收请求)

    1.1远程调用 - 业务API

@FeignClient(name = "user-service") // 指定服务名称
public interface UserClient {
    @GetMapping("/user/{id}")      // 指定请求路径(发送请求)
    User getUserById(@PathVariable Long id);
}

​ 1.2远程调用 - 第三方API

在这里插入图片描述

tip:如何编写好OpenFeign声明式的远程调用接口?

• 业务API:直接复制对方Controller签名即可

• 第三方API:根据接口文档确定请求如何发

​ 2.注入使用

@Autowired
private UserClient userClient;
public User getUser(Long id) {
    return userClient.getUserById(id); // 直接调用远程接口
}

1.5面试题:客户端负载均衡与服务端负载均衡区别?

答:根据负载均衡发生的位置来区分。

负载均衡发生在客户端就是客户端负载均衡。

负载均衡发生在服务端就是服务端负载均衡。
在这里插入图片描述


二、进阶配置

2.1 开启日志

配置日志级别(application.yml):

logging:
  level:
    com.example.client.UserClient: DEBUG # 指定客户端接口的日志级别

配置日志策略(Java Config):

@Configuration
public class FeignConfig {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL; // FULL/BASIC/HEADERS/NONE
    }
}

2.2 超时控制(避免服务器宕机)

在这里插入图片描述

spring:
  cloud:
    openfeign:
      client:
        config:
          default: # 全局配置
            logger-level: full
            connect-timeout: 1000 # 连接超时(ms)
            read-timeout: 2000 # 读取超时(ms)
          user-service: # 指定服务的配置
            logger-level: full
            connect-timeout: 3000
            read-timeout: 5000

2.3 重试机制

远程调用超时失败后,还可以进行多次尝试,如果某次成功返回ok,如 果多次依然失败则结束调用,返回错误。

在这里插入图片描述

spring:
  cloud:
    openfeign:
      client:
        config:
          default:
            retryable: true # 启用重试
            maxAttempts: 3 # 最大重试次数

@Bean
Retryer retryer(){
    return new Retryer.Default();
}

2.4 Fallback 兜底返回

1.引入 sentinel

<dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
 </dependency>

2.开启熔断

feign:
  sentinel:
    enabled: true

3.编写 fallback 函数

@FeignClient(value = "service-product",fallback = ProductFeignClientFallback.class) // feign客户端
public interface ProductFeignClient {
   //mvc注解的两套使用逻辑
   //1、标注在Controller上,是接收这样的请求
   //2、标注在FeignClient上,是发送这样的请求
   @GetMapping("/product/{id}")
   Product getProductById(@PathVariable("id") Long id);
}
@Component
public class ProductFeignClientFallback implements ProductFeignClient {
    @Override
    public Product getProductById(Long id) {
        System.out.println("兜底回调....");
        Product product = new Product();
        product.setId(id);
        product.setPrice(new BigDecimal("0"));
        product.setProductName("未知商品");
        product.setNum(0);
        return product;
    }
}

三、拦截器用法

在这里插入图片描述

1.请求拦截器

2.响应拦截器(用的不多)

自定义请求拦截器

import feign.RequestInterceptor;

@Component//如果放入IOC容器就会自动注册拦截器,可以不做后面的注册
public class XTokenRequestInterceptor implements RequestInterceptor {
    /**
    *请求拦截器
    *template 请求模板
    */
    @Override
    public void apply(RequestTemplate template) {
        System.out.println("XTokenRequestInterceptor.......");
        template.header("X-Token", "UUID.randomUUID.toString()"); // 添加请求头,用作身份验证
    }
}

注册拦截器(配置类中):

@Configuration
public class FeignConfig {
    @Bean
    public AuthInterceptor authInterceptor() {
        return new AuthInterceptor();
    }
}

四、重点总结

核心内容关键点
远程调用客户端通过 @FeignClient 定义接口,使用 @GetMapping 等注解声明 HTTP 方法。
超时控制配置 connectTimeoutreadTimeout,支持全局和按服务配置。
重试机制启用 retryable 并设置 maxAttempts,增强服务调用容错性。
Fallback 兜底实现 Fallback 类处理服务降级,防止级联故障。
拦截器通过 RequestInterceptor 添加统一请求头或认证信息。

注意事项

  1. 生产环境建议配置合理的超时时间和重试策略,避免雪崩效应。
  2. 拦截器可用于统一认证、日志跟踪等场景。

相关文章:

  • java和Springboot和vue开发的企业批量排班系统人脸识别考勤打卡系统
  • AI工具集锦
  • 用户空间与内核空间切换机制详解
  • The Rust Programming Language 学习 (三)
  • 深度学习编译器(整理某survey)
  • 递归入手三维动态规划
  • RabbitMQ 2025/3/5
  • 海南自贸港的数字先锋:树莓集团的战略布局解析
  • 开发环境搭建-02.后端环境搭建-熟悉项目结构
  • Rust语言入门与应用:未来发展趋势解析
  • Pytorch系列教程:模型训练的基本要点
  • DeepSeek、Grok 和 ChatGPT 对比分析:从技术与应用场景的角度深入探讨
  • 【ROS2机器人入门到实战】
  • Linux环境变量
  • 四、Redis 事务与 Lua 脚本:深入解析与实战
  • 计算机网络基础:服务器远程连接管理(Telnet命令)
  • 【大模型(LLMs)微调面经 】
  • 计算机毕业设计SpringBoot+Vue.js球队训练信息管理系统(源码+文档+PPT+讲解)
  • Linux中VirtualBox的虚拟机开机自启
  • 打印三角形及Debug
  • 将人工智能送上太空,我国太空计算卫星星座成功发射
  • “异常”只停留在医院里,用艺术为“泡泡宝贝”加油
  • 内塔尼亚胡:以军将在未来几天“全力进入”加沙
  • 习近平举行仪式欢迎巴西总统卢拉访华
  • 专访|西蒙·斯特朗格:以“辞典”的方式讲述二战家族史
  • “海豚音”依旧,玛丽亚·凯莉本周来沪开唱