目录
2.@Import的注解的作用,springboot的自动装配原理里面就有这个
前言
OpenFeign是是一个基于Http协议的RPC组件
1.如果你以前在工作中经常碰到feign调不通,日志还看不出什么原因
2.如果你不知道怎么扩展服务与服务之间的调用feign,服务间的接口签名等
3.如果你发现服务与服务间的断路器不起作用,还找不到原因
这篇文章能帮助你从底层源码了解feign内部是怎么实现的,相信看完这篇文章,在工作中碰到的服务间的调用问题,就不再是问题
一、调用关系型图
二、了解此文时,需要掌握的知识点
1.factoryBean的作用
FactoryBean是一个工厂Bean,可以生成某一个类型Bean实例,它最大的一个作用是:可以让我们自定义Bean的创建过程。FactoryBean本质就是用来给我们实例化、或者动态的注入一些比较复杂的Bean,比如像一些接口的代理对象
public interface FactoryBean<T> {
String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";
@Nullable
T getObject() throws Exception;
default boolean isSingleton() {
return true;
}
}
当我们执行applicationContext.getBean(FactoryBeanService.class);最终会走到getObject方法
2.@Import的注解的作用,springboot的自动装配原理里面就有这个
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(FeignClientsRegistrar.class)
public @interface EnableFeignClients {
String[] value() default {};
String[] basePackages() default {};
Class<?>[] basePackageClasses() default {};
Class<?>[] defaultConfiguration() default {};
Class<?>[] clients() default {};
}
3.jdk动态代理
动态代理是通过创建代理对象,在不改变原有代码的基础上,给程序增加新的功能,实现了程序的功能增强
InvocationHandler handler = factory.create(target, methodToHandler);
T proxy = (T) Proxy.newProxyInstance(target.type().getClassLoader(),
new Class<?>[] {target.type()}, handler);
三、进入源码
1.项目启动初始化相关资源,将代理对象初始化
2.方法调用
总结
1.解读源码,需要有自己的方式方法,本人一般先脉络后细节,直接idea查看调用链,然后分析里面用到的知识点
2.openFeign分为两步,第一步是通过解析注解,组装动态代理对象,代理对象里面包含了Map<Method, MethodHandler> dispatch,第二部当调用目标对象时,实际上调用的是代理对象,代理对象从dispatch里面获取到methodHandler,然后调用发送http请求框架,发送请求
3.RequestInterceptor此接口为请求发送前拦截器,用来做个性化需求