Feign的调用原理及其源码分析

  • 目录
    • 概述
      • 架构特性
    • 设计思路
    • 实现思路分析
      • Feign是如何进行服务调用的
    • 拓展实现
      • 相关工具如下:
      • 实验效果:(解决思路)
    • 分析:
  • 小结:
  • 参考资料和推荐阅读

LD is tigger forever,CG are not brothers forever, throw the pot and shine.
Modesty is not false, solid is not naive, treacherous but not deceitful, stay with good people, and stay away from poor people.
talk is cheap, show others the code,Keep progress,make a better result.

目录

概述

Feign的调用原理及其源码分析
1.Feign Client 如何被加载到 Spring 中的
2.Fegin接口代理对象是如何交给Spring管理的
3.Feign是如何进行服务调用的
4.是如何整合Ribbon实现负载均衡的

架构特性

定义好接口,在integration层的接口中,用@FeignClient进行注解

设计思路

在Application入口,用@EnableFeignClients注解。

实现思路分析

先从注解 @EnableFeignClients 入手。其有一个@Import注解,引入的是FeignClientsRegistrar。从名字可看出,他应该就是把FeignClient注解的对象注入到Spring容器的类。

看其对接口ImportBeanDefinitionRegistrar的实现:

@Override
public void registerBeanDefinitions(AnnotationMetadata metadata,BeanDefinitionRegistry registry) {registerDefaultConfiguration(metadata, registry);registerFeignClients(metadata, registry);
}

方法registerDefaultConfiguration是将EnableFeignClients的默认配置进行注入,如果有的话。
方法registerFeignClients就是对所有有FeignClient注解的类进行注入的过程。
我们知道FactoryBean是Bean的工厂,在获取Bean的实例的时候,实际是调用FactoryBean.getObject来得到的。
上面是对Url进行处理的过程。最下面Targeter.target最终是上面是对Url进行处理的过程。最下面Targeter.target最终是调用了Feign.newInstance(Target)。

Feign是如何进行服务调用的

Spring Cloud Feign 默认使用 HTTP 的形式进行远程服务调用。
服务provider 9527 提供接口/hello/{name}
服务consumer 9528 调用 服务provider的 hello/{name} 接口
服务consumer 通过 RestTemplate 发起 HTTP 请求调用服务 provider 接口代码如下:

@RequestMapping("/feign/hello/{param}")
public Object hello(@PathVariable String param,) throws InterruptedException {return  restTemplate.getForObject("http://localhost:9527/hello/" + param,String.class);
}

:使用 Feign 进行远程调用,只需定义一个 Feign 客户端,通过调用方法的形式,便可完成远程接口调用。

Feign Client 进行服务间调用分为几个步骤:

1、Spring 根据 扫描包中 使用了注解 @FeignClient 的 Feign Client 。将 Feign Client 信息抽象成为 BeanDefinition 并注册到 Spring 中。
2、在使用 @Autowired 注入 Feign Client 时,触发依赖注入,根据 Feign Client 的 BeanDefinition 信息,实例化 Feign Client ,并生成代理对象, 并放入 IOC 容器中。
3、执行调用是,调用 Feign Client 的代理对象 ReflectiveFeign.FeignInvocationHandler 的 invoke() 方法。该方法经过一系列调用拼装 RequestTemplate 请求对象,并发送请求调用,获取响应。

拓展实现

无,

相关工具如下:

实验效果:(解决思路)

分析:

小结:

主要讲述了一些Feign的调用原理及其源码分析的负载均衡,里面有许多不足,请大家指正~

参考资料和推荐阅读

1.链接: 参考资料.
2.链接: 参考资料.

Feign的调用原理及其源码分析相关推荐

  1. ConcurrentHashMap实现原理及源码分析

    ConcurrentHashMap是Java并发包中提供的一个线程安全且高效的HashMap实现(若对HashMap的实现原理还不甚了解,可参考我的另一篇文章HashMap实现原理及源码分析),Con ...

  2. concurrenthashmap_ConcurrentHashMap实现原理及源码分析

    ConcurrentHashMap是Java并发包中提供的一个线程安全且高效的HashMap实现(若对HashMap的实现原理还不甚了解,可参考我的另一篇文章HashMap实现原理及源码分析),Con ...

  3. 深入理解Spark 2.1 Core (十一):Shuffle Reduce 端的原理与源码分析

    我们曾经在<深入理解Spark 2.1 Core (一):RDD的原理与源码分析 >讲解过: 为了有效地实现容错,RDD提供了一种高度受限的共享内存,即RDD是只读的,并且只能通过其他RD ...

  4. 深入理解Spark 2.1 Core (十):Shuffle Map 端的原理与源码分析

    在上一篇<深入理解Spark 2.1 Core (九):迭代计算和Shuffle的原理与源码分析>提到经过迭代计算后, SortShuffleWriter.write中: // 根据排序方 ...

  5. 深入理解Spark 2.1 Core (八):Standalone模式容错及HA的原理与源码分析

    第五.第六.第七篇博文,我们讲解了Standalone模式集群是如何启动的,一个App起来了后,集群是如何分配资源,Worker启动Executor的,Task来是如何执行它,执行得到的结果如何处理, ...

  6. 深入理解Spark 2.1 Core (七):Standalone模式任务执行的原理与源码分析

    这篇博文,我们就来讲讲Executor启动后,是如何在Executor上执行Task的,以及其后续处理. 执行Task 我们在<深入理解Spark 2.1 Core (三):任务调度器的原理与源 ...

  7. 深入理解Spark 2.1 Core (六):Standalone模式运行的原理与源码分析

    我们讲到了如何启动Master和Worker,还讲到了如何回收资源.但是,我们没有将AppClient是如何启动的,其实它们的启动也涉及到了资源是如何调度的.这篇博文,我们就来讲一下AppClient ...

  8. spring源码分析第五天------springAOP核心原理及源码分析

    spring源码分析第五天------springAOP核心原理及源码分析 1. 面向切面编程.可以通过预 编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术 切面(A ...

  9. Linux中mknod命令实现原理以及源码分析

    本篇文章以mknod创建字符设备文件进行讲解 字符设备驱动的Demo例子可参考该篇文章 Linux 编写简单驱动并测试 1. mknod 命令 mknod /dev/hello c 520 0 该命令 ...

最新文章

  1. docred数据集情况笔记
  2. java中memcached
  3. Nature news: 未来40年,DNA测序将走向何方?
  4. 清华大学王建民:在大数据的思维下,人人都是冰冷的数据包?
  5. 计算机电缆的屏蔽,DJYVP计算机电缆(总屏蔽)和DJYPVP计算机电缆(分屏蔽加总屏蔽)区别...
  6. FPGA之道(70)提高设计的综合性能(二)提高设计的自测性
  7. 3.递归猴子吃桃问题
  8. 2.2_ 4_ FCFS、SJF、 HRRN调度算法
  9. 总结---Django部分
  10. 基于JAVA的企业OA办公系统
  11. Mac电脑删除某个分区
  12. 2022年甘肃省安全员B证判断题及在线模拟考试
  13. SQL中OVER(PARTITION BY)详解
  14. 【BIEE】15_时间维度建立
  15. 电子凸轮追剪曲线生成算法 算法,理解后可转成其他品牌PLC或任何一种编程语言
  16. 如何理解数学公式中出现的极大极小minmax含义
  17. 免费影视资源如何引流?如何通过分享影视资源引流
  18. 阿里云服务器CentOS部署Minio服务实现远程访问
  19. 视频教程-仿淘宝客户端电商平台android初级速成-Android
  20. [UVA 10635] Prince ans Princess

热门文章

  1. 【Python】用python将html转化为pdf
  2. html js获取图片高度,js获取Html元素的实际宽度高度
  3. python3.6.8安装LAC报错
  4. python基础:def函数
  5. c# 动态解析json字符串
  6. 网络编程 read 阻塞和非阻塞下的区别
  7. PotPlayer播放器中英双字幕设置
  8. linux中的setenv函数用法
  9. python pyc文件是啥_什么是.pyc文件
  10. 编译iproute命令为ip库