Feign源码分析
2025-02-26 14:26:13 0 举报
此图是我对Feign源码的理解,供大家学习交流
作者其他创作
大纲/内容
name
1.实例化Feign上下文对象FeignContext
注册FeignClientSpecification类型的bean, beanName:default.bat.ke.qq.com.feignconsumer.FeignconsumerApplication.FeignClientSpecification
BeanDefinition数据结构
注册 {微服名}.FeignClientSpecification类型的beanbeanname: service-feign-provider.FeignClientSpecification
ZoneAwareLoadBalancer#chooseServer
Spring容器启动
ImportBeanDefinitionRegistrar
url
Rxjava 观测者模式:Observable/Observer
FactoryBean#getObject
FeignClientsConfiguration
将feign的配置类设置到feign的容器当中
FeignContext
判断是否引入classname: feign.hystrix.HystrixFeign存在:HystrixTargeter不存在: DefaultTargeter
ReflectiveFeign#newInstance
beanClass
bat.ke.qq.com.feignapi.api.MyOrderFeignApi
fallback
解析@EnableFeignClients属性,注册FeignClientSpecification类型的bean
FeignClientsRegistrar
this.applicationContext.getBean(FeignContext.class)
Feign集成Hystrix
获取到LoadBalancerFeignClient,用于feign调用
默认:Feign.builder().retryer(retryer)整合hystrix: HystrixFeign.builder()
Observable<T> call(Server server)
Client
type
LoadBalancerFeignClient#execute
http://{name}/path
implements
service-feign-provider
FeignClientFactoryBean
Fegin上下文,包括FeignClientSpecification列表
解析@EnableFeignClients属性
@Import
url: http://{name}/path
HystrixTargeter
FeignClientFactoryBean implements FactoryBean通过FactoryBean将Feign接口交给Spring容器管理
feign接口对应的代理类
作为代理逻辑入参
FactoryBean
path
getObject()
@FeignClient
生成
PropertyValues
指定fallback方法
@EnableFeignClients
实现
/order
doCreateBean
jdk动态代理
扫描@FeignClient修饰的接口,注册为FeignClientFactorybean
Targeter
获取代理对象
默认: Default整合ribbon:LoadBalancerFeignClient
@Bean
FeignClientFactorybean
getTarget()
调用feign的接口时通过代理类会调用Client#execute
@FeignClient修饰的接口,封装为FeignClientFactorybean,注册到Spring容器
2.生成builder对象,用来生成feign
调用ribbon实现负载均衡
url如果为空,则默认走Ribbon代理@FeignClient(name = \"service-order\")如果不为空,指定url,则走默认生成代理类的方式@FeignClient(name = \"service-order\
FeignLoadBalancer#execute
FeignAutoConfiguration
Feign.Builder builder = feign(context)
Client.Default#execute
FeignAutoConfiguration
AbstractApplicationContext#refresh
FeignLoadBalancer
getObjectFromFactoryBean
LoadBalancerFeignClient
GenericBeanDefinition
Feign.Builder

收藏

收藏
0 条评论
下一页