一文看懂 SpringCloud Gateway LB流程源码,环境隔离方案

1,134 阅读2分钟

抛出问题

先回顾下SpringCloud Gateway LB的整体过程
1.向注册中心Nacos注册名称为nacos-main 的服务 

2 SpringCloud Gateway配置LB 
spring:
gateway:
 routes: 
- id: nacos-main
uri: lb://nacos-main
predicates: - Path=/provider-test/** 

3 浏览器访问 http://localhost:9999/provider-test/discovery/one gateway LB路由到 nacos注册中心对应的nacos-main服务器上

在这个过程中,我们思考两个问题
 1 SpringCloud Gateway 是如何找到对应的请求目标url的?
   即如何通过配置的lb://nacos-main 找到访问url,将请求转发出去的

 2 注册服务升级变动过程中,如何做升级隔离,环境隔离
 

流程解析

企业微信截图_6b010a32-f010-403e-bda7-d752b4832526.png

  1 gateway收到Rpc请求,请求进入拦截器LoadBalancerClientFilter,
    拦截器会判断,当前请求是否是LB模式 还是固定URL格式     

企业微信截图_1381874c-74a6-48ee-8f74-14b4c9c46f8a.png

 2 进入到RibbonLoadBalancerClient 

企业微信截图_1f05c2d9-1033-4d83-ac0f-3cc09a9e2ddc.png

企业微信截图_80f47a81-c17f-409d-a8ac-0b3ae677aba5.png

3 进入到ZoneAwareLoadBalancer

企业微信截图_4a6f5a34-3571-4bae-a491-2be0fc070880.png

4 进入到BaseLoadBalancer

企业微信截图_1ab99860-89e2-4e3b-b221-64890b10f2ac.png

5 进入到PredicateBasedRule 

企业微信截图_03f1dfd8-ac04-4866-91ef-47612656da13.png

6 获取保存的内存server列表,即BaseLoadBalancer.arrayList()

企业微信截图_e6e6123a-e79b-449a-8b66-6c79e19c8c0a.png

  到这一步应该就能看出,gateway 是从内存list里面取出了server列表,
  那么这个list是如何维护的呢?例如nacos 注册又上线了一个服,这个server列表如何做同步的呢?继续往下看
  
7 观察核心类ZoneAwareLoadBalancer

企业微信截图_fbf4c67f-7d94-41d3-a34b-064d11d220c4.png 企业微信截图_8bb20e79-7a17-42c0-a4e5-3b16263aa382.png

8 进入到DynamicServerListLoadBalancer 

企业微信截图_e5b47d80-bf68-4cda-966f-07705af14dd6.png 企业微信截图_1b173386-de2e-4c35-ab7b-0ba6c5675d56.png

9 进入到ServerListUpdater准备开启 每30秒定时执行的后台线程

企业微信截图_6cdaaf37-3dd0-4788-ac80-ba21a717a4c1.png

1030秒定时执行的后台线程,不间断拉取nacos server地址,并且更新内存数据
   见NacosServerList

企业微信截图_9c77c0d2-906b-4ad7-86c3-1c06bdbad44c.png 企业微信截图_38d3ee2e-5302-4912-875f-7ab320876ba1.png 企业微信截图_c100055f-d78b-454a-92a7-985b133eaa50.png 企业微信截图_26b914e2-55ea-4982-b5df-9ff0ea4e9a60.png

环境隔离思考

  通过上面的流程,简单理解就两步
  1 gateway 从内存BaseLoadBalancer.allServerList 获取目标url
  2 后台每30秒执行的线程不断更新BaseLoadBalancer.allServerList
  
  如果是做环境隔离的思路就是
  1 gateway 获取url时,给定一个tag=test1,去筛选               BaseLoadBalancer.allServerList 
  2 新服务更新时,更新nacos注册标签,带上环境tag=test1
  

源码下载

 本文所演示的SpringCloud Gateway + Nacos功能以及LB负载均衡演示Demo
 各位靓仔可以在此处下载源码作为参考

Gateway LB源码演示