spring cloud gateway 请求流程分析

Gateway 与 Hystrix 关系

  1. 一个请求首先经过 HystrixCommand 封装.具体在org.springframework.cloud.gateway.filter.factory.HystrixGatewayFilterFactory

Gateway 调用ribbon流程

  1. org.springframework.cloud.client.loadbalancer.ServiceInstanceChooser#choose
  2. org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient#choose
  3. org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient#getServer(java.lang.String)
  4. org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient#getLoadBalancer #选择一个负载均衡器
  5. org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient#getServer(com.netflix.loadbalancer.ILoadBalancer) #根据传入的负载均衡器选择相应的服务
  6. com.netflix.loadbalancer.ZoneAwareLoadBalancer#chooseServer #调用负载均衡器中的chooseServer方法.
  7. com.netflix.loadbalancer.BaseLoadBalancer#chooseServer #调用父类的选择服务的方法.
  8. com.netflix.loadbalancer.IRule#choose #Rule 选择服务, 会有几种不同的算法,权重,轮训,最优等算法.此处可以扩展自定义选择服务的rule
  9. 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.EurekaRibbonClientConfigurationorg.springframework.cloud.netflix.ribbon.eureka.EurekaRibbonClientConfiguration#ribbonServerList 此方法.

通过定时ping服务维护服务列表

  • com.netflix.loadbalancer.BaseLoadBalancer.SerialPingStrategy 此属性为探测服务是否可用的策略.
    com.netflix.loadbalancer.IPingStrategy#pingServersjava.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`维护.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值