feign核心流程图
2021-12-14 19:03:36 0 举报
feign
作者其他创作
大纲/内容
遍历type的method
参数
RibbonRequest
create
ServiceA的动态代理
feign客户端动态代理实现类
初始化注册beanDefinitions
FeignClientFactoryBean
FeignContext
ServiceA对应的方法处理器集合
FeignLoadBalancerIClientConfigILoadBalancerServerIntrospector
loadBalance
调用ServiceA
FeignAutoConfiguration初始化一系列的组件
dispatch= methodToHandlertarget=HardCodedTarget
invoke(请求参数)
将当前@FeignClient的所有原数据信息及配置,注册到容器中
将每个feign客户端的配置信息放入
ILoadBalancer实现类 ZoneAwareLoadBalancer与eureka整合见Ribbon核心流程图分析
1、构建了一个SynchronousMethodHandler.Factory,2、基于同步方法处理器工厂构建了一个ParseHandlersByName,3、基于InvocationHandlerFactory、QueryMapEncoder、ParseHandlersByName构建了一个ReflectiveFeign
返回结果
submit
调用feign接口
注册
循环遍历包信息,找出满足条件的isCandidateComponent是为了找出带有注解的非内部类
创建一个适合ribbon请求的对象
GET http:///user/sayHello/1?name=张三age=20 HTTP/1.1
RequestInterceptors
将该接口注册到spring
构建FeignLoadBalancer
基于Contract组件(spring mvc)解析服务的方法解析例如:DELETE /user/1 HTTP/1.1
选择server
放入上下文中
从请求url中剔除ServiceA
注册FeignClients
在这里就构造进去了
feign客户端配置
返回
HardCodeTaget
feign的上下文
FeignClientsRegistrar.registerBeanDefinitions
动态代理对象
将每个feign客户端(一个项目一个)的配置信息放入
FeignInvocationHandler.invoke
Retryer
调用者
@EnableFeignClients这里是在Springboot启动类fegin关键的配置
LoadBalancerFeignClient
feign客户工厂端
FeignClient的动态代理创建
getObject()->getTarget()
构建一个LoadBalancerCommand该类中构建了重试处理器RequestSpecificRetryHandler
使用该feign的类中
configureFeign根据是否取默认的配置还是每个feign客户端专用的配置去给builder设置。如果有自己专有的就用自己的覆盖默认的,如果用默认的就用默认的覆盖自己专有的
获取ILoadBalancer,并选择serverZoneAwareLoadBalancer实现类选择server的逻辑见ribbon
\"configuration\" -> {Class[0]@6711} \"contextId\" -> \"bgAuths\"\"decode404\" -> {Boolean@6715} false\"fallback\" -> {Class@6717} \"void\"\"fallbackFactory\" -> {Class@6717} \"void\"\"name\" -> \"users\"\"path\" -> \"/sign/ep\"\"primary\" -> {Boolean@6724} true\"qualifier\" -> \"\"\"serviceId\" -> \"\"\"url\" -> \"\"\"value\" -> \"users\"
注入
在client.execute执行完成之后处理返回结果
创建动态代理实例传递HardCodedTarget
创建一个FeignLoadBalancer放入缓存,key为ServiceA这里会根据服务名称创建IClientConfig、ILoadBalancer、ServerIntrospector,并放入到FeignLoadBalancer
创建Service客户端的配置
配置feign
executeAndDecode
Targeter没有接入配置Hystrix,则默认使用DefaultTargeter
从FeignContext中获取一个Targeter
该接口使用该feign
Request request = targetRequest(template);将请求拦截器加到RequestTemplate上,并且为该请求拼接http,而服务名在HardCodeTarget中存在GET http://ServiceA/user/sayHello/1?name=张三age=20 HTTP/1.1
获取@EnableFeignClients注解的信息
通常来说我们不会为每个feign客户端配置固定的url
在我们的项目中是配置了basePackages属性值以及自定了defaultConfiguration属性值这里的值是为了给Fegin获取需要扫描注解的包所存在,以及编解码所存在name default.com.biaoguoworks.demeter.crm.SpringBootStartApplication
从spring容器中取出Feign上下文
registerFeignClients扫描对应包下面的@FeignClient注解的接口,没有包则是启动类同包及子包的接口
从缓存中获取
nameToHandler.get(method)获取到MethodHandler(SynchronousMethodHandler)
configurationsList<FeignClientSpecification>
client.execute
IClientConfig
获取@FeignClient注解的元数据
Spring容器
ServiceA的invoke方法
放入缓存
registerFeignClient
注册feign客户端的核心逻辑
FeignContext每个服务都对应着一个独立的spring容器,核心是一个map的结构
根据请求参数创建一个RequestTemplateRequestTemplate.Factory.create(args)GET /user/sayHello/1?name=张三age=20 HTTP/1.1
获取最大重试数量、最大重试下一次数量
Feign.Builder#target
实际只使用了Feign.Builder、HardCodedTarget
ReflectiveFeign.newInstance
缓存不存在
接口
feign构建一个Feign.Builder将FeignContext中的编解码器和Contract封装到Builder中
通过调用的方法名称获取对应的方法handler
http请求
使用JDK动态代理创建feign的动态代理对象
构建Feign.Builder
Feign.Builder
builder
executeWithLoadBalancer
LoadBalancerContext.getServerFromLoadBalancer传入uri和key
这个就是feign客户端接口的动态代理实现机制,传入:FeignClientFactoryBeanFeign.BuilderFeignContextHardCodedTarget
0 条评论
回复 删除
下一页