spring cloud整体源码流程图
2021-04-27 16:47:44 1 举报
涉及feign,ribbon,eureka
作者其他创作
大纲/内容
synchronousMethodHandler
真正执行http请求的组件
status.jsp是在eureka resources工程里
ServiceA192.168.31.121:8088
2,接下来才是生成代理对象
ServiceAClient.createUser
后台线程同步到readonly
2,走代理
注册
创建
包含LoadBalancerFeignClient组件
对每个接口方法都创建一个synchronousMethodHandler
判断是否进入自我保护机制
注册feign客户端默认的配置
eureka server
LoadBalanceFeignClient
同样也作为eureka client
LoadBalancerFeignClient基于负载均衡组件
定时同步,默认30秒
一般生产环境配置:feign.hystrix.enabled
registerDefaultConfiguration
服务注册
用户
ServiceA192.168.31.107:8080
feignContext(服务A)
BeanDefinition(扫描出来的信息对象)
创建出来一个动态代理对象 T Proxy
Hystrixtargeter用来跟feign和hystrix整合使用的
ServiceBController
@EnableEurekaClient创建一个eureka client
同步的时候,将isReplication设置为true确保本地不在同步给其他server
拉取
服务注册表ServiceA:192.168.31.107:8080192.168.31.121:8088
至此
ServiceAClient接口
Encoder
4,实际调用请求转发给组件
3层队列, 异步批处理机制同步给集群中其他的server批处理:节省网络通信的开销
feign是feign.hystrix.HystrixFeign
各种组件注入
获取method元数据
registerBeanDefinitions扫描@FeignClient注解的接口
loadBalance()方法创建出来基于ribbon的动态代理
最近一分钟的心跳<预期的心跳 就进入自我保护,不会摘除服务实例预期的心跳次数=服务实例的数量*2*0.85源码槽点:1,期望心跳次数的计算,硬编码(= count * 2)应该这么写:服务实例个数 * (60 / 心跳时间间隔) * 0.85 = 每分钟最少的心跳次数。2,注册,每分钟期望心跳次数 + 2。服务下线,直接每分钟期望心跳次数 - 2故障的时候,摘除一个服务实例,居然没找到更新期望心跳次数的代码。bug线上生产环境,如果你可以的话,你可以选择将这个自我保护给关了
IRule负责负载均衡的规则,从 server list选择一个服务器
feign.target(target)方法负责生成动态代理
ReadWrite缓存192.168.1.102:8080增量的服务实例
传入
服务注册与发现心跳检测与故障
扫描出来@FeignClient注解标注的接口比如接口:ServiceAClient
拿到一个ribbon的LoadBalancer组件从 server list中选择一个server
Ribbon核心组件:(类型)IloadBalancerZoneAwareLoadBalancer
触发对应的Feign的核心机制
registerFeignClients()
ServiceAClient.sayHello
1,请求ServiceA的sayHello方法调用
把代理类注入到
同步
ServiceAClient.updateUser
注册时立马同步故障时,清空缓存
基于
feignContext(服务B)
Decoder
ReadOnly缓存192.168.1.102:8080增量的服务实例
构造
ribbon和eurekaspan style=\
生成真正的URL请求地址http://ServiceA/sayHello/leo-->http://192.168.31.121:8080/syaHello/
eureka server集群同步
注册isReplication是false同步给其他所有的server服务器
每个30秒读取刷新一次假如发现为空,则从服务注册表拉取最新的信息到readwirte缓存
FeignClientFactoryBean类生成代理的入口类
调用
getObject()
3,在map里面定位nameToHandler
FeignInvocationHandler
基于IRule选择的server去生成
HystrixFeign.Builder
@EnableFeignClients
解析注解
1,扫描器进行扫描解析
自我保护机制
server192.168.31.121:8080
实现
ServiceAClient.deleteUser
从client获取注册表
注入
仅仅是扫描@FeignClient获取到接口信息对象
nameToHandler(是个map)
定时任务检查服务是否宕机
发起http请求
每60秒检查一次,如果服务宕机了就拆除掉,首先判断是否进入自我保护机制假如要摘除,也是分批摘除,每次最多将注册表中15%的服务实例给摘除掉 摘除流程:1,删除本地注册表2,摘除的实例,放入一个队列及(增量注册表),利用增量注册表,删除本地失效的服务实例3,清除readwritecacheMap-->同步readonlycacheMap服务实例故障:90s * 2 :这是eureka的一个bug,但是源码里注释上说,不打算修复。在90秒的基础上再*2。所以实际是3分钟才算故障
feignContext(服务C)
选取一个server默认:round robin轮询算法
发送心跳30S更新一下lastUpdateTimestamp这个时间戳
SpringMvcContract
1,全量抓取:第一次抓取时http://localhost:8080/v2/apps2,增量抓取注册表,抓取3分钟之内的变化,并且会和server带过来的hash对比是否一致,如果不一致,全量抓取一次
ZoneAwareLoadBalancer与eureka整合
FeignclientRegistar入口
默认Feign.Builder
ServiceA 的server list:192.168.31.107:8080192.168.31.121:8088
IRule规则类
0 条评论
下一页