Gateway 与 Hystrix 关系
- 一个请求首先经过 HystrixCommand 封装.具体在
org.springframework.cloud.gateway.filter.factory.HystrixGatewayFilterFactory
Gateway 调用ribbon流程
- org.springframework.cloud.client.loadbalancer.ServiceInstanceChooser#choose
- org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient#choose
- org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient#getServer(java.lang.String)
- org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient#getLoadBalancer #选择一个负载均衡器
- org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient#getServer(com.netflix.loadbalancer.ILoadBalancer) #根据传入的负载均衡器选择相应的服务
- com.netflix.loadbalancer.ZoneAwareLoadBalancer#chooseServer #调用负载均衡器中的chooseServer方法.
- com.netflix.loadbalancer.BaseLoadBalancer#chooseServer #调用父类的选择服务的方法.
- com.netflix.loadbalancer.IRule#choose #Rule 选择服务, 会有几种不同的算法,权重,轮训,最优等算法.此处可以扩展自定义选择服务的rule
- com.netflix.loadbalancer.RoundRobinRule #默认的负载均衡算法
ribbon 服务列表
- ILoadBalancer 负载均衡器,其最终的子类为
com.netflix.loadbalancer.ZoneAwareLoadBalancer
在工作,其中最重要的为getServerList
这个方法
//所有的服务列表
@Monitor(name = PREFIX + "AllServerList", type = DataSourceType.INFORMATIONAL)
protected volatile List<Server> allServerList = Collections
.synchronizedList(new ArrayList<Server>());
//健康的服务列表
@Monitor(name = PREFIX + "UpServerList", type = DataSourceType.INFORMATIONAL)
protected volatile List<Server> upServerList = Collections
.synchronizedList(new ArrayList<Server>());
ServerList
属性在什么时候构造的呢?org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration#ribbonLoadBalancer
在这里构造.传入了ServerList
, 可见ServerList
是一个Spring Bean.
ServerList
的创建与维护
创建
ribbon.eureka.enabled
属性确定了ribbon从eureka上拉取服务列表org.springframework.cloud.netflix.ribbon.eureka.EurekaRibbonClientConfiguration
即org.springframework.cloud.netflix.ribbon.eureka.EurekaRibbonClientConfiguration#ribbonServerList
此方法.
通过定时ping服务维护服务列表
com.netflix.loadbalancer.BaseLoadBalancer.SerialPingStrategy
此属性为探测服务是否可用的策略.
com.netflix.loadbalancer.IPingStrategy#pingServers
在java.util.Timer#schedule(java.util.TimerTask, long, long)
这里启动一个定时线程来定时探测服务.NFLoadBalancerPingInterval
为一个配置项.配置多长时间进行探测.维护服务列表
通过eureka维护ribbon服务列表
- 在
DynamicServerListLoadBalancer
中的com.netflix.loadbalancer.DynamicServerListLoadBalancer#updateAction方法更新服务列表.
com.netflix.loadbalancer.DynamicServerListLoadBalancer#serverListUpdater.默认为
com.netflix.loadbalancer.PollingServerListUpdater定时从eureka获取服务列表.具体调用方法
com.netflix.loadbalancer.ServerListUpdater.UpdateAction#doUpdate`维护.