面试官:OpenFeign十大可扩展组件你知道哪些?

简介: 这篇文章是关于OpenFeign框架的可扩展组件的讨论,作者分享了自己在面试中遇到的相关问题,并回顾了OpenFeign源码,列出了十大组件,包括日志、解码器、重试组件等,并展示了如何使用FeignClient注解和@EnableFeignClients注解来实现远程RPC调用。

一个朋友最近去面试美团,问了一个这样的题目,OpenFeign十大可扩展组件有哪些,虽然看过OpenFeign的源码,但是要我说出10个组件,我还是很难说全,记忆最深的只有 1、日志,2、解码器,3、重试组件,其他的想不起来了。

image.png

今天我回顾了下源码,之前看的没有好好记录下来,还是要拿个小本本记下来呀。现在我就把复习OpenFeign原理的过程记录下来。

image.png

先找到我之前写的feign调用demo项目

1、这是之前学习openfeign源码写的demo,客户端接口使用FeignClient注解标记,记得添加jar依赖 spring-cloud-starter-netflix-eureka-client

@FeignClient(contextId = "feignServer", name = "feignServer")
public interface FeignClientApi {
   
   

@GetMapping("/hello/feign")
String hello();
}

2、启动类使用EnableFeignClients注解标记开启feign功能


@SpringBootApplication(scanBasePackages = {
   
   "cn.supfox"}, exclude = DataSourceAutoConfiguration.class)
@EnableEurekaClient
@EnableFeignClients(basePackages = {
   
   "cn.supfox"})
public class EurekaClientApp {
   
   
public static void main(String[] args) {
   
   
    SpringApplication.run(EurekaClientApp.class, args);
}
}

3、写一个http接口调用FeignClientApi发起远程rpc调用,debug启动开始debug


@RestController
public class FeignTestController {
   
   

@Autowired
private FeignClientApi feignClientApi;

@GetMapping( "/test/feign")
public String get() {
   
   
    return feignClientApi.hello();
}
}

4、使用postman触发,查看feignClientApi对象信息

image.png

上面的feignClientApi对象变成了一个$Proxy对象,没错OpenFeign使用到了Jdk动态代理技术来实现面向接口式的远程rpc调用 image.png

FeignInvocationHandler就是生成Jdk动态代理必须实现的接口InvocationHandler子类

FeignInvocationHandler类就负责处理代理请求的逻辑,它把请求转发给dispatch处理。dispatch默认使用SynchronousMethodHandler来处理,从SynchronousMethodHandler的属性组成就可以看到OpenFeign的十大组件。根据对象结构我整理出一个图,里面就有我们常用的重试器组件,解码组件,日志组件。

image.png

这十个组件是真的优秀啊,他们都是可以被我们扩展的,即我们可以选择他的默认实现,也能自己实现他的接口替换默认实现,实力真的强。

image.png

既然看到这里了

image.png

学习这种框架有好的思路或者画图有好的路子的兄弟们可以评论区留言分享下哦,学习之路不易,感之不尽...

相关文章
|
Android开发 缓存 双11
android的基础ui组件,Android开发社招面试经验
android的基础ui组件,Android开发社招面试经验
android的基础ui组件,Android开发社招面试经验
|
存储 运维 关系型数据库
2024年最全ceph的功能组件和架构概述(2),Linux运维工程面试问题
2024年最全ceph的功能组件和架构概述(2),Linux运维工程面试问题
2024年最全ceph的功能组件和架构概述(2),Linux运维工程面试问题
|
负载均衡 监控 Java
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
22441 7
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
|
JavaScript API
【Vue面试题十】、Vue中组件和插件有什么区别?
这篇文章阐述了Vue中组件和插件的区别,指出组件主要用于构建应用程序的业务模块,而插件用于增强Vue本身的功能,两者在编写形式、注册方式和使用场景上有所不同。
【Vue面试题十】、Vue中组件和插件有什么区别?
|
存储 JavaScript 容器
【Vue面试题十一】、Vue组件之间的通信方式都有哪些?
这篇文章介绍了Vue中组件间通信的8种方式,包括`props`传递、`$emit`事件触发、`ref`、`EventBus`、`$parent`或`$root`、`attrs`与`listeners`、`provide`与`inject`以及`Vuex`,以解决不同关系组件间的数据共享问题。
|
消息中间件 Kafka API
面试题Kafka问题之RabbitMQ的扩展和二次开发如何解决
面试题Kafka问题之RabbitMQ的扩展和二次开发如何解决
122 1
|
设计模式 存储 安全
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
134 1
|
监控 Java 应用服务中间件
SpringCloud面试之流量控制组件Sentinel详解
SpringCloud面试之流量控制组件Sentinel详解
620 0
|
JavaScript 前端开发
面试题分享之封装一个弹框组件
面试题分享之封装一个弹框组件
93 0
|
设计模式 前端开发 网络协议
面试官:说说Netty的核心组件?
Netty 核心组件是指 Netty 在执行过程中所涉及到的重要概念,这些核心组件共同组成了 Netty 框架,使 Netty 框架能够正常的运行。 Netty 核心组件包含以下内容: 1. 启动器 Bootstrap/ServerBootstrap 2. 事件循环器 EventLoopGroup/EventLoop 3. 通道 Channel 4. 通道处理器 ChannelHandler 5. 通道管道 ChannelPipeline 这些组件的交互流程如下: ![image.png](https://cdn.nlark.com/yuque/0/2024/png/92791/1716
127 0
面试官:说说Netty的核心组件?