重生之我在暑假学习微服务第八天《OpenFeign篇》

  •  个人主页:VON
  • 文章所属专栏:微服务

 

微服务系列文章

重生之我在暑假学习微服务第一天《MybatisPlus-上篇》
重生之我在暑假学习微服务第二天《MybatisPlus-下篇》
重生之我在暑假学习微服务第三天《Docker-上篇》
重生之我在暑假学习微服务第四天《Docker-下篇》
重生之我在暑假学习微服务第五天《Docker部署项目篇》
重生之我在暑假学习微服务第六天《微服务之拆分项目篇》
重生之我在暑假学习微服务第七天《微服务之服务治理篇》
未完待续....

特别声明:本系列所涉及资料皆为黑马程序员课程中的资料

目录

 一、认识OpenFeign

1、引入依赖

 2、在启动类中引入注解​编辑

3、编写客户端

4、开始调用

二、实现原理

1. 核心组件与工作流程

(1)接口扫描与代理生成

(2)方法注解解析

(3)HTTP 请求构建与发送

(4)响应处理与结果转换

2. 关键组件详解

三、利用连接池来进行优化

1、引入依赖

2、修改yaml文件

四、最佳使用方式

1、创建hm-api模块

 2、改造hm-api模块

 3、在cart模块引入api依赖

4、修改启动类 

5、测试

五、日志

结语


 

 一、认识OpenFeign

不知道昨天的大家学习的如何了,今天和昨天学的东西大致一致,就是利用新技术(OpenFeign )来简化我们的代码。

OpenFeign 是一个声明式的 HTTP 客户端框架,主要用于简化 RESTful API 的调用。它通过注解和接口定义的方式,让开发者能够以更简洁的方式编写 HTTP 请求逻辑,而无需手动处理底层的 HTTP 通信细节。

1、引入依赖

<!--        openfeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
<!--        负载均衡器--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>

 2、在启动类中引入注解

3、编写客户端

4、开始调用

先导入

 这样就直接将上面这一段简化成了一行代码

启动成功!!! 

 

二、实现原理

┌─────────────────┐  启动时扫描  ┌───────────────────────────────┐
│  @EnableFeignClients  ────────→  扫描@FeignClient标记的接口   │
└─────────────────┘             └──────────────┬────────────────┘│
┌─────────────────┐  生成动态代理  ┌────────────▼────────────────┐
│  Spring容器注册  ←──────────────  为接口创建JDK动态代理对象    │
└────────┬────────┘             └───────────────────────────────┘│
┌────────▼────────┐  调用接口方法  ┌───────────────────────────────┐
│  业务代码注入接口  ───────────────→  触发动态代理的invoke方法    │
└─────────────────┘             └────────────┬────────────────┘│
┌────────────────────────────────────────────▼─────────────────────────┐
│                           解析请求信息                                │
│  1. 解析@FeignClient的服务名、@GetMapping等注解的HTTP方法/路径        │
│  2. 提取方法参数(@PathVariable/@RequestParam等)                     │
│  3. 拼接基础URL(服务名 + 接口路径)                                  │
└────────────────────────────────────┬─────────────────────────────────┘│
┌────────────────────────────────────▼─────────────────────────────────┐
│                           服务地址解析                                │
│  1. 若集成服务发现(Eureka/Nacos),通过服务名获取实例列表             │
│  2. 若集成负载均衡(Ribbon),选择具体服务实例(如轮询/随机策略)      │
│  3. 生成最终请求地址(如http://192.168.1.100:8080/users/1)           │
└────────────────────────────────────┬─────────────────────────────────┘│
┌────────────────────────────────────▼─────────────────────────────────┐
│                           构建HTTP请求                               │
│  1. Encoder将请求参数序列化(如JSON)                                 │
│  2. 组装请求头(默认头 + 自定义Interceptor添加的头)                  │
│  3. 构建完整请求对象(Method/URL/Body/Headers)                       │
└────────────────────────────────────┬─────────────────────────────────┘│
┌────────────────────────────────────▼─────────────────────────────────┐
│                           发送HTTP请求                               │
│  1. 通过Client组件(默认HttpURLConnection,可替换为OkHttp)发送请求   │
│  2. 若配置Retryer,失败时执行重试逻辑                                │
└────────────────────────────────────┬─────────────────────────────────┘│
┌────────────────────────────────────▼─────────────────────────────────┐
│                           处理响应结果                                │
│  1. 接收响应(状态码/响应体)                                         │
│  2. 若状态码非2xx,抛出FeignException(或触发fallback)               │
│  3. Decoder将响应体反序列化为返回值对象(如User)                     │
└────────────────────────────────────┬─────────────────────────────────┘│
┌─────────────────┐  返回结果  ┌─────▼───────────┐
│  业务代码接收结果  ←──────────  动态代理返回数据  │
└─────────────────┘             └─────────────────┘

1. 核心组件与工作流程

OpenFeign 的工作流程可分为四个关键步骤:

(1)接口扫描与代理生成
  • 启动时扫描:通过 @EnableFeignClients 注解触发扫描,Spring 会扫描指定包下所有被 @FeignClient 注解标记的接口。
  • 动态代理创建:对每个 @FeignClient 接口,OpenFeign 会通过 Feign.Builder 创建一个动态代理对象(JDK 动态代理),并将其注册到 Spring 容器中。
    • 后续业务代码中注入该接口时,实际使用的是这个代理对象。
(2)方法注解解析

当调用代理对象的接口方法时,代理会触发以下操作:

  • 解析注解信息:解析方法上的 @RequestMapping@GetMapping@PostMapping 等注解,提取 HTTP 方法(GET/POST 等)、URL 路径、请求参数、请求头等信息。
  • 拼接请求 URL:结合 @FeignClient 中的 value(服务名)和方法上的路径,生成完整的请求 URL(如 http://服务名/路径)。
    • 服务名会通过服务发现(如 Eureka、Nacos)转换为实际的服务地址。
(3)HTTP 请求构建与发送
  • 构建请求:根据解析到的信息,OpenFeign 会构建一个 HTTP 请求对象(包含 URL、方法、参数、header 等)。
  • 执行请求:通过内部的 Client 组件发送 HTTP 请求。默认使用 JDK 原生的 HttpURLConnection,也可配置为 OkHttp、Apache HttpClient 等。
    • 若集成了负载均衡(如 Ribbon、Spring Cloud LoadBalancer),会先通过负载均衡策略选择具体服务实例的地址。
(4)响应处理与结果转换
  • 接收响应:Client 组件接收 HTTP 响应,解析响应状态码、响应体等。
  • 结果转换:根据接口方法的返回值类型,将响应体转换为对应的 Java 对象(默认使用 Jackson 进行 JSON 反序列化)。
  • 异常处理:若响应状态码非 2xx,会根据配置抛出对应的异常(如 FeignException)。

2. 关键组件详解

  • FeignClient 注解:标记接口为 Feign 客户端,包含服务名、URL、 fallback 等配置。
  • Contract:定义注解 解析规则,默认支持 Spring MVC 的注解(如 @RequestMapping),也可自定义。
  • Encoder/Decoder
    • Encoder:将请求参数对象转换为 HTTP 请求体(如 JSON 序列化)。
    • Decoder:将 HTTP 响应体转换为接口方法的返回值对象。
  • Client:实际执行 HTTP 请求的组件,可替换为 OkHttp、HttpClient 等。
  • Retryer:请求失败时的重试策略,默认不重试,可自定义重试逻辑。
  • Interceptor:请求 / 响应拦截器,可用于统一添加 header、日志打印等。

OpenFeign 的核心是通过动态代理将接口方法调用映射为 HTTP 请求,其实现依赖于:

  • 注解解析提取请求信息;
  • 动态代理生成接口实现类;
  • 可扩展的 HTTP 客户端发送请求;
  • 序列化 / 反序列化处理数据转换。

三、利用连接池来进行优化

1、引入依赖

2、修改yaml文件

直接在最后添加即可

四、最佳使用方式

1、创建hm-api模块

引入相关依赖

 2、改造hm-api模块

将cart服务中的Item相关的都剪切过来

 3、在cart模块引入api依赖

4、修改启动类 

 最后修改下启动类使得他们能够连接起来

5、测试

可以看到数据正常显示,修改成功!

五、日志

可以看到我们这里发起请求的时候并没有日志

先添加一个类来存储日志级别

在启动类中应用一下 

重新启动项目发起请求查看日志,可以看到这里的日志十分完整了 

结语

本文介绍了微服务开发中使用OpenFeign的技术要点。主要内容包括:1)OpenFeign的基本使用,通过声明式接口简化HTTP调用;2)核心原理分析,包括动态代理生成、注解解析、请求构建和响应处理流程;3)优化实践,如引入连接池提高性能;4)最佳使用方式,通过api模块统一管理服务接口;5)日志配置方法,便于调试监控。文章结合具体代码示例,详细讲解了如何利用OpenFeign简化微服务间的远程调用,并给出了性能优化和规范使用的建议。

 

 

 

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

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

相关文章

风光储综合能源系统双层优化规划设计【MATLAB模型实现】

本模型基于双层优化框架&#xff0c;利用KKT条件、大M法、对偶理论求解&#xff0c;专注于综合能源系统&#xff08;微电网&#xff09;多电源容量优化配置的模型介绍。代码采用CPLEX求解器&#xff0c;注释详尽&#xff0c;非常适合新手学习该类问题的建模与求解思路。 模型总…

雪花算法重复id问题

原理解析 雪花算法实现简单、适配性强&#xff0c;无论是电商订单、日志追踪还是分布式存储&#xff0c;都能满足 “唯一、有序、高效、可扩展” 的核心需求&#xff0c;因此成为分布式ID主流选择。雪花算法生成的ID是一个64位的整数&#xff0c;由多段不同意义的数字拼接而成&…

MQTT 入门教程:三步从 Docker 部署到 Java 客户端实现

在物联网&#xff08;IoT&#xff09;与边缘计算快速发展的今天&#xff0c;设备间的高效通信成为核心需求。MQTT 作为一种轻量级的发布 / 订阅模式协议&#xff0c;凭借其低带宽占用、强稳定性和灵活的消息路由能力&#xff0c;已成为物联网通信的事实标准。无论是智能家居的设…

公网服务器上Nginx或者Openresty如何屏蔽IP直接扫描

0x01 背景云服务器很多时候为了通信需要设置公网访问&#xff0c;但是网络当中存在很多的扫描器&#xff0c;无时无刻在扫描&#xff0c;当80,443端口暴露时&#xff0c;成了这些扫描IP的攻击对象&#xff0c;无时无刻收到威胁。0x02 扫描攻击方式1.直接通过公网IP地址进行一些…

C语言(长期更新)第8讲 函数递归

C语言&#xff08;长期更新&#xff09; 第8讲:函数递归 跟着潼心走&#xff0c;轻松拿捏C语言&#xff0c;困惑通通走&#xff0c;一去不回头~欢迎开始今天的学习内容&#xff0c;你的支持就是博主最大的动力。 目录 C语言&#xff08;长期更新&#xff09; 第8讲 函数递归…

[硬件电路-129]:模拟电路 - 继电器的工作原理、关键指标、常用芯片与管脚定义

一、工作原理继电器是一种基于电磁感应原理的自动开关装置&#xff0c;通过控制小电流电路实现大电流电路的通断。其核心结构包括&#xff1a;电磁铁&#xff08;线圈铁芯&#xff09;&#xff1a;通电时产生磁场&#xff0c;吸引衔铁动作。触点系统&#xff1a;包含常开触点&a…

Haproxy调度算法 - 静态算法介绍与使用

文章目录一、概述二、socat工具三、static-rr四、firstHAProxy通过固定参数 balance 指明对后端服务器的调度算法&#xff0c;该参数可以配置在listen或backend选项中。HAProxy的调度算法分为静态和动态调度算法&#xff0c;但是有些算法可以根据参数在静态和动态算法中相互转换…

模拟激光相机工作站版本6.0 5.2.32 6.0.44 6.031 5.2.20

模拟激光相机工作站版本6.0 5.2.32 6.0.44 6.031 5.2.20

AWS Blockchain Templates:快速部署企业级区块链网络的终极解决方案

无需精通底层架构&#xff0c;一键搭建Hyperledger Fabric或以太坊网络&#xff01;AWS Blockchain Templates 可帮助您快速基于不同的区块链框架在 AWS 上创建和部署区块链网络。区块链是一种分布式数据库技术&#xff0c;用于维护不断增长的交易记录和智能合约集合&#xff0…

Vue 服务端渲染 Nuxt 使用详解

Nuxt 是基于 Vue 的高层框架&#xff0c;专注于服务器端渲染应用开发。它封装了繁琐的配置和通用模式&#xff0c;提供了开箱即用的 SSR 功能&#xff0c;使开发者能够专注于编写业务逻辑。 1. Nuxt 的核心特性 SSR 支持&#xff1a;默认支持服务端渲染&#xff0c;提高应用性…

使用ACK Serverless容器化部署大语言模型FastChat

核心概念 阿里云ACK Serverless&#xff1a;是一种基于 Kubernetes 的无服务器容器服务。用户无需管理底层节点和服务器&#xff0c;即可快速部署容器化应用&#xff0c;并根据实际使用的 CPU 和内存资源按需付费&#xff0c;只专注于应用本身而非基础设施管理。 FastChat&…

最新Android Studio汉化教程--兼容插件包

[ ] 软件版本&#xff1a;Android Studio Meerkat Feature Drop | 2024.3.2 Build #AI-243.25659.59.2432.13423653, built on April 30, 2025 Runtime version: 21.0.613368085-b895.109 amd64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. Toolkit: sun.awt.windows.WT…

Unity_数据持久化_IXmlSerializable接口

Unity数据持久化 三、XML数据持久化 3.5 IXmlSerializable接口 3.5.1 IXmlSerializable接口基础概念 什么是IXmlSerializable接口&#xff1a; IXmlSerializable 是.NET框架提供的一个接口&#xff0c;允许类自定义XML序列化和反序列化的过程。当默认的XML序列化行为无法满足需…

如何快速解决PDF解密新方法?

有时从网络下载的PDF文档会带有加密限制&#xff0c;导致无法编辑、复制或打印。它的体积仅约10MB&#xff0c;无需安装&#xff0c;解压即用。遇到受限制的文件时&#xff0c;只需将其拖入界面&#xff0c;选择是否覆盖原文件&#xff0c;点击执行&#xff0c;瞬间完成解密。「…

译|数据驱动智慧供应链的构成要素与关联思考

数据质量&#xff0c;通过识别关键决策和瓶颈构建信息供应链。该模型适用于优化库存管理、自动化物流、预测需求、实现产品全生命周期追溯及应对突发风险。例如&#xff0c;通过AI机器人自动管理仓库&#xff0c;或利用数字孪生模拟和优化全球采购网络。 汇总来自三篇文章&…

OS21.【Linux】环境变量

目录 1.与环境变量有关的实验 A.对比命令和自制程序的运行 为什么.像ls、pwd这样的命令运行是不需要加路径? 执行自制程序而不加路径的方法,看看PATH环境变量 方法1:将自制程序移动到系统的搜索路径下 方法2:临时修改PATH环境变量 B.查看系统中所有环境变量 解释几个常…

加密流量论文复现:《Detecting DNS over HTTPS based data exfiltration》(上)

本文将以我个人的理解去阅读该篇流量加密论文&#xff0c;并在下一篇尽力对其中的实验部分进行复现。话不多说&#xff0c;先从论文开始着手。 内容介绍 传统的DNS(Domain Name System)协议是以明文传输的。DNS作为互联网的基础设施&#xff0c;最初设计时主要考虑的是功能和效…

Apache RocketMQ 中Message (消息)的核心概念

好的&#xff0c;我们来深入理解一下 Apache RocketMQ 中 Message (消息) 这个核心概念。这份文档详细阐述了消息的定义、在模型中的位置、内部属性、约束和使用建议。 你可以将 Message 看作是 RocketMQ 系统中数据传输和处理的最小原子单位。它承载了业务数据&#xff0c;并附…

C 语言问题

1. C语言中 union 与 struct 的区别类型structunion内存分配机制编译器为每个成员‌独立分配内存空间&#xff0c;总内存大小 所有成员大小之和&#xff08;考虑内存对齐&#xff09;所有成员‌共享同一段内存空间&#xff0c;总内存大小 ‌最大成员的大小‌数据存储特性1. 所…

[ LeetCode优选算法专题一双指针-----盛最多的水]

1.题目链接 LeetCode盛最多的水 2.题目描述 3.题目解析 问题本质分析 "盛最多水的容器" 问题可以抽象为&#xff1a;在坐标轴上有 n 条垂直线段&#xff0c;第 i 条线段的两个端点分别是 (i, 0) 和 (i, height [i])。找到两条线段&#xff0c;使得它们与 x 轴共同…