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

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. 拦截器可用于统一认证、日志跟踪等场景。

http://www.kler.cn/a/572907.html

相关文章:

  • 并查集—数组实现
  • 【Linux】进程间通信 续
  • 美颜SDK架构揭秘:人脸美型API的底层实现与优化策略
  • 立体仓WMS同MES制造的协同
  • upload-labs Pass5-18 文件上传
  • 观察者模式的C++实现示例
  • 从零开始的kafka学习 (一)| 概念,Java API
  • 从vue源码解析Vue.set()和this.$set()
  • 深入浅出:UniApp 从入门到精通全指南
  • 360图片搜索爬虫|批量爬取搜索图片
  • 关于在vue3中的动态组件component标签上给ref属性动态赋值的问题
  • Java进阶-SpringCloud设计模式-工厂模式的设计与详解
  • 原型链与继承
  • 【RAG 篇】万字长文:向量数据库选型指南 —— Milvus 与 FAISS/Pinecone/Weaviate 等工具深度对比
  • 软考架构师笔记-进程管理
  • 自动驾驶---不依赖地图的大模型轨迹预测
  • AI与.NET技术实操系列
  • Python:函数的各类参数以及函数嵌套
  • Mono里运行C#脚本44—System.Console.WriteLine()函数的生成过程
  • L2-001 紧急救援