Python 官方文档:入门教程 => 点击学习
目录Feign的大体机制@EnableFeignClients 和 @FeignClient 注解reGISterDefaultConfiguration方法registerFeig
Feign 主要是帮助我们方便进行rest api服务间的调用,其大体实现思路就我们通过标记注解在一个接口类上(注解上将包含要调用的接口信息),之后在调用时根据注解信息组装好请求信息,接下来基于ribbon这些负载均衡器来生成真实的服务地址,最后将请求发送出去;之后将接收到的结果反序列化为相关的Java对象供我们直接使用。 下面我们走进spring cloud对feign封装的源码中去了解其主要实现机制。
通过在启动类上标记 @EnableFeignClients 注解来开启feign的功能,服务启动后会扫描 @FeignClient 注解标记的接口,然后根据扫描的注解信息为每个接口类生成feign客户端请求,同时解析接口方法中的spring mvc的相关注解,通过专门的注解解析器识别这些注解信息,以便后面可以正确的组装请求参数,使用 Ribbon 和 Eureka 获取到请求服务的真实地址等信息,最后使用 Http 相关组件进行执行调用。其大致流程图如下:
在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()方法中会读取@EnableFeignClients注解信息,然后将这些信息注册到一个 BeanDefinitionRegistry 里面去;之后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://lsjlt.com/news/127769.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0