首页 > 其他 > 详细

Soul(shenyu)-Divide插件的实现

时间:2021-09-01 12:43:49      阅读:59      评论:0      收藏:0      [点我收藏+]

?

 Soul网关的divide插件,提供了请求转发,负载均衡的功能

在Soul-bootstrap启动的时候,会和souladmin进行数据同步,获取到各个插件的数据,所有请求过来的时候,会根据插件数据在插件链中处理逻辑,即执行SoulPlugin的execute方法。

在开启divide插件之前,必须开启global,其中global是默认开启且不在配置当中。

另外,另一个context_path插件,是可以对请求的url进行裁切的,如果配置context,则会对url进行裁切再转发,如果不开启此插件,则请求网关的路径会直接转发到下游服务当中。

本次在分析divide插件之前,先对global和context_path插件进行逻辑分析。

 

Global插件

配置类: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 插件

技术分享图片?

技术分享图片


在请求到context-path插件时,会先调用AbstractSoulPlugin的execute方法,获取此插件下与本次请求匹配的选择器,规则等,并调用doExecute方法,在doExecute方法,找到与规则匹配的映射处理器,之后在buildContextPath根据context-path截取请求url获取服务请求的真实路径,放置到soulcontext当中

技术分享图片?

技术分享图片


之后进入下一个插件,此处之后进入开启的divide插件。

下游服务配置context

技术分享图片?

技术分享图片

 


Divide插件

技术分享图片?

技术分享图片

首先会执行UpstreamCacheManger的obtainHandle方法,获取处理器

技术分享图片?

技术分享图片

之后会进入findUpstreamListBySelectorId方法,根据选择器的编号,获取下游服务服务器的信息列表

技术分享图片?

技术分享图片


获取到下游服务地址之后,再获取请求的服务地址,根据选择器的配置和ip,进行负载均衡策略的选定

技术分享图片?

技术分享图片


由Soul的Spi获取负载均衡策略,并调用select方法进行服务器的选择,支持的负载均衡算法策略有三种:权重轮询、权重随机、哈希

技术分享图片?

技术分享图片


获取到了要发送的服务器之后,进行真正请求路径的拼接,并执行下一个插件。
 

WebClientPlugin插件

该插件根据超时时间和重试次数进行请求的发送

技术分享图片?

技术分享图片

 

技术分享图片?

技术分享图片


进行请求,并直接返回,之后另一条线程进行请求结果的接收,并继续执行后续插件。(doNext方法含有chain,可以继续插件链的执行)

 

WebClientResponsePlugin插件

返回的请求结果会经过该插件写回给客户机

技术分享图片?

技术分享图片

 

?

Soul(shenyu)-Divide插件的实现

原文:https://www.cnblogs.com/sewell/p/15212256.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!