抛出问题
先回顾下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 注册服务升级变动过程中,如何做升级隔离,环境隔离
流程解析
1 gateway收到Rpc请求,请求进入拦截器LoadBalancerClientFilter,
拦截器会判断,当前请求是否是LB模式 还是固定URL格式
2 进入到RibbonLoadBalancerClient
3 进入到ZoneAwareLoadBalancer
4 进入到BaseLoadBalancer
5 进入到PredicateBasedRule
6 获取保存的内存server列表,即BaseLoadBalancer.arrayList()
到这一步应该就能看出,gateway 是从内存list里面取出了server列表,
那么这个list是如何维护的呢?例如nacos 注册又上线了一个服,这个server列表如何做同步的呢?继续往下看
7 观察核心类ZoneAwareLoadBalancer
8 进入到DynamicServerListLoadBalancer
9 进入到ServerListUpdater准备开启 每30秒定时执行的后台线程
10 每30秒定时执行的后台线程,不间断拉取nacos server地址,并且更新内存数据
见NacosServerList
环境隔离思考
通过上面的流程,简单理解就两步
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
各位靓仔可以在此处下载源码作为参考