?
Soul网关的divide插件,提供了请求转发,负载均衡的功能
在Soul-bootstrap启动的时候,会和souladmin进行数据同步,获取到各个插件的数据,所有请求过来的时候,会根据插件数据在插件链中处理逻辑,即执行SoulPlugin的execute方法。
在开启divide插件之前,必须开启global,其中global是默认开启且不在配置当中。
另外,另一个context_path插件,是可以对请求的url进行裁切的,如果配置context,则会对url进行裁切再转发,如果不开启此插件,则请求网关的路径会直接转发到下游服务当中。
本次在分析divide插件之前,先对global和context_path插件进行逻辑分析。
配置类:GlobalPluginConfiguration
在配置类里面获取到了容器里面不同rpc类型的装饰器,并设置为map类型,放置在builder中
请求进入Global插件,如果非websocket请求,会走build方法
在build方法中获取到了请求路径,会走到MetaDataCache的obtain方法,在obtain方法中,会首先去判断META-DATA中有没有对应的path,如果有,则获取METADATA中配置好的数据,并根据metadata的rpctype选择指定的装饰器。如果没有匹配的metadata,则默认为http类型,默认获取http类型对应的装饰器,并执行它的decorator方法,对SoulContext赋值。
在无其他设置的情况下,经过global插件的SoulContext的信息如图所示。
之后进入下一个插件。
在请求到context-path插件时,会先调用AbstractSoulPlugin的execute方法,获取此插件下与本次请求匹配的选择器,规则等,并调用doExecute方法,在doExecute方法,找到与规则匹配的映射处理器,之后在buildContextPath根据context-path截取请求url获取服务请求的真实路径,放置到soulcontext当中
之后进入下一个插件,此处之后进入开启的divide插件。
下游服务配置context
首先会执行UpstreamCacheManger的obtainHandle方法,获取处理器
之后会进入findUpstreamListBySelectorId方法,根据选择器的编号,获取下游服务服务器的信息列表
获取到下游服务地址之后,再获取请求的服务地址,根据选择器的配置和ip,进行负载均衡策略的选定
由Soul的Spi获取负载均衡策略,并调用select方法进行服务器的选择,支持的负载均衡算法策略有三种:权重轮询、权重随机、哈希
获取到了要发送的服务器之后,进行真正请求路径的拼接,并执行下一个插件。
该插件根据超时时间和重试次数进行请求的发送
进行请求,并直接返回,之后另一条线程进行请求结果的接收,并继续执行后续插件。(doNext方法含有chain,可以继续插件链的执行)
返回的请求结果会经过该插件写回给客户机
?
原文:https://www.cnblogs.com/sewell/p/15212256.html