广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Spring Cloud Feign原理详解
  • 331
分享到

Spring Cloud Feign原理详解

2024-04-02 19:04:59 331人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录Feign的大体机制@EnableFeignClients 和 @FeignClient 注解reGISterDefaultConfiguration方法registerFeig

Feign 主要是帮助我们方便进行rest api服务间的调用,其大体实现思路就我们通过标记注解在一个接口类上(注解上将包含要调用的接口信息),之后在调用时根据注解信息组装好请求信息,接下来基于ribbon这些负载均衡器来生成真实的服务地址,最后将请求发送出去;之后将接收到的结果反序列化为相关的Java对象供我们直接使用。 下面我们走进spring cloud对feign封装的源码中去了解其主要实现机制。

Feign的大体机制

通过在启动类上标记 @EnableFeignClients 注解来开启feign的功能,服务启动后会扫描 @FeignClient 注解标记的接口,然后根据扫描的注解信息为每个接口类生成feign客户端请求,同时解析接口方法中的spring mvc的相关注解,通过专门的注解解析器识别这些注解信息,以便后面可以正确的组装请求参数,使用 Ribbon 和 Eureka 获取到请求服务的真实地址等信息,最后使用 Http 相关组件进行执行调用。其大致流程图如下:

@EnableFeignClients 和 @FeignClient 注解

在EnableFeignClients 注解类中有一个 @Import(FeignClientsRegistrar.class)的配置


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
// 引入FeignClientsRegistrar 来扫描@FeignClient注解下的类
@Import(FeignClientsRegistrar.class)
public @interface EnableFeignClients {
    ...
}

我们追踪代码进入到FeignClientsRegistrar类中,会发现FeignClientsRegistrar 类实现了ImportBeanDefinitionRegistrar(在spring context 项目中)接口,因此Spring Boot启动时会调用它的registerBeanDefinitions()方法,该方法中会扫描 EnableFeignClients 和 FeignClient 注解信息并设置相关信息。



@Override
public void registerBeanDefinitions(AnnotationMetadata metadata
        , BeanDefinitionRegistry registry) {
    // 读取 @EnableFeignClients 注解中信息
    registerDefaultConfiguration(metadata, registry);
    // 扫描所有@FeignClient注解的类
    registerFeignClients(metadata, registry);
}

registerDefaultConfiguration方法

在registerDefaultConfiguration()方法中会读取@EnableFeignClients注解信息,然后将这些信息注册到一个 BeanDefinitionRegistry 里面去;之后feign的一些默认配置将通过这里注册的信息中取获取。

registerFeignClients方法

  • registerFeignClients()方法会扫描相关包路径(如果EnableFeignClients的basePackages没有配置,默认会直接使用启动类所在的包路径)下所有的@FeiginClient注解的类
  • 然后根据@FeiginClient注解信息向BeanDefinitionRegistry里面注册bean,注意这里设置的bean名称生成规则是使用服务名+FeignClientSpecification.class.getSimpleName(),因此如果对一个服务写多个接口类会发生bean名称重复导致注册失败。所以需要增加一个 allow-bean-definition-overriding: true 的配置。
  • 最后会调用 registerFeignClient() 方法注册feign客户端,这里的bean名称的为当前接口类的类路径。

其流程图如下:

feign客户端的动态代理

上面registerFeignClient()方法中在构建bean的时候,实际构建的是FeignClientFactoryBean。


BeanDefinitionBuilder definition = BeanDefinitionBuilder.genericBeanDefinition(FeignClientFactoryBean.class);

FeignClientFactoryBean 类对父类的getObject()方法进行了重写,后面动态代理时使用的就是它来获取feign client的。在这里会根据上面注解配置,同时会读取application.yml配置信息,根据配置来设置feign的相关信息,比如编解码器、注解解析器、请求超时时间等;之后如果没有设置url那么就会和负载均衡器(ribbon)整合。最后会通过反射将接口中相关方法进行解析保存供后面进行jdk代理使用。


@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  // 判断是否是不需要代理的
    if ("equals".equals(method.getName())) {
    try {
      Object otherHandler =
          args.length > 0 && args[0] != null ? Proxy.getInvocationHandler(args[0]) : null;
      return equals(otherHandler);
    } catch (IllegalArgumentException e) {
      return false;
    }
  } else if ("hashCode".equals(method.getName())) {
    return hashCode();
  } else if ("toString".equals(method.getName())) {
    return toString();
  }
  // 需要代理,执行代理方法
  return dispatch.get(method).invoke(args);
}

以上就是Spring Cloud Feign原理详解的详细内容,更多关于Spring Cloud Feign原理的资料请关注编程网其它相关文章!

--结束END--

本文标题: Spring Cloud Feign原理详解

本文链接: https://www.lsjlt.com/news/127769.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring Cloud Feign原理详解
    目录Feign的大体机制@EnableFeignClients 和 @FeignClient 注解registerDefaultConfiguration方法registerFeig...
    99+
    2022-11-12
  • Spring Cloud中Feign的实现原理是什么
    本篇内容主要讲解“Spring Cloud中Feign的实现原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Cloud中Feign的实现原理是什么”吧!目录一、什么是Fei...
    99+
    2023-06-20
  • Spring Cloud原理以及核心组件详解
    目录概述一、业务场景介绍二、Spring Cloud核心组件:Eureka三、Spring Cloud核心组件:Feign四、Spring Cloud核心组件:Ribbon五、Spr...
    99+
    2023-03-21
    Spring Cloud原理详解
  • 【Spring Cloud Alibaba】(二)微服务调用组件Feign原理+实战
    系列目录 【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战 本文目录 系列目录前言什么是RPC?Feign和OpenFeign都是什么?HTTP调用...
    99+
    2023-10-18
    微服务 spring cloud java spring 云原生
  • 详解Feign的实现原理
    目录一、什么是Feign二、为什么用Feign三、实例3.1、原生使用方式3.2、结合 Spring Cloud 使用方式四、探索Feign五、总结一、什么是Feign Feign ...
    99+
    2022-11-12
  • spring cloud oauth2 feign遇到的坑怎么解决
    本篇内容主要讲解“spring cloud oauth2 feign遇到的坑怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“spring cloud...
    99+
    2023-06-29
  • Spring Cloud Ribbon的使用原理解析
    目录一、概述1、Ribbon是什么2、Ribbon能干什么3、Ribbon现状4、未来替代方案5、架构说明二、RestTemplate 用法详解三、Ribbon核心组件IRule四、...
    99+
    2022-11-13
  • Spring Cloud-Feign服务调用的问题及处理方法
    概述: • Feign 是一个声明式的 REST 客户端,它用了基于接口的注解方式,很方便实现客户端配置。 • Feign 最初由 Netflix 公司提供...
    99+
    2022-11-12
  • Spring Cloud的底层架构原理
    本篇内容主要讲解“Spring Cloud的底层架构原理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Cloud的底层架构原理”吧!Eureka首先,我们得说说服务注册中心 Eur...
    99+
    2023-06-19
  • Spring Cloud负载均衡组件Ribbon原理解析
    目录前言一个问题引发的思考Ribbon的简单使用Ribbon 原理分析LoadBalancerAutoConfiguration 自动装配RestTemplateCustomizer...
    99+
    2022-11-13
  • Spring Cloud中使用Feign,@RequestBody无法继承的解决方案
    目录使用Feign,@RequestBody无法继承的问题原因分析解决方案使用feign遇到的问题1、示例2、首次访问超时问题3、FeignClient接口中使用Feign,@Req...
    99+
    2022-11-12
  • Java Spring Cloud 负载均衡详解
    目录1. Ribbon 客户端负载均衡1.1 Ribbon 概述1.2 Ribbon 远程调用1.3 Ribbon 负载均衡1.4 Ribbon 负载均衡策略总结1. Ribbon ...
    99+
    2022-11-12
  • 深度剖析Spring Cloud底层原理
    毫无疑问,Spring Cloud 是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术。不过大多数讲解还停留在对 Spring Cloud 功能使用的层面,其底层的很多原理,很多人可能并不知晓。实际上,Spring Cloud 是一...
    99+
    2023-06-05
  • Spring Cloud Eureka基础应用及原理
    目录Eureka简介搭建Eureka服务注册中心搭建Eureka服务提供者搭建Eureka服务调用者Eureka服务注册和发现Eureka简介 Eureka这个词来源于古希腊语,意为...
    99+
    2022-11-13
  • spring cloud中Feign导入jar失败的问题及解决方案
    目录Feign导入jar失败的问题网上很多人在使用的feign时在pom.xml中填写的是用以下的方式也能够完美导入feignSpringcloudfeign异常报错及解决报错异常如...
    99+
    2022-11-13
  • Spring @Transactional工作原理详解
    本文将深入研究Spring的事务管理。主要介绍@Transactional在底层是如何工作的。之后的文章将介绍:propagation(事务传播)和isolation(隔离性)等属性的使用事务使用的陷阱有哪些以及如何避免JPA和事务管理很重...
    99+
    2023-05-30
  • Spring Cloud原理及核心组件是什么
    本篇内容介绍了“Spring Cloud原理及核心组件是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!概述毫无疑问,Sprin...
    99+
    2023-07-05
  • java Spring的启动原理详解
    目录引入Spring启动过程总结:总结引入 为什么突然说一下Spring启动原理呢,因为之前面试的时候,回答的那可谓是坑坑洼洼,前前后后,补补贴贴。。。 总而言之就是不行,再次看一下...
    99+
    2022-11-13
  • Spring Cloud @EnableFeignClients注解的属性字段basePacka详解
    @EnableFeignClients注解的属性字段basePacka 一般情况下,我们在启动类上面添加了@EnableFeignClients注解就是表明当前应用服务(我们称之为服...
    99+
    2022-11-12
  • Spring Cloud 中@FeignClient注解中的contextId属性详解
    目录@FeignClient注解中的contextId属性解决方法一解决方法二FeignClient注解及参数问题问题背景解决办法@FeignClient注解中的contextId属...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作