【OpenFeign 面试专题】

csdn
openfeign

OpenFeign 面试专题

  • OpenFeign 的核心原理
  • OpenFeign 如何与 Ribbon、Hystrix 集成
  • Ribbon的负载均衡策略
  • 如何自定义 OpenFeign 的请求编码和响应解码
  • OpenFeign 如何传递请求头(Header)信息
  • OpenFeign 如何处理超时和重试
  • OpenFeign 支持哪些 HTTP 客户端实现
  • 如何记录 OpenFeign 的请求日志
  • OpenFeign 如何传递文件(上传/下载)
  • OpenFeign 与 RestTemplate 的区别
  • 如何解决 OpenFeign 调用时出现的 404 或参数错误
  • 高频追问问题

OpenFeign 的核心原理

OpenFeign 是基于 动态代理 的声明式 HTTP 客户端,通过接口注解描述 HTTP 请求(如 @RequestMapping),在运行时生成代理类实现远程调用。其核心流程:

  1. 解析接口方法上的注解(如 @GetMapping),生成 HTTP 请求模板。
  2. 结合 Ribbon 实现负载均衡(从服务注册中心获取服务实例列表)。
  3. 通过编码器(Encoder)将参数转换为请求体,通过解码(Decoder)将响应转换为对象。
  4. 发送 HTTP 请求并处理响应。

OpenFeign 如何与 Ribbon、Hystrix 集成

  • Ribbon:OpenFeign 默认集成 Ribbon 实现客户端负载均衡。通过配置文件(如 application.yml)或 @RibbonClient 指定服务实例列表和负载策略。
  • Hystrix:通过 feign.hystrix.enabled=true 开启熔断,结合 @FeignClient(fallback=Fallback.class) 指定降级类。

Ribbon的负载均衡策略

  • 轮询策略(RoundRobinRule)

    • 原理:按顺序依次选择服务实例,循环往复。
    • 特点
      • 简单、公平,每个实例均匀分担请求。
      • 考虑实例的负载、性能差异。
    • 适用场景:所有实例性能相近且负载均衡要求不高的场景。
  • 随机策略(RandomRule)

    • 原理:从可用实例中随机选择一个。
    • 特点
      • 实现简单,分散请求压力。
      • 可能出现短时间内某些实例负载较高。
    • 适用场景:实例性能差异不大,且需要快速分配请求的场景。
  • 加权响应时间策略(WeightedResponseTimeRule)

    • 原理:根据实例的平均响应时间动态分配权重,响应时间越短的实例,被选中的概率越高。
      • 响应时间权重公式:权重 = 总平均响应时间 - 实例平均响应时间
    • 特点
      • 自动感知实例性能,优先选择响应快的实例。
      • 需要持续计算响应时间,有一定性能开销。
    • 适用场景:实例性能差异较大,需优先调用高性能节点的场景。
  • 区域感知策略(ZoneAvoidanceRule,默认策略)

    • 原理:优先选择与调用方处于同一区域的实例,避免跨区域调用;若区域内无可用实例,则跨区域选择。
    • 特点
      • 减少网络延迟,提高调用效率
      • 结合了轮询和可用性过滤(如剔除故障实例)。
    • 适用场景:服务部署在多区域(如多个机房),需优先本地调用的场景。
  • 重试策略(RetryRule)

    • 原理:在某个策略(如轮询)基础上,增加重试机制。若首次选择实例失败(如超时),则在指定时间内重试其他实例。
    • 特点
      • 提高容错能力,避免因单次失败导致请求失败。
      • 可能增加请求延迟。
    • 适用场景:网络不稳定或实例偶发故障的场景。
  • 最小并发策略(BestAvailableRule)

    • 原理:选择当前并发请求数最少的实例。
    • 特点
      • 动态分配负载,避免高并发实例过载。
      • 需要实时统计实例的并发数,实现复杂度较高。
    • 适用场景:实例负载差异明显,需动态平衡请求压力的场景。
  • 可用性过滤策略(AvailabilityFilteringRule)

    • 原理:过滤掉故障实例(如连续连接失败)和高并发实例,然后从剩余实例中轮询选择。
    • 特点
      • 提高系统可用性,避免调用问题节点。
      • 依赖实例健康状态监控。
    • 适用场景:需要自动屏蔽故障节点的场景。
  • 策略对比与选择建议

    策略核心逻辑优点缺点适用场景
    轮询(RoundRobin)依次循环选择简单、公平忽略实例性能差异实例性能相近的简单场景
    随机(Random)完全随机选择实现简单可能负载不均快速分配请求,无特殊要求
    加权响应时间按响应时间动态分配权重智能优化性能计算开销大实例性能差异大的场景
    区域感知(默认)优先同区域实例减少网络延迟,高可用依赖区域划分多区域部署的微服务架构
    重试(Retry)失败后重试其他实例提高容错性可能增加延迟网络抖动或偶发故障场景
    最小并发选择并发最低的实例动态负载均衡实现复杂,需统计并发数高并发且实例负载不均的场景
    可用性过滤过滤故障和高并发实例提高系统稳定性依赖健康检查机制需要自动容错的场景

如何自定义 OpenFeign 的请求编码和响应解码

实现 EncoderDecoder 接口,并通过配置类注册:

@Configuration
public class FeignConfig {@Beanpublic Encoder customEncoder() {return new MyEncoder(); // 处理复杂请求体(如文件上传)}@Beanpublic Decoder customDecoder() {return new MyDecoder(); // 处理非 JSON 响应(如 XML)}
}

OpenFeign 如何传递请求头(Header)信息

  • 方法 1:使用 @RequestHeader 注解显式传递
    @GetMapping("/api")
    String getData(@RequestHeader("Authorization") String token);
    
  • 方法 2:通过 RequestInterceptor 拦截器全局添加:
    public class AuthInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate template) {template.header("Authorization", "Bearer xxx");}
    }
    

OpenFeign 如何处理超时和重试

  • 超时配置(默认 Ribbon 超时时间为 1s):
    feign:client:config:default:connectTimeout: 5000readTimeout: 5000
    
  • 重试机制:默认不重试,需自定义 Retryer
    @Bean
    public Retryer feignRetryer() {return new Retryer.Default(100, 1000, 3); // 间隔 100ms,最大间隔 1s,重试 3 次
    }
    

OpenFeign 支持哪些 HTTP 客户端实现

OpenFeign 支持多种 HTTP 客户端,默认使用 JDK 的HttpURLConnection,可通过配置切换:

  • Apache HttpClient
    <dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId>
    </dependency>
    
  • OKHttp
    feign:httpclient:enabled: falseokhttp:enabled: true
    

如何记录 OpenFeign 的请求日志

配置日志级别(需 Logger.Level Bean):

@Configuration
public class FeignConfig {@BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL; // NONE, BASIC, HEADERS, FULL}
}
logging:level:com.example.FeignClient: DEBUG  # 指定 Feign 接口的包路径

OpenFeign 如何传递文件(上传/下载)

使用 @RequestPartmultipart/form-data 格式:

@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
String uploadFile(@RequestPart("file") MultipartFile file);

需确保引入 spring-cloud-starter-openfeign 和文件处理依赖(如 spring-web)。

OpenFeign 与 RestTemplate 的区别

特性OpenFeignRestTemplate
使用方式声明式接口(注解驱动)编程式(手动构建请求)
可读性高(代码简洁,类似 Spring MVC)低(代码冗余)
负载均衡默认集成 Ribbon需手动结合 Ribbon
熔断支持需结合 Hystrix 或 Sentinel需手动集成

如何解决 OpenFeign 调用时出现的 404 或参数错误

  • 404 错误:检查服务名、路径、HTTP 方法是否与提供者一致。
  • 参数错误
    • 使用 @RequestParam@PathVariable 明确参数传递方式。
    • 复杂对象默认转为请求体(POST 请求),GET 请求需拆解为简单参数。

高频追问问题

  • 如何通过 OpenFeign 实现服务发现
    • 集成 Eureka/Nacos,通过 @FeignClient(name = “service-name”) 自动发现服务实例。
  • OpenFeign 的性能调优有哪些手段
    • 使用 OKHttp 或 Apache HttpClient 替代默认实现。
    • 合理配置连接池、超时时间和重试策略。
  • 如何实现 OpenFeign 的请求/响应压缩
    feign:compression:request:enabled: truemime-types: text/xml, application/jsonresponse:enabled: true
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/73187.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Adobe Acrobat Pro setting

防火墙断网组织弹窗 Adobe软件突然弹窗“THIS APP HAS BEEN DISABLED”&#xff1f;别慌&#xff0c;几步教你轻松解决&#xff01; 禁用代理 解决Adobe出现This unlicensed Photoshop app has been disabled.禁止使用 rules:- DOMAIN-KEYWORD,adobe,REJECT

搜索插入位置(js实现,LeetCode:35)

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入…

5. 前后端实现文件上传与解析

1. 说明 在实际开发中&#xff0c;比较常见的一个功能是需要在前端页面中选择系统中的某个文件上传到服务器中进行解析&#xff0c;解析后的文件内容可以用来在服务器中当作参数&#xff0c;或者传递给其它组件使用&#xff0c;或者需要存储到数据库中。所以本文就提供一种方式…

《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(32)万剑归宗破妖阵 - 最长递增子序列(LIS)

《灵珠觉醒:从零到算法金仙的C++修炼》卷三天劫试炼(32)万剑归宗破妖阵 - 最长递增子序列(LIS) 哪吒在数据修仙界中继续他的修炼之旅。这一次,他来到了一片神秘的万剑谷,谷中有一座巨大的万剑归宗剑阵,剑阵闪烁着神秘的光芒。谷口有一块巨大的石碑,上面刻着一行文字:…

【redis】使用redis作为缓存时所注意事项

缓存更新策略 在 Redis 缓存中&#xff0c;缓存的更新策略主要有**定期生成&#xff08;定时更新&#xff09;和实时生成&#xff08;即时更新&#xff09;**两种方式。不同的策略适用于不同的业务场景&#xff0c;涉及性能、数据一致性和系统负载等方面的权衡。 1. 定期生成&…

计算机网络:计算机网络的分类

按分布范围分类&#xff1a;广域网&#xff0c;城域网&#xff0c;局域网&#xff0c;个域网 按传输技术分类&#xff1a;广播式网络&#xff0c;点对点网络 按拓扑结构分类&#xff1a;总线型&#xff0c;环形&#xff0c;星形&#xff0c;网状 按传输介质分类&#xff1a;…

解决pip安装uv时下载速度慢

验证优化效果 方案 1&#xff1a;临时使用国内镜像源&#xff08;推荐&#xff09; pip install uv -i https://pypi.tuna.tsinghua.edu.cn/simple 速度提升&#xff1a;镜像源服务器位于国内&#xff0c;带宽充足&#xff0c;通常可达 1-10MB/s 支持源列表&#xff1a; # 清…

SpringCloud Alibaba——入门简介

一、是什么 &#xff08;1&#xff09;诞生 2018.10.31&#xff0c;Spring Cloud Alibaba 正式入驻了 Spring Cloud 官方孵化器&#xff0c;并在 Maven 中央库发布了第一个版本 &#xff08;2&#xff09;介绍 &#xff08;3&#xff09;&#xff1f;何为必须组件 二、能干嘛…

Python完全指南:从基础到实践的编程艺术

引言&#xff1a;数字时代的瑞士军刀 在人工智能与大数据浪潮中&#xff0c;Python如同编程世界的"瑞士军刀"&#xff0c;以其优雅的语法和强大的生态征服全球开发者。本文将从语言哲学到实战应用&#xff0c;为您展开Python编程的全景画卷&#xff0c;揭示这门语言…

Docker 运行 GPUStack 的详细教程

GPUStack GPUStack 是一个用于运行 AI 模型的开源 GPU 集群管理器。它具有广泛的硬件兼容性&#xff0c;支持多种品牌的 GPU&#xff0c;并能在 Apple MacBook、Windows PC 和 Linux 服务器上运行。GPUStack 支持各种 AI 模型&#xff0c;包括大型语言模型&#xff08;LLMs&am…

完整例子和调用关系qt OpenGL

项目结构 首先&#xff0c;你需要在 Qt 项目中创建一个类&#xff0c;继承自 QOpenGLWidget 来进行 OpenGL 渲染。文件结构如下&#xff1a; - main.cpp - MyOpenGLWidget.h - MyOpenGLWidget.cpp - vertex_shader.glsl - fragment_shader.glsl 1. main.cpp 这是 Qt 项目的入口…

VSCode 配置优化指南:打造极致高效的前端开发环境

VSCode 配置优化指南&#xff1a;打造极致高效的前端开发环境 一、基础环境配置&#xff1a;让开发更流畅 1. 性能优化设置 // settings.json {"files.autoSave": "afterDelay", // 自动保存&#xff08;延迟1秒&#xff09;"files.exclud…

源IP泄露后如何涅槃重生?高可用架构与自动化防御体系设计

一、架构层解决方案 1. 高防代理架构设计 推荐架构&#xff1a; 用户 → CDN&#xff08;缓存静态资源&#xff09; → 高防IP&#xff08;流量清洗&#xff09; → 源站集群&#xff08;真实IP隐藏&#xff09; ↑ Web应用防火墙&#xff08;WAF&#xff09; 实施要点&a…

【英伟达AI论文】多模态大型语言模型的高效长视频理解

摘要&#xff1a;近年来&#xff0c;基于视频的多模态大型语言模型&#xff08;Video-LLMs&#xff09;通过将视频处理为图像帧序列&#xff0c;显著提升了视频理解能力。然而&#xff0c;许多现有方法在视觉主干网络中独立处理各帧&#xff0c;缺乏显式的时序建模&#xff0c;…

无障碍阅读(Web Accessibility)NVDA打开朗读查看器后,enter键不生效的原因

用NVDA测试Web Accessibility时&#xff0c;打开朗读查看器&#xff0c;enter键会无效&#xff0c;而不打开测试器&#xff0c;就没有问题&#xff0c;很大原因是被应用的元素不是可聚焦的&#xff0c;解决方法尝试&#xff1a; 将标签改为可聚焦的语义化标签&#xff0c;如 b…

2Android中的AIDL是什么以及如何使用它

一、Android中的AIDL概述 AIDL&#xff08;Android Interface Definition Language&#xff09;是Android系统中用于定义和实现跨进程通信&#xff08;IPC&#xff09;接口的语言。它允许一个进程向另一个进程发送请求并获取响应&#xff0c;是Android中实现进程间通信的一种重…

Python绘制数据分析中经典的图形--列线图

Python绘制数据分析中经典的图形–列线图 列线图是数据分析中的经典图形&#xff0c;通过背后精妙的算法设计&#xff0c;展示线性模型&#xff08;logistic regression 和Cox&#xff09;中各个变量对于预测结果的总体贡献&#xff08;线段长短&#xff09;&#xff0c;另外&…

leetcode【面试经典150系列】(一)

目录 121.买卖股票最佳时机 题目描述 示例 算法分析 代码(python3) 122.买卖股票最佳时机II 题目描述 示例 算法分析 代码&#xff08;python3&#xff09; 55.跳跃游戏 题目描述 示例 算法分析 代码 45.跳跃游戏II 题目描述 示例 算法分析 代码 121.买卖股票…

为什么会出现redis数据库?redis是什么?

什么是 Redis? 为什么要用 Redis? 下面我将从 Redis 出现的背景、Redis 的解决方案个来回答。 1、Redis 出现的背景 互联网的应用越来越多&#xff0c;例如社交网络、电商、实时服务发展的十分迅速&#xff0c;这就导致了传统技术栈&#xff08;如关系型数据库&#xff09;…

Windows 11下Git Bash执行cURL脚本400问题、CMD/PowerShell不能执行多行文本等问题记录及解决方案

问题 在Postman里可成功执行的POST请求&#xff1a; 找到Postman的Code 因为cURL基本上算是行业标准&#xff0c;所以Postman默认选中cURL&#xff0c;支持切换不同的开发语言&#xff1a; 点击上图右上角的复制按钮&#xff0c;得到cURL脚本。 Windows 11家庭版&#xff…