net flix feign 组件剖析
2021-04-12 18:56:22 4 举报
netflix feign 组件剖析
作者其他创作
大纲/内容
构造了一个beanDenifinitionHolder的定义
普通参数配置 每个服务参数配置压缩配置日志配置 调试用
BeanDefinicitonRegistry(BeanDefinitionBuilder )
ServiceA -->192.168.0.100:8080192.168.0.100:8081
ServiceBController
feign动态代理的实现细节
LoadBalanceFeignClient和ribbon 负载均衡的组件
eureka clientserviceA->http://192.168.0.110:8080http://192.168.0.110:8081
解析拿到
读取application.impl 中的feign 打头的一些配置,优先中级
解析Request Mapping 生成地址映射http://serviceA/sayHello/{id}
feigin 组件
解析和,读取spring mvc 注解,解析spring 注解,传入参数生成一个http 请求
实现动态代理创建
RequestInterceptor
完成注册
解析生成真正的请求地址 http://192.168.0.100:8081/sayHello
service Ahttp://192.168.0.110:8080
spring boot启动
读取@RequestBody把对象序列化为json ,设置Request Body的值http://serviceA/sayHellow/1
rule 到的请求地址
扫描@feignClient 标注的接口
sprint boo 是怎么扫描@feignClient?
isCandidateComponent 判断
直接基于元素FeignBuilder+Target 生成代理
如何扫描@feignclient 标注的 接口?
FeignClientRegistrar
SynchronousMethodHandler
HardcodeTarget
未来在spring bean 初始化的时候,会判断FactoryBean类型,生成 serviceA 接口的动态代理 ,注入到 ServiceB Controller 里面调用
完成ServiceAInterface 接口beandenifinition的注入
ServiceAClient#deleteUser(Long)class java.lang.StringDELETE /user/{id} HTTP/1.1
http请求组件
读取application.yml 中的feign 打头的一些服务serviceA配置参数,优先级最高
feign 请求处理机制
解析了一下@EnableFeignClientsdefaultConfiguration
spring 容器中去
FeignContext每一个服务对应的独立容器,里面包含默认组件核心就是一个map =>(服务,容器)
解析ServiceAClinet 接口上的spring mvc 注解
断点调试ReflectiveFeign.FeignInvocationHandler
不是
解析@feignClient 定义的属性配置
将target 传入进去
扫描jar 类包下面的 @feignClient 注解
ribbonIloadBalance 选择server listserviceA->http://192.168.0.110:8080http://192.168.0.110:8081
ServiceA-->192.168.0.100:8081
服务名称ServiceA
ribbonBalanceClient整合ribbon
Slf4jLogger
AnnotationTypeFilter
ServiceClient A接口@FeignClient
完成beandedinitionRegistry
生成
service-a-api(定义接口和bean 类包对外,直接提供使用)
ServiceAClient.SayHello
将服务名称Service A 交给ribbon
RegisterBeanDefinitions方法
是不是HystrixFeignBuilder ?
eureka serverserviceA->http://192.168.0.110:8080http://192.168.0.110:8081
自定义bean 实现拦截(RequestInterceptor)
newInstance(target) 方法生成动态代理
客户端
读取@pathvarivable替换地址栏id解析为http://serviceA/sayHellow/1
FeignContextContract
请求
服务发现
封装成FeignClientFactoryBean
Aop 动态代理
对@fegin 注解标注的 serviceClient A接口实现增强
Retryer
getObject()
ServiceB
将FeignBuilder 里面的组件集在一起
FeignInvocationHandle 拦截
默认创建
loadBalance()创建出来基于ribbon 的动态代理
对每个方法都创建一个SynchronousMethodHandler
HystrixTargeter
SayHello
List<methodmetadata >模板 /delete/1
调试fegin 动态代理怎么处理和接受请求的?
Feign.Builder的构造过程,spring cloud 默认组件和参数
service Ahttp://192.168.0.110:8081
转发给
SpringEncoder
传递Feign.Builder,HardCodedTarget
接口方法映射成methodHandl map 的生成机制
包含
直接用Application 启动类属在的包路径
ServiceAInterface 接口
遍历List<methodmetadata >
LoadBalanceFeignClient
扫描查看 basepackages是否配置feign client 接口 路径
解析处理sayHello请求方法接口生成请求url地址
HardCodeTarget
负载均衡算法选择http://192.168.0.110:8080/sayHellow/1?name=xx & sex=1
@EnableFeignClients配置的basepackage
feigin 运行架构图
SpringMvcContract
自动扫描装载Import feign 配置类
断点调试
扫描启动类包
FeignClient动态代理接实现 seviceClient A接口
feigin demo (CRUD)
@feignClient 注解的接口
DefaultFeignLoggerFactory
FeignLoadBalanceClient
eureka SeverServiceA -->192.168.0.100:8080192.168.0.100:8081
Feign.Builder 就是构建动态代理接口过程
一般不会配置 在@enablefeignClients 里面
feigin 配置
服务注册
FeignClientsRegistrar.registerBeanDefinitions()
HystrixFeign.Builder
选择 8081
jdk 原生生成的动态代理
ServiceAClient 接口的类型 T proxy动态代理
分析FeignClientFacotoryBean 有哪些东西?
读取@RequestParam解析参数值,并在地址做为请求参数解析为http://serviceA/sayHellow/1?name=xx & sex=1
target()负责生成feign 动态代理
接口类型serviceAClient
ServiceAClient 接口类型T proxy的动态代理
eurekaClientServiceA -->192.168.0.100:8080192.168.0.100:8081
请求ServiceAClient.sayHello
methodmetadata
ServiceAClient 接口
ClassPathScanningCandidateComponentProvider组价扫描器
Application启动类的全限定类名
sayHello
返回json 结果,反序列化bean
基于contract组件解析 serviceA接口中定义的方法,知道哪些方法需要你去代理,生成一个 mapnametoHandleserviceA 中每个方法的名称 ->SynchronousMethodHandler
ServiceAcrud
ResponseEntityDecoder
@feign 定义 feign 客户端feignClient 继承
T Proxy 动态代理类
调用
初步拼接请求urlhttp://serviceA
Applicaion 启动类@FeignClients
收藏
收藏
0 条评论
下一页