OpenFeign 学习笔记

embedded/2025/3/6 12:17:36/

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 {@BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL; // FULL/BASIC/HEADERS/NONE}
}

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

在这里插入图片描述

spring:cloud:openfeign:client:config:default: # 全局配置logger-level: fullconnect-timeout: 1000 # 连接超时(ms)read-timeout: 2000 # 读取超时(ms)user-service: # 指定服务的配置logger-level: fullconnect-timeout: 3000read-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 {@Overridepublic 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 请求模板*/@Overridepublic void apply(RequestTemplate template) {System.out.println("XTokenRequestInterceptor.......");template.header("X-Token", "UUID.randomUUID.toString()"); // 添加请求头,用作身份验证}
}

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

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

四、重点总结

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

注意事项

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

http://www.ppmy.cn/embedded/170475.html

相关文章

【大模型学习】第二章 大模型技术中的Prompt

目录 摘要 1. 意义与价值 1.1 降低技术门槛 1.2 提升模型灵活性 1.3 优化资源利用率 2. 核心思想与方法论 2.1 理解模型机制 2.2 结合上下文 2.3 迭代优化 3. Prompt 的典型构成 3.1 目标说明 3.2 输入数据 3.3 输出规范 3.4 示例与模板 3.5 语气与风格 4. 技术…

分布式 ID 设计方案

分布式ID设计方案在分布式系统中至关重要&#xff0c;它必须满足全局唯一性、可扩展性、排序性&#xff08;有时&#xff09;、避免碰撞、去中心化、可用性和紧凑性等多个要求。以下是一些常见的分布式ID设计方案&#xff1a; 一、UUID&#xff08;通用唯一标识符&#xff09;…

【智能机器人开发全流程:硬件选型、软件架构与ROS实战,打造高效机器人系统】

文章目录 1. 硬件层设计(1) 传感器选型(2) 计算平台 2. 软件架构设计(1) 核心模块划分(2) 通信框架 3. 关键实现步骤(1) 硬件-软件接口开发(2) SLAM与导航实现(3) 仿真与测试 4. 典型框架示例基于ROS的移动机器人分层架构 5. 优化与扩展6. 开源项目参考 1. 硬件层设计 (1) 传感…

kafka小白基础知识

一、Kafka 入门 &#xff08;一&#xff09;Kafka 简介 Kafka 是一个开源的分布式流处理平台&#xff0c;最初由 LinkedIn 开发&#xff0c;后来贡献给了 Apache 软件基金会。它被设计用于处理实时数据流&#xff0c;具有高吞吐量、可扩展性、持久性和容错性等特点。Kafka 主要…

学网络安全报班可靠吗?

在当今社会&#xff0c;网络安全已经成为我们工作和生活中不可忽视的重要部分&#xff0c;而且市场上各大企业对网络安全人才的需求量非常之大&#xff0c;因此网络安全培训班应运而生&#xff0c;那么学网络安全报培训班靠谱吗?这是很多小伙伴都关心的问题&#xff0c;我们来…

双链路提升网络传输的可靠性扩展可用带宽

为了提升网络传输的可靠性或增加网络可用带宽&#xff0c; 通常使用双链路冗余备份或者双链路聚合的方式。 本文介绍几种双链路网络通信的案例。 5GWiFi冗余传输 双Socket绑定不同网络接口&#xff1a;通过Android的ConnectivityManager绑定5G蜂窝网络和WiFi的Socket连接&…

JavaEE基础之- ajax

1. 初始AJAX(熟悉) 1.1. AJAX介绍 AJAX 异步 JavaScript 和 XML。 AJAX 是一种用于创建快速动态网页的技术。 js jQuery 通过在后台与服务器进行少量数据交换&#xff0c;AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下&#xff0c;对网页的某部分…

网络安全的八大机制

文章目录 第一章 网络安全概述与环境配置第二章 网络安全协议基础第四章 网络扫描与网络监听第五章 网络入侵第六章 网络后门与网络隐身第八章 操作系统安全基础第九章 密码学与信息加密第十章 防火墙与入侵检测第十一章 IP安全和WEB安全 第一章 网络安全 概述与环境配置 1.狭…