- Divide插件,作为soul进行http协议请求处理的核心插件,本文介绍divide具体工作流程,插件提供的负载均衡,服务探活具体实现,下面是插件的主体逻辑,网关在接收到客户端的请求时divide插件干的活全在这里。
1 | protected Mono<Void> doExecute(final ServerWebExchange exchange, final SoulPluginChain chain, final SelectorData selector, final RuleData rule) { |
- 之前文章说了关于http请求,实际的执行请求转发插件是
webClientPlugin
,其他的比如divide,springCloud插件,都是对当前http请求进行加工处理,处理完成交给webClientP lugin
发送。 UpstreamCacheManager
是上游后端服务的缓存,divide插件处理过程中要确保此次请求的服务是存在的,才能保证后面的转发插件能正确转发请求到实际服务,因此就需要本地保存目前真实存在的后端服务,不影响性能的情况下还能确保请求转发的正确性,同时还需要发送心跳检查后端服务健康情况。
1 | private UpstreamCacheManager() { |
- 这个缓存管理器里面,有2个缓存,一个
UPSTREAM_MAP
,一个UPSTREAM_MAP_TEMP
,后者是内部实时更新,对外提供健康服务地址的缓存,前者是作为一致性检查的缓存,在进行调度的时候,根据UPSTREAM_MAP
的内容,会对UPSTREAM_MAP_TEMP
进行更新,保证每次心跳检测时两个缓存内容一致。 - 对缓存地址的添加则是在
DividePluginDataHandler
中操作的,当admin更新了后端服务地址时,通过发布订阅机制,本地的缓存会收到消息进行更新。