Feign架构图
2021-04-24 15:49:56 0 举报
登录查看完整内容
Feign架构图
作者其他创作
大纲/内容
扫描所有打了@FeignClient的接口
LoadBalancerFeignClient
FeignContext中获取
RequestGET http://clientA/user/sayHello/1?name=andong&age=20 HTTP/1.1
FeignClientsRegistrar
FeignLoadBalancer
User
使用打了@EnableFeignClients注解的类的包路径(一般都是启动类的包路径)
响应
Slf4jLogger
注册
根据Target里初步的URL,以及RequestTemplate等信息,封装真正的请求对象
candidateComponents
SpringMvcContract
传递
SynchronousMethodHandler.Factory
SpringDecoder
否
接口中方法的元数据(MehtodMetadata)
接口类型ServiceClientA
将注解参数defaultConfiguration,我们指定的配置类,构建成一个BeanDefinition
@FeignClient注解过滤器
是否开启HystrixFeign
根据请求参数构造请求的模版
PollingServerListUpdater30s更新一次server list
nameToHandler(方法名:MethodHandler)ServiceAClient#getById(Long) -> {SynchronousMethodHandler@6882} ServiceAClient#createUser(User) -> {SynchronousMethodHandler@6884}
应用启动
FeignContext
SpringEncoder
DomainExtracting server list192.168.3.17192.168.3.27
初步拼接请求URLhttp://clientA
组装
ServiceClientA接口
扫描
RequestTemplateGET /user/sayHello/1?name=numbpad&age=20 HTTP/1.1
反射获取Target中接口的所有方法,和nameToHandler,构造出来一个methodToHandler
用户
Proxy#newProxyInstance最终实现了ServiceAClient接口的动态代理,T proxy,这个代理的调用全部由FeignInvocationHandler拦截
ServiceAClient#getById(Long)
扫描符合注解过滤器条件的组件,然后将组件构建成BeanDefinition
注册默认配置
FeignInvocationHandler
HystrixTarget#target()
192.168.3.27
methodToHandler(method对象:MethodHandler)ServiceAClient#getById(Long)的method对象 -> {SynchronousMethodHandler@6882} ServiceAClient#createUser(User)的method对象 -> {SynchronousMethodHandler@6884}
host服务名(clientA)
FeignLoggerFactory
ServiceA192.168.3.17
对Controller中的FeignClient组件进行自动装配
ILoadeBalancer
ZoneAwareILoadBalancer
用户请求Controller接口,ServiceAClient调用sayHello方法
ReflectiveFeign
InvocationHandlerFactory
BeanDefinitionRegistry(Bean定义的注册表)
看看@EnableFeignClients中是否配置了包路径
Retryer
Feign.Builder
loadBalance()方法创建Ribbon的动态代理
CachingSpringLoadBalancerFactory
组件扫描器
HardCodedTarget
配置优先级:1、服务相关配置2、default相关配置3、ConfigurationBean中的配置
SynchronousMethodHandler
request options请求超时时间(连接超时10s,读超时60s)
Logger
直接基于Feign.Builder中的所有信息构建出来一个
FeignLoadBalancer#execute()方法发起网络请求connect超时默认10s,read超时默认60s
服务名clientA
组件的BeanDefintion
解析
根据server的host+port生成最终请求URL地址http://192.168.3.17:8100/user/sayHello/1?name=numbpad&age=20
Feign客户端配置
将注解参数configuration,我们指定的客户端配置类,构建成一个BeanDefintion
创建真正的实现了InvocationHandler接口处理业务逻辑的对象
ServerOperation#call()方法针对server发起请求
Eureka Client
拿到BeanDefinition,调用FactoryBean#getObject()
LoadBalancerFeignClient(Ribbon相关,负载均衡)
IRule#chooseServer()选择了最终的server
被拦截
eureka server
处理注解的参数
clientA -> FeignContext-clientAclientB -> FiegnContext-clientB
@EnableFeignClients
调用newInstance()方法
默认是否,除非你手动开启
注册FeignClients
ServiceA192.168.3.27
包路径com.numbpad.service
cache
application.yml
http://localhost:8300/sayHello/1?name=numbpad&age=20
获取注解的参数
读取
如果与Hystrix整合这里就是HystrixInvocationHandler
请求
LoadBalanceFeignClient
打了@FeignClient注解的接口
获取客户端对应的FeignContext(没有就创建)
RequestInterceptor
接口中的每个方法都会重复此步骤
解析FeignClient注解参数
0 条评论
回复 删除
下一页