皮皮网

【osg glstudio 源码】【条码标签设计源码】【麦盟科技 源码】feign源码大全

2024-12-23 01:33:31 来源:保存易语言的源码

1.【SpringCloud原理】OpenFeign之FeignClient动态代理生成原理
2.五、声明式服务调用-Feign
3.Feign踩坑记录:JSON parse error
4.Spring Cloud OpenFeign源码FeignClientFactoryBean原理

feign源码大全

【SpringCloud原理】OpenFeign之FeignClient动态代理生成原理

       在SpringCloud框架中,OpenFeign组件提供了基于Java接口的HTTP客户端实现。本文将深入剖析OpenFeign中的FeignClient动态代理生成原理,从@EnableFeignClinets注解的作用、Feign客户端接口动态代理的osg glstudio 源码生成源码剖析以及Feign动态代理构造过程总结三方面进行详细阐述。

       首先,我们来分析@EnableFeignClinets注解的作用。这个注解实际上是整个Feign组件的入口,通过@Import注解导入FeignClientsRegistrar类,该类实现了ImportBeanDefinitionRegistrar接口,当Spring Boot启动时,会调用该类的registerBeanDefinitions方法动态注入bean到Spring容器中。其中,registerFeignClients方法负责扫描带有@FeignClient注解的类,并生成对应的BeanDefinition。

       在Feign客户端接口动态代理的生成源码剖析部分,我们主要关注FeignAutoConfiguration和FeignClientsConfiguration配置类。条码标签设计源码FeignAutoConfiguration是Feign在整个SpringCloud中的配置类,其中会注入一系列FeignClientSpecification对象,并将其封装到FeignContext中,最后将FeignContext注入到Spring容器中。FeignContext是进行配置隔离的关键组件,它内部维护了每个客户端对应的AnnotationConfigApplicationContext、配置类的封装以及父容器等信息。通过这种方法,每个客户端的配置能够在独立的ApplicationContext中进行解析,实现了配置的隔离。

       接着,我们深入解析NamedContextFactory的作用,它用于进行配置隔离,确保Ribbon和Feign的配置能够被独立管理。通过构建独立的ApplicationContext,每个客户端的配置能够在自己的上下文中进行解析,避免了配置冲突。麦盟科技 源码此外,我们还会剖析FeignClientsConfiguration,这是一个默认配置类,其中包含了生成Feign客户端动态代理所需的各种bean,如解析SpringMVC注解的能力、构建动态代理的类等。

       在构建动态代理的过程中,整个流程涉及多个关键步骤:扫描并生成BeanDefinition、注入FeignClientFactoryBean、获取代理对象等。具体而言,当@EnableFeignClinets注解生效时,会扫描所有带有@FeignClient注解的接口并生成对应的BeanDefinition。随后,通过FeignClientFactoryBean重新生成一个bean定义,注册到Spring容器中。当需要获取代理对象时,苹果x开关源码通过FeignClientFactoryBean的getObject方法调用getTarget(),进一步获取到代理对象。整个过程涉及Feign.Builder的配置、组件的获取以及最终通过Feign.Builder构建动态代理对象。

       综上所述,OpenFeign在SpringCloud框架中的实现,通过一系列的注解、配置类以及组件的协作,实现了基于Java接口的HTTP客户端的动态代理生成。从@EnableFeignClinets的注解作用到Feign客户端接口的动态代理生成,再到Feign动态代理的构造过程,整个流程设计精巧,有效提高了服务间的互操作性和可维护性。对于希望深入理解OpenFeign原理的开发者而言,本文提供的分析和总结将有助于更好地掌握这一技术。

       最后,尽管本文已经详细阐述了OpenFeign的金装溯源码动态代理生成原理,但对于Feign与Ribbon的整合以及其他SpringCloud组件的原理,未来将会有更多深入分析的文章。通过本文的总结,希望能为读者提供一个清晰的视角,以便在实际项目中灵活运用OpenFeign实现高效、稳定的远程调用。

五、声明式服务调用-Feign

       Feign 是一款强大的声明式 REST 客户端,用于简化 API 调用过程。它提供了模板化的接口定义,通过注解轻松设置参数、格式和地址,使得远程调用如同调用本地方法般便捷。Spring Cloud 对 Feign 进行了封装,支持 SpringMVC 注解和自定义配置,还可与 Eureka、Ribbon 和 Hystrix 集成,实现负载均衡、熔断机制等高级特性。

       Feign 的核心组件包括:接口定义用于远程调用,注解描述请求信息;Contract 自定义解析注解;Decoder 和 Encoder 分别负责数据编码和解码;ErrorDecoder 处理异常,支持自定义异常返回;Logger 管理日志输出;Client 执行实际的 HTTP 请求,可以扩展使用高性能的 HTTP 客户端;Retryer 实现重试机制;InvocationHandlerFactory 通过动态代理机制执行远程调用。

       使用 Feign,开发者可以通过接口定义、注解标注(如 @RequestLine)轻松调用远程 API,无需关心服务提供者信息。例如,一个简单的 GET 请求示例展示了 Feign 的简洁性:定义接口、添加注解后,直接通过构建的接口对象调用方法获取结果。

       Feign 还支持继承特性,通过抽取公共接口和接口实现,减少代码重复。此外,Feign 还提供拦截器机制,可自定义请求处理逻辑,以及GET请求多参数传递的处理方式。配置上,Feign支持代码和配置文件两种方式,允许调整日志级别和异常解码器,以适应不同场景的需求。

       深入了解 Feign 的源码,可以看到其构建代理类、执行请求、与Hystrix集成等核心流程。通过这些组件和特性,Feign为简化 API 调用提供了强大且灵活的工具。

Feign踩坑记录:JSON parse error

        1.跟踪抛出异常的堆栈,发现在对返回结果的json解析中抛出异常

        2.为什么会解析json失败呢,我们单独调用feign对应的接口是正常的,json也是正常可以解析的

        3.难道feign的处理过返回的内容,又去跟了下fegin处理过程发现从response获取到流并没有任何异常,难道是出在了源头?但是源头又没有任何异常,此时思绪已经混乱,试着在google上查找有没有相关的问题,没想到在feign的github上找到类似问题 /OpenFeign/feign/issues/

        4.问题已然发现,就是响应的内容经过gzip编码,feign默认的Client不支持gzip解码。那么在此跟踪一下feign的源码查看处理过程,从入口 SynchronousMethodHandler 开始,在行开始获取响应内容

        最终在 Logger 的行找到响应流的读取,读取的流程如下:

        5.最终问题出在feign使用默认的HttpURLConnection,并没有经过任何处理,导致读取的是gzip压缩后的内容。此时我们可以将其置换为Httpclient,其内部 ResponseContentEncoding 的 process 方法,取出了Content-Encoding并判断不为空,然后获取对应的处理方式。

        上面所说feign默认的Client不支持gzip解码可能容易引起歧义,应该是fegin默认的Client对响应流不支持对gzip后的字节流进行解析,所以在序列化成对象时会存在解析问题。如果一定要接收可以使用 ResponseEntity<byte[]> 来接收,这样feign就不会对其反序列化了。至于 feign.compression.request.enabled=true , feign.compression.response.enabled=true 配置的内容在 FeignAcceptGzipEncodingInterceptor , FeignContentGzipEncodingInterceptor ,大致可以看出只是在请求头添加了Header而已

        /3/

        spring已添加支持,SpringCloud版升级到Hoxton即可

        /spring-cloud/spring-cloud-openfeign/pull/

        //

        对于仍然存在问题的伙伴,可以直接使用OkHttp设置为feign的客户端(因为okhttp是默认支持gzip压缩),不需要关注spring cloud版本;最简单的方案,也是最推荐的方案。

Spring Cloud OpenFeign源码FeignClientFactoryBean原理

       Spring Cloud OpenFeign的FeignClientFactoryBean在实例化过程中,通过FactoryBean接口实现,GetObject方法的关键步骤包括获取FeignContext、配置Feign.Builder、创建HardCodedTarget和调用loadBalance方法。这些步骤涉及自动配置、FeignClientSpecification的使用、Logger和Builder组件的定制以及动态代理的生成。最后,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在代理类实例化时被调用,实现了远程调用。最终,通过Proxy.newProxyInstance动态生成了代理类,完成FeignClientFactoryBean的实例化过程。

       总的来说,FeignClientFactoryBean实例化是通过一系列配置和代理生成,实现了Spring Cloud OpenFeign的远程调用功能。如果你对源码的深入理解感兴趣,下期文章将继续解析调用源码细节。