一个朋友最近去面试美团,问了一个这样的题目,OpenFeign十大可扩展组件有哪些,虽然看过OpenFeign的源码,但是要我说出10个组件,我还是很难说全,记忆最深的只有 1、日志,2、解码器,3、重试组件,其他的想不起来了。
今天我回顾了下源码,之前看的没有好好记录下来,还是要拿个小本本记下来呀。现在我就把复习OpenFeign原理的过程记录下来。
先找到我之前写的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();
}
AI 代码解读
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);
}
}
AI 代码解读
3、写一个http接口调用FeignClientApi发起远程rpc调用,debug启动开始debug
@RestController
public class FeignTestController {
@Autowired
private FeignClientApi feignClientApi;
@GetMapping( "/test/feign")
public String get() {
return feignClientApi.hello();
}
}
AI 代码解读
4、使用postman触发,查看feignClientApi对象信息
上面的feignClientApi对象变成了一个$Proxy对象,没错OpenFeign使用到了Jdk动态代理技术来实现面向接口式的远程rpc调用
FeignInvocationHandler
就是生成Jdk动态代理必须实现的接口InvocationHandler
子类
FeignInvocationHandler类就负责处理代理请求的逻辑,它把请求转发给dispatch处理。dispatch默认使用SynchronousMethodHandler
来处理,从SynchronousMethodHandler的属性组成就可以看到OpenFeign的十大组件。根据对象结构我整理出一个图,里面就有我们常用的重试器组件,解码组件,日志组件。
这十个组件是真的优秀啊,他们都是可以被我们扩展的,即我们可以选择他的默认实现,也能自己实现他的接口替换默认实现,实力真的强。
既然看到这里了
学习这种框架有好的思路或者画图有好的路子的兄弟们可以评论区留言分享下哦,学习之路不易,感之不尽...