SpringCloud--OpenFeign解析

news2024/12/24 1:25:52

一、OpenFeign简介

OpenFeign是一个声明式的Web服务客户端,它简化了与HTTP API的通信。它的底层原理主要基于Java的反射和动态代理,并且通过利用Spring AOP 框架、RestTemplate、Ribbon 和 Hystrix 等组件,将复杂的 HTTP 调用封装起来,使得开发者能够像调用本地服务一样使用远程服务。

二、OpenFeign 使用步骤

假设有个下单服务为orderService需要调用库存服务stockService中的接口查询商品的库存量。

  1. 首先在两个服务的pom.xml文件中引入OpenFeign 组件。
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 先在orderService创建一个查询商品库存的接口,这个接口上面使用了一个@FeignClient注解标注,注解里面的name属性指定了要调用的服务名,表明该远程接口属于哪个服务。接口里面的方法上面使用了@RequestMapping注解标注,该注解里面指定了要访问的接口路径。
@FeignClient(name = "stock-service")
public interface StockServiceFeign {
    /**
     * 获取商品信息
     *
     */
    @RequestMapping("/stock/getStockInfo")
    CommonResult<Page<SysRole>> getStockInfo(@RequestParam String stockId);
}
  1. 在orderService的启动类上添加@EnableFeignClients注解,该注解表明在服务启动后开启远程调用。
@EnableFeignClients
@SpringBootApplication
public class NjhGatewayApplication {

	public static void main(String[] args) {
		SpringApplication.run(NjhGatewayApplication.class, args);
	}
}

  1. 最后到stockService服务中定义一个接口去实现具体的功能,并保证接口地址以及入参与orderService刚定义的接口一致。
@RestController
public class StockController {
	@Autowired StockService;
	
    @RequestMapping("/stock/getStockInfo")
    public R getStockInfo(@RequestParam String stockId) {
       return StockService.getStockInfo(stockId);
    }
}

三、实现原理

从上面例子可以看出OpenFeign 使用起来还是很简单方便,但是其底层原理就没那么简单了。其核心的处理逻辑就是使用Spring的AOP动态代理技术,对所有被 @FeignClient 注解修饰的接口生成一个动态代理类,在这个代理类中会将注解中的服务的名称、接口类型、访问路径转化成一个远程服务调用的 Request请求,并发送给目标服务。转化后的Request请求格式类似GET http://stock-service/stock/getStockInfo/10001 HTTP/1.1,下面看下主要的处理流程:

  1. 创建代理对象:当你定义一个使用了 @FeignClient 注解的接口时,OpenFeign 会在运行时为这个接口创建一个代理对象。这个代理对象用于处理对远程服务的调用。
  2. 解析注解:在运行时,OpenFeign 会解析 @FeignClient 注解,确定要连接的服务名称。如果使 用了服务注册中心(如 Eureka),服务名称会被用来查找服务实例。
  3. 路由匹配:对于每个接口方法,OpenFeign 会创建一个映射,将方法路径(如果提供的话)和 HTTP 请求方法(如 GET、POST 等)与服务端的 API 路径进行匹配。
  4. 构建请求:当代理对象被调用时,OpenFeign 会构建一个 HTTP 请求,这个请求包含了方法参数作为请求体或查询参数。编码器将这些参数转换为适用于 HTTP 传输的格式。
  5. HTTP 调用:使用默认的或自定义的 HTTP 客户端,OpenFeign 发送 HTTP 请求到远程服务。如果使用了 Ribbon,它会进行负载均衡来决定请求发送到哪个服务实例。
  6. 接收响应:HTTP 客户端接收远程服务的响应,并将其传递给解码器。
  7. 解码响应:解码器将 HTTP 响应体解码为方法可以接受的参数或返回值。如果响应是一个 JSON 或 XML 字符串,解码器会将其转换为 Java 对象。
  8. 处理异常:如果在请求过程中发生错误,例如连接失败或解码错误,OpenFeign 会将异常传递给调用者。开发者可以定义错误处理策略来处理这些异常。
  9. 返回结果:最终,解码后的结果会作为方法的返回值返回给调用方。

四、源码解析

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({FeignClientsRegistrar.class})
public @interface EnableFeignClients {
    String[] value() default {};

    String[] basePackages() default {};

    Class<?>[] basePackageClasses() default {};

    Class<?>[] defaultConfiguration() default {};

    Class<?>[] clients() default {};
}

(1)@EnableFeignClients注解中的basePackages属性来设置包扫描的范围,从中找出所有带有@FeignClient 注解的类、接口,并将它们注册为Feign客户端。

@EnableFeignClients(basePackages = "com.jackson0714.passjava.member.feign")

(2)进入@EnableFeignClients注解可以看到里面使用了一个@Import({FeignClientsRegistrar.class})注解,里面还导入了FeignClientsRegistrar.class类,主要负责将Feign Client的Bean注册到Spring的IOC容器中。
在这里插入图片描述
(3)registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry)方法主要用于注册Bean定义。
在这里插入图片描述
(4)getBasePackages(AnnotationMetadata importingClassMetadata)方法将扫描到的所有@FeignClient 注解的元数据,从这些元数据中提取出基础包名,并将它们作为一个Set集合返回。
在这里插入图片描述

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

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

相关文章

浏览器V8是怎么进行垃圾回收的

面试相关问题解答 1、浏览器V8是怎么进行垃圾回收的 浏览器的内存占用是有限制的&#xff1a; 64位系统&#xff1a;物理内存 > 16G > 最大堆内存限制为4G物理内存 < 16G > 最大堆内存限制为2G 32位系统&#xff1a;最大堆内存限制为1G为什么浏览器要对占用内…

云表企业级无代码案例-10天做出《运输车辆管理系统》

物流运输行业像物流公司、运输车队、出租客运公司等企业在车辆管理方面&#xff0c;因其行业特点而面临很多管理上难题&#xff1a; 一、管理的对象多&#xff1a;车辆多&#xff0c;如果有三方车辆挂靠&#xff0c;还要涉及到车主管理&#xff0c;关系错综复杂。 二、管理的信…

2024-01-24-redis4

秒杀活动 需求&#xff1a;库存中有10件商品 商品的信息自定义 同时有100个人去抢购&#xff08;这里100个人的抢购由jmeter来模拟&#xff09; jmeter的使用 在idea中将后台代码实现 package org.aaa.controller;import org.apache.commons.lang3.StringUtils; import org.sp…

LabVIEW机械臂轨迹跟踪控制

介绍了一个使用LabVIEW开发的机械臂轨迹跟踪控制系统。该系统的主要目标是实现对机械臂运动轨迹的精确控制&#xff0c;使其能够按照预定路径进行精确移动。此系统特别适用于需要高精度位置控制的场合&#xff0c;如自动化装配、精密操作等。 为了实现LabVIEW环境下的机械臂轨迹…

SpringSecurity(13)——OAuth2授权码模式

工作流程 基本使用 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId><version>2.3.12.RELEASE</version> </dependency> <dependency><groupId>…

架构篇26:高可用存储架构-集群和分区

文章目录 数据集群数据分区小结上一篇我们讨论了高可用存储架构中常见的双机架构,分别为主备复制、主从复制、双机切换和主主复制,并分析了每类架构的优缺点以及适应场景。 今天我们一起来看看另外两种常见的高可用存储架构:数据集群和数据分区。 数据集群 主备、主从、主…

macOS与Linux相互投屏的方法

很多人面对跨系统投屏都望而却步。其实只要找对方法&#xff0c;两台不同系统的电脑也可以相互投屏。 今天就来看看Linux系统和macOS系统如何相互投屏&#xff01; 第一步&#xff0c;将Linux系统电脑和macOS系统电脑连接同一网络。假设是macOS系统投屏到Linux系统&#xff0c;…

第五季特别篇:一夜杯、游戏之宴 2017.04.26

第五季特别篇&#xff1a;一夜杯、游戏之宴 2017.04.26 OVA 第1话&#xff1a;一夜酒杯 / 一夜杯OVA 第2话&#xff1a;游戏之宴 / 遊戯の宴 OVA 第1话&#xff1a;一夜酒杯 / 一夜杯 遭到独角妖袭击的妖怪夫妇日土和初菜被夏目所救&#xff0c;这对妖怪夫妇制作的酒杯&#xf…

1_Matlab基本操作

文章目录 工作环境操作界面运行命令窗口使用历史窗口当前目录浏览器工作空间浏览器帮助系统 工作环境 操作界面 命令窗口&#xff1a;用户进行操作的主要窗口。可以输入各种MATLAB的命令。函数和表达式。同时操作的运算结构也会在该窗口出现。历史命令窗口&#xff1a;记录用户…

猫宁愿饿着也不吃猫粮?公认适口性排名前十的生骨肉冻干推荐

猫宁愿饿着也不吃猫粮&#xff1f;主人需要细心观察并分析情况。如果猫咪出现呕吐、腹泻、体温异常等其他异常症状&#xff0c;可能是生病了&#xff0c;应及时就医。如果排除疾病原因&#xff0c;可能是猫粮的口感已经让猫咪感到腻味&#xff0c;不愿意再吃。此时&#xff0c;…

ArcGIS Pro如何新建字段

无论是地图制作还是数据分析&#xff0c;字段的操作是必不可少的&#xff0c;在某些时候现有的字段不能满足需求还需要新建字段&#xff0c;这里为大家讲解一下在ArcGIS Pro中怎么新建字段&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的水…

优维全面可观测产品能力分解②:变更可观测

上周&#xff0c;我们推出了优维全面可观测能力介绍的系列性文章的第一篇&#xff1a;架构可观测。优维架构可观测是从系统架构的视角来呈现链路与服务的状态数据&#xff0c;点击可回看&#xff1a;架构可观测文章。本周&#xff0c;我们将推出本系列性文章的第二篇&#xff1…

基于springboot网上书城交易平台源码和论文

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括网上书城管理系统的网络应用&#xff0c;在国外网上书城管理系统已经是很普遍的方式&#xff0c;不过国内的书城管理系统可能还处于起步阶段。网上书城管理系统具有网上书城信…

巴厘行记(五)——情人崖

欢迎览阅《巴厘行记》系列文章 巴厘行记巴厘行记&#xff08;一&#xff09;——海神庙 巴厘行记&#xff08;二&#xff09;——乌布之夜 巴厘行记&#xff08;三&#xff09;——Auntie和Mudi 巴厘行记&#xff08;四&#xff09;——乌布漫游 巴厘行记&#xff08;五&a…

TypeScript实战系列之合理运用类型

目录 介绍any 和 unknownerve 的用途断言type 和 interfacedeclare 关键字的作用联合类型 和 类型守卫交叉类型 介绍 这篇主要介绍下ts 常用的基本类型和一些常用的技巧性技能 any 和 unknow any 和 unknown 是两个类型关键字&#xff0c;它们用于处理类型不确定或未知的情况…

羊奶温和无副作用,对五脏六腑有益

羊奶温和无副作用&#xff0c;对五脏六腑有益 羊奶一直以来都被视为一种高营养价值的饮品。与普通的牛奶相比&#xff0c;羊奶含有更多的维生素和矿物质&#xff0c;对人体的健康有着更多的益处。羊奶不仅温和无副作用&#xff0c;而且对五脏六腑都有着独特的滋补作用。 首先&…

day30_HTML

day25后几天为答疑和测试&#xff0c;第二阶段学习第一天是day30 在今日内容 0 复习昨日 1 本周安排 2 第二阶段介绍 3 HTML 0 复习昨日 1 本周安排 前面的Java知识 类,对象,属性,方法 String,日期操作,包装类操作 集合操作 本周 HTML 1天CSS 1天JavaScript 3天 前端知识比后…

OpenGL/C++_学习笔记(四)空间概念与摄像头

汇总页 上一篇: OpenGL/C_学习笔记&#xff08;三&#xff09; 绘制第一个图形 OpenGL/C_学习笔记&#xff08;四&#xff09;空间概念与摄像头 空间概念与摄像头前置科技树: 线性代数空间概念流程简述各空间相关概念详述 空间概念与摄像头 前置科技树: 线性代数 矩阵/向量定…

Linux系统——正则表达式

有一段时间本机访问量过高&#xff0c;如何查看日志提取出访问量前十的信息 1.使用提取命令&#xff08;cut、awk、sed&#xff09;提取出ip地址的那一列 2.使用sort按数字排序&#xff0c;将相同的地址整合到一起 3.使用uniq -c统计出数量 4.使用sort 数字 数字倒序排序 5.最…

[C语言][C++][时间复杂度详解分析]二分查找——杨氏矩阵查找数字详解!!!

一&#xff0c;题目 遇到的一道算法题&#xff1a; 1&#xff0c;已知有一个数字矩阵&#xff08;row行&#xff0c;col列&#xff09;&#xff0c;矩阵的每行 从左到右 递增&#xff0c;每列 从上到下 递增。 2&#xff0c;现输入一个数字 num &#xff0c;判断数字矩阵中…