1.10000字 | 深入理解 OpenFeign 的码解架构原理
2.Spring Cloud OpenFeign源码FeignClientFactoryBean原理
3.SpringCloud原理OpenFeign原来是这么基于Ribbon来实现负载均衡的
4.微服务实战SpringCloud之Feign简介及使用
10000字 | 深入理解 OpenFeign 的架构原理
这是悟空的第篇原创文章 官网:passjava.cn 深入理解 OpenFeign 的架构原理,让你轻松掌握远程调用的码解精髓。 远程调用与本地调用相对,码解本地调用即在同一服务内部方法间的码解调用,而远程调用涉及不同服务间的码解调用。通过构造HTTP请求,码解源码版本号我们能实现远程服务的码解调用。然而,码解构造请求的码解过程繁琐。Feign组件简化了这一过程,码解使得远程调用如同调用本地方法一样简单。码解 Feign与OpenFeign之间的码解关系:OpenFeign是Feign的增强版本,支持MVC注解。码解Spring Cloud中,码解OpenFeign是码解微服务组件的关键部分。以下是如何使用OpenFeign执行远程调用的步骤: 1. 定义远程调用接口并使用@FeignClient注解指定服务名。 2. 在启动类上添加@EnableFeignClients注解以开启远程调用功能,并开启服务发现。 3. 在远程服务定义方法,其路径与调用接口URL一致。 4. 引入OpenFeign组件与相关服务依赖。 5. 调用远程服务方法,实现数据的获取与交互。 OpenFeign的使用简洁明了,然而其内部设计复杂。本文通过分析核心流程图,详细解析了OpenFeign的工作原理,包括包扫描、注册FeignClient到Spring容器、动态代理生成、sentry源码协议MVC注解解析、请求发送与响应处理等关键环节。通过理解这些原理,你可以轻松构建高效稳定的微服务架构。 本文以PassJava开源项目为实例,深入剖析了OpenFeign的架构设计,通过图解与源码解读,清晰地展示了OpenFeign的核心流程与工作原理。理解这些原理将帮助你更深入地掌握微服务中远程调用的实现与优化。 通过本文的学习,你将能够:掌握远程调用的概念与实现方式。
理解Feign与OpenFeign的功能与区别。
学会如何使用OpenFeign进行远程服务调用。
深入解析OpenFeign的核心流程,包括包扫描、代理生成、注解解析与请求处理。
构建基于OpenFeign的高效稳定的微服务架构。
本文为开源项目PassJava中的OpenFeign使用提供了一套全面的指南,帮助开发者深入理解其架构原理,进而提升微服务开发能力。Spring Cloud OpenFeign源码FeignClientFactoryBean原理
Spring Cloud OpenFeign的FeignClientFactoryBean在实例化过程中,通过FactoryBean接口实现,GetObject方法的关键步骤包括获取FeignContext、配置Feign.Builder、创建HardCodedTarget和调用loadBalance方法。这些步骤涉及自动配置、FeignClientSpecification的使用、Logger和Builder组件的iapp源码 运行定制以及动态代理的生成。最后,getObject方法返回的是一个接口的代理类,用于执行远程调用。
详细分析:
FeignClientFactoryBean在Spring容器中,通过getObject方法转化为实际的FeignClient实例。首先,它从FeignContext获取相关配置,这个配置在引入OpenFeign依赖时自动注入。接下来,通过getTarget方法,FeignClientFactoryBean配置了Builder组件,如Logger(非Slf4j)、RequestInterceptor、Encoder和Decoder等,同时考虑了用户自定义组件的配置。之后,创建了HardCodedTarget,基于FeignClient接口、注解值和完整URL构建,然后通过loadBalance方法,整合了LoadBalancerFeignClient和HystrixTargeter,进行负载均衡和目标URL定位。
在newInstance方法中,解析了接口方法的注解,生成了MethodHandler,并用FeignInvocationHandler封装,这个InvocationHandler在代理类实例化时被调用,实现了远程调用。最终,ios 源码进阶通过Proxy.newProxyInstance动态生成了代理类,完成FeignClientFactoryBean的实例化过程。
总的来说,FeignClientFactoryBean实例化是通过一系列配置和代理生成,实现了Spring Cloud OpenFeign的远程调用功能。如果你对源码的深入理解感兴趣,下期文章将继续解析调用源码细节。
SpringCloud原理OpenFeign原来是这么基于Ribbon来实现负载均衡的
大家好,本文将深入探讨 SpringCloud 组件原理,特别是 OpenFeign 如何基于 Ribbon 实现负载均衡的机制。在此前的文章中,我们已详细解析了 OpenFeign 动态代理生成原理及 Ribbon 运行机制,如需回顾相关知识,欢迎关注微信公众号 “三友的java日记”,通过菜单栏查看整理内容。接下来,我们将进一步揭示 OpenFeign 与 Ribbon 如何协同工作,实现高效负载均衡。一、Feign 动态代理调用实现 rpc 流程分析
通过了解 Feign 客户端接口的动态代理生成原理,我们得知动态代理基于 JDK 的机制实现,所有方法调用最终通过 InvocationHandler 接口的 ReflectiveFeign.FeignInvocationHandler 实现。接下来,我们将探讨 FeignInvocationHandler 如何执行 rpc 调用。 FeignInvocationHandler 中的 invoke 方法实现关键步骤如下:前几行判断方法是否为 equals、hashCode、toString 等不需要走 rpc 调用的特殊方法。
从 dispatch 获取对应方法的 MethodHandler,然后调用 MethodHandler 的围棋源码英语 invoke 方法。MethodHandler 的生成发生在构建动态代理时。
MethodHandler 是接口的实现类,分为 DefaultMethodHandler(处理接口默认方法)和 SynchronousMethodHandler(实现 rpc 调用)。我们接下来关注 SynchronousMethodHandler 中的 invoke 方法实现。 SynchronousMethodHandler 的 invoke 方法包含关键步骤:构建 RequestTemplate,用于封装构建 HTTP 请求所需的参数,如头信息和 body 等。
调用 findOptions(argv) 方法获取连接超时时间和读超时时间配置。如果没有配置,将使用构建 SynchronousMethodHandler 时传入的参数。
执行重试组件(通常不设置重试逻辑)。
执行 executeAndDecode(template, options),进入此方法后执行 targetRequest,遍历所有请求拦截器(Feign 的扩展点),允许在发送请求前进行参数调整,如添加请求头,这在微服务间鉴权时常用。
之后,构造请求并调用 Client 接口的 execute 方法发送请求,接收响应,并将响应数据封装为所需参数返回给调用方。二、LoadBalancerFeignClient
在理解整个动态代理调用流程后,我们发现关键在于 Client 接口的实现,负责发送 HTTP 请求。那么,Client 是什么?在关于 OpenFeign 动态代理生成的文章中,我们探讨了 Feign 在构建动态代理时填充组件到 Feign.Builder 的过程,其中包含 Client 的实现,但并未在 FeignClientsConfiguration 配置类中找到 Client 对象的声明。这提示我们,Client 实现依赖于负载均衡,是 Feign 整合 Ribbon 的入口。 接下来,我们将聚焦于 Client 的实现,特别是 Feign 如何利用 Ribbon 实现负载均衡。 首先,我们查看 Feign 与 Ribbon 整合的配置类,该类导入了关键配置类。其中,DefaultFeignLoadBalancedConfiguration 配置类声明了 LoadBalancerFeignClient 到 Spring 容器中,传入了 Client 实现、CachingSpringLoadBalancerFactory 和 SpringClientFactory。 LoadBalancerFeignClient 实现了 Client 接口,构建 Feign.Builder 时注入的是这个对象。接下来,我们深入分析构造 LoadBalancerFeignClient 的实现流程。 动态代理调用过程中得出结论,最终会调用 Client 接口的 execute 方法,因此,我们关注 execute 方法的实现。此方法包含一系列操作,从请求 URL 中获取 clientName(服务名),并利用 OpenFeign 构建动态代理时传入的 HardCodedTarget 从 URL 中提取服务名。获取服务名后,LoadBalancerFeignClient 调用 lbClient 方法。 lbClient 方法实现关键步骤,首先从缓存中获取或创建 FeignLoadBalancer,然后利用 CachingSpringLoadBalancerFactory 的 create 方法构建 FeignLoadBalancer。 FeignLoadBalancer 实现关键逻辑,调用 executeWithLoadBalancer 方法处理请求,接收 Response 后直接返回。三、FeignLoadBalancer
FeignLoadBalancer 是关键组件,负责负载均衡和 HTTP 请求的发送。它继承 AbstractLoadBalancerAwareClient,实现了核心功能。 FeignLoadBalancer 的 execute 方法包含关键步骤,直接定位到核心代码行,request.client() 获取注入的 Client 实现,即 Client.Default 类或基于 HttpClient 或 OkHttp 的实现。调用此行代码成功发送 HTTP 请求,接收响应后封装成 RibbonResponse,最终返回给 MethodHandler,解析响应并封装为方法的返回值。总结
通过本文,我们完整解析了 OpenFeign、Ribbon 和 Nacos(或其他注册中心)协同工作原理,涵盖五个关键组件的源码和流程。简而言之,OpenFeign 在进行 rpc 调用时,由于服务所在机器未知,Ribbon 负责从机器列表中选择一个,该列表由注册中心提供。Ribbon 的 ServerList 接口允许注册中心实现,获取服务机器列表。通过这三个组件的协同作用,实现了微服务架构中的高效负载均衡。 本文旨在帮助读者了解微服务架构的基本原理,同时深入理解 OpenFeign、Ribbon 和 Nacos 的源码。如有疑问或交流需求,欢迎关注微信公众号 “三友的java日记” 或添加微信 ZZYNKXJH 联系作者。感谢阅读,期待与您在下篇文章中相遇。微服务实战SpringCloud之Feign简介及使用
在对接第三方系统时,使用硬编码的方式实现对接已显得相对繁琐且效率低下。这里,我推荐使用 Feign 这种更为便捷的方法。Feign 不仅可以轻松地实现服务间的服务调用,还能实现非服务间的 HTTP 调用。然而,这种技术的广泛应用和深入理解在一定程度上依赖于开发者的思想转变。
最新版本的 Spring 框架(Spring 6 的第一个 GA 版本)新增了 HTTP Interface 特性,这使得开发者能够通过定义特定注解标记的方法的 Java 接口来实现 HTTP 请求。这一特性与使用 Feign 进行远程服务调用非常类似,显示了 Spring 在这一领域整合和简化实现的趋势。开发者将能够更加专注于业务逻辑而非底层调用细节。
为了展示这一特性,我将构建一个简单的示例。首先,我们需要创建一个简单的 HTTP 服务。我们可以通过 Spring Boot 工程来实现这个目标。在 Spring Boot 工程中,我们首先定义一个实体类,然后创建一个简单的 Controller 来处理 HTTP 请求。确保在本地地址 http://localhost:/users 可以获取到包含十个用户信息的列表。
接下来,我们将创建一个全新的 Spring Boot 工程。在创建工程时,确保使用的 Spring Boot 版本至少为 3.0.0,以兼容 Spring Framework 6.0 特性。同时,选择 Java 作为最低版本,因为 Spring Framework 6.0 和 Spring Boot 3.0 支持的最低 Java 版本为 。在新工程中,我们需要依赖 Spring Web 和 Spring Reactive Web。
在新工程中,定义一个 HTTP Interface 接口。例如,我们可以创建一个名为 UserApiService 的接口,其中包含一个用于获取用户列表的方法。定义接口后,编写一个测试方法来验证接口的正确性。通过这种方式,我们可以获取到包含用户信息的列表。
此外,HTTP Interface 特性支持多种注解,例如 GetExchange,用于表示执行 HTTP Get 请求。除了 GetExchange,还有其他注解,如 PostExchange、PutExchange 等,它们分别对应于执行不同类型的 HTTP 请求。这些注解位于 spring-web 模块的 org.springframework.web.service.annotation 包下。
在创建 HTTP Interface 实例时,我们通常使用 HttpServiceProxyFactory。通过这个工厂类,我们可以创建接口实例,并进行请求操作。同时,我们也可以将创建过程封装在 @Bean 方法中,以实现实例的注入。
关于代理对象的创建,Spring 目前尚未提供更直观的方法。然而,我们可以从 HttpServiceProxyFactory 的 createClient 方法的源码中看到创建 AOP 代理的相关代码,推测未来版本可能会提供更便捷的注解支持。
除了基础功能,HTTP Interface 还支持多种参数类型和自定义返回值类型。此外,它还支持自定义异常处理机制,这使得开发者在处理 HTTP 请求时更加灵活。
引入 Spring Reactive Web 的依赖是为了支持 HTTP Interface 的实现。在创建代理对象时,我们使用了 WebClient 类型,这是因为 HTTP Interface 的实现主要基于 Reactive Web 模块。未来版本的 Spring 框架预计将提供基于 RestTemplate 的实现,以增加对传统 Web 客户端的支持。