Fegin和Hystrix的整体请求流程
2020-12-01 13:54:21 4 举报
接收请求后ribbon、fegin和hystrix的请求处理源码分析
作者其他创作
大纲/内容
Feign
初始化FeignLoadBalancer
最近的一个时间窗口(默认 10s)总得请求次数 > 20 默认请求比例:请求了25次,但是18次失败,这时候的75% > 默认50%,触发熔断
获取http请求包装类:RibbonRequestFeignLoadBalancer$RibbonRequest
Proxy
return HystrixInvocationHandler.this.dispatch.get(method).invoke(args);
Eureka Serverbosp-cfca-service ->192.168.2.87:54001192.168.2.87:54002
读取参数信息默认的超时时间都是60秒connectTimeout:60000readTimeout : 60000
AbstractCommand246
是
AbstractLoadBalancerAwareClient#executeWithLoadBalancer
retryer :重试
2
获取到返回数据
Response 返回
execute
lbClientFactory.create(clientName)
超时
build().newInstance(target)
SynchronousMethodHandler
重要
fallback
ReflectiveFeign
1、扫描 EnableFeignClients 路径2、扫描路径下的标注了@FeginClient 的class
Client # Response
new
返回
newInstance
reconstructURIWithServer
http://bosp-cfca-service/getMember?userId=00001
chooseServer
如果在你设置的超时时间内执行完成返回结果
URI asUri : http://bosp-second-thirdparty-service/cfca/marketOrderPayclientName : bosp-second-thirdparty-serviceuriWithoutHost :http:///cfca/marketOrderPayFeignLoadBalancer.RibbonRequest
HystrixFeign$Build
@FeginClient
SynchronousMethodHandler#invoke
TimerListener
submit
可查看 : https://blog.csdn.net/songhaifengshuaige/article/details/80489460
ResponseEntityDecoder
invoke
1、获取ribbon的ILoadBalancer2、拼装初始化http地址3、获取请求返回
不再执行
EurekaServerIntrospector
创建代理类、Proxy.newProxyInstance
User getUser(@RequestParam String userId)
是否有缓存
最终请求地址
Server
http://bosp-cfca-service/getMember?userId=?
corePoolSize 核心线程: 10maximumPoolSize 最大线程: -1keepAliveTime 存活时间:1
FeignClientFactoryBean#getObject
return
返回结果
1
client: LoadBalancerFeignClient
拼装name请求
间隔时间就是你的超时时间,默认是1000ms,也就是你设置的多久超时,他就多久执行这个
否
默认是5秒后尝试释放一次请求成功:关闭熔断,重新对metricet订阅失败:继续熔断,更新熔断时间戳
成功
HystrixTimer.getInstance().addTimerListener(listener)
end
设置请求头等属性,自定请求拦截器需要实现 feign.RequestInterceptor 接口
替换ip地址完成最终的请求地址拼装
选择service、拼装请求地址发送http请求、获取返回值
GET /getMemberAll?userId=1 HTTP/1.1
fallback、fallbackFactory 区别 -- 看右边☞
注入FeignClientFactoryBean
put
EnableFeignClients
loadBalance
IRule
@RequestMapping(value = \"/getMember\
这里就是fegin单独使用fegin-core
FactoryBean
factory : HystrixFeign$Buildtarget:如下methodToHandler(如上)
超时逻辑commadn的timeout ==> TIMED_OUT抛出 TimeoutExcetion
CachingSpringLoadBalancerFactory
调用方法
获取 client
Feign.builder
降级机制fallback
HystrixInvocationHandler
bosp-cfca-service192.168.2.87:54002
queueSize
listener.tick()
FeignClientsRegistrar
metricet统计信息
请求报错
构建 hystrixCommand
ScheduledThreadPoolExecutor线程池大小 : 4
封装spring的BD信息
run()
读取@RequestBody 、
key:Methodvalue:SynchronousMethodHandler
重试
DynamicServerListLoadBalancer
Hystrix
30s
初始化属性 client信息
( 不支持队列,满了之后直接拒绝)
判断超时
LoadBalancerFeignClient
HystrixTargeter
Fegin 核心机制
getMetadata
获取 fallback 实现类
未配置url获取name
DiscoveryEnabledNIWSServerList从ServerList 中读取服务实例信息bosp-cfca-service ->192.168.2.87:54001192.168.2.87:54002
build设置client
DomainExtractingServerListbosp-cfca-service ->192.168.2.87:54001192.168.2.87:54002
拼装请求
getFallback
配置url
Request = targetRequest(template)
controller
ZoneAwareLoadBalancer
判断熔断
HystrixObservableTimeoutOperator
构造 LoadBalancerCommand
获取@FeginClient的注解属性
读取 @FeignClient 和 @RequestMapping生成请求的url地址
IClientConfig
create
return
初始化属性,一堆
JDK的动态助理,主要的是Handle
填充数据参数 0001
queue().get()
循环执行拦截器 InterceptorRequestInterceptor
cache
build是否是集成的 Hystrix
User
HystrixFeign.builder 继承 Feign.builder
HystrixInvocationHandler#
默认一个 group key一个线程池 ,也就是一个服务用同一个线程池
转换request的请求
是否短路(熔断)
targetWithFallbackFactory
target : HardCodedTarget
是否报错
替换
feign.target(target)
lbClient
Proxy.newProxyInstance=HystrixInvocationHandler
这部分代码未查看
创建动态代理
put(clientName ,FeignLoadBalancer)
Response# toResponse
统计失败次数触发熔断
调用服务失败
这一块源码太难了,没看懂。RxJava
自定义
Eureka的源数据信息 ?暂不理解
3
(有队列,当队列和最大线程都满的时候,进行拒绝)
未配置降级
@FeignClient(name = \"bosp-cfca-service\")public interface CFCAServiceFeignClient
url 、 name 、class信息
Eureka Clientbosp-cfca-service ->192.168.2.87:54001192.168.2.87:54002
LinkedBlockingQueue
清理掉这个dommand的定时任务,不再执行
fallbackFactory
继承
bosp-cfca-service192.168.2.87:54001
ServerIntrospector
registerFeignClient
private final int connectTimeoutMillis; private final int readTimeoutMillis; private final boolean followRedirects;
重试机制
PollingServerListUpdater
get
方法的数据信息
注册
targetWithFallback
默认参数:https://blog.csdn.net/u011063112/article/details/81392175熔断触发的最小个数/10s :20个熔断多少秒后去尝试请求 :5000ms 5s
DefaultClientConfigImpl 属性
Client # execute
集成了Hystrix配置了降级策略
RequestTemplate
当我们使用feginclent调用时,走的是这一步,上面的都是项目启动时的准备工作
线程拒绝
ILoadBalancer
转化
toString
equals
方法执行
ribbon的整合LoadBalancerFeignClient
执行 Command发送http请求到server
FeignLoadBalancer#execute
options 超时的参数信息
发送http请求
降级
执行逻辑
Ribbon 的 ILoadBalancerLoadBalancerFeignClient
从缓存获取cache.get
30S 拉取一次sevice client 的注册信息
@Autowired private CFCAServiceFeignClient cfcaServiceFeignClient ;
FeignLoadBalancer
key:String 类名#方法名(参数)value:SynchronousMethodHandler
GET http://bosp-cfca-service/getMember?userId=1 HTTP/1.1
Observable
调度执行runnable线程
开启
疑惑:先走getFallback
276 行 选择serverselectServer
初始化组件信息
cfcaServiceFeignClient.getUser(\"songzhangyong\")
小于 0
getObject
默认
HystrixTargeter.target
大于 0
是否超时
每个方法对应 一个SynchronousMethodHandler
template
GET http://bosp-cfca-service/getMemberAll?userId=1 HTTP/1.1
初始化线程池
hashCode
把服务名: bosp-cfca-service 交给ribbon
请求:http://service-memberhttp://{service-id}
executeAndDecode(template)
通过负载均衡算法选取具体的ip实例
build
RequestInterceptor
client :LoadBalancerFeignClient
获取 fallbackFactory实现类
获取到 FeginClient 的动态代理实现类CFCAServiceFeignClient实现类
服务端执行逻辑返回json数据
Http 请求组件
MethodMetadata
熔断状态CLOSED => OPEN
List<DefaultMethodHandler> defaultMethodHandlers暂时不知道用途
Request request = targetRequest(template)
获取 Targeter
corePoolSize 核心线程: 自定义maximumPoolSize 最大线程: 自定义 > 0keepAliveTime 存活时间:自定义
toObservable().toBlocking().toFuture();
GET http://192.168.2.87:54001/getMember?userId=00001 HTTP/1.1
SynchronousQueue
hystrixCommand代表一个服务的一个接口
Ribbon负载
完成地址的拼装,替换IPhttp://192.168.2.87:53006/cfca/marketOrderPay
commadn的timeout状态是否是NOT_EXECUTED 未执行
json序列化成对应返回对象
线程池是否已满
熔断
0 条评论
下一页