首先我要收回Soul网关没什么人用的刻板印象。今天才知道网易的轻舟云微服务架构使用的API网关就是Soul网关改的,虽然网易的云服务也没什么人用的样子,不过这个轻舟还是很厉害的,功能很全面而且强大,值得学习。
微服务网关需要有记录请求的能力,作为请求的入口与转发者,记录请求的来龙去脉,调用的模块、调用的时间,调用的结果,这些东西都需要记录下来。Soul网关内置了monitor插件用来做这一工作。
首先我们读一读源码吧,按照官方文档Soul网关是基于Spring Webflux的,首先得先看看Spring WebFlux,当然本文并不是要学习响应式非阻塞模式开发,我们主要的目的是接入并有必要的话改造这一 网关,所以直接看看文档就好:
Web on Reactive Stackdocs.spring.io![4fd849ed6b56797d68777942b9212e71.png](https://img-blog.csdnimg.cn/img_convert/4fd849ed6b56797d68777942b9212e71.png)
嘛,总之,我们认为Soul网关的入口是实现了WebHandler接口的SoulWebHandler类,项目初始化时,会把项目所有的插件作为参数初始化这一Bean,方法如下:
@Bean
作为继承了WebHandler接口的类,在请求到来时会使用handle方法处理请求,这一方法又调用了内部类DefaultSoulPluginChain的excute方法,顾名思义,“默认Soul插件链“这一内部类就是插件按责任链模型执行的体现了,其excute方法通过index这一值计数,每执行一个插件的功能计数就+1,直到所有插件都执行完成,代码如下:
private
可以看到SoulPluGIN这一接口是插件的抽象,而除了ResponsePlugin之外,所有的插件都是虚基类AbstractSoulPlugin的子类,我们可以查看AbstractSoulPlugin的execute方法,可知插件执行请求时,会先检验缓存中的插件数据,判断是否存在及是否被应用。如果被应用,会依次检测该插件的选择器及规则数据,只有请求同时满足被选择且符合应用规则时,才会执行doExecute方法,并开始调用插件的具体工作,这部分代码如下:
@Override
如果我们没有忘记这次的目标是接入monitor插件来保存数据的话,我们这里应该看MonitorPlugin的doExecute方法:
@Override
我们可以知道ServerWebExchange相当于这次请求的上下文,所以,这一方法的作用是,通过这次请求的上下文,构建用于持久化的调用记录MonitorDO,如果生成的调用记录不为空,就调用soulEventPublisher的publishEvent方法将该记录发布。
soulEventPublisher,顾名思义是soul的事件发布器,这一Bean是基于influxDbService而被创建的:
@Bean
public SoulEventPublisher soulEventPublisher(InfluxDbService influxDbService) {
return new SoulEventPublisher(influxDbService);
}
而InfluxDbService则是对InfluxDb的一个Service层封装,也就是说我们的数据最终还是以这种形式保存到了InfluxDb中,代码如下:
public
无需继续深究,对于我们要接入的网关调用记录持久化插件monitor,到这一步就足够了。接下来就接入这一插件吧。
步骤一、下载InfluxDb,InfluxDb是一个时间序列数据库,用于处理海量写入与负载查询。InfluxDB旨在用作涉及大量时间戳数据的任何用例(包括DevOps监控,应用程序指标,物联网传感器数据和实时分析)的后端存储。值得注意的是,这一数据库的单节点版是开源的免费的,而集群版则是商业闭源的,并且好像目前社区也没有推出很好的开源集群方案,使用这一数据库可能是一隐患,但是我们先不管。
官网地址:
InfluxDB: Purpose-Built Open Source Time Series Database | InfluxDatawww.influxdata.com![7f1ffa424fc5dfadc26b692e71124cd0.png](https://img-blog.csdnimg.cn/img_convert/7f1ffa424fc5dfadc26b692e71124cd0.png)
步骤二、下载完成后,我们启动influxd.exe(数据库本地)
![078b9ac1ea803e419d3306909067469b.png](https://img-blog.csdnimg.cn/img_convert/078b9ac1ea803e419d3306909067469b.png)
随后启动influx.exe(命令行工具)
执行指令以创建数据库:
create database test
执行指令查看数据库情况,可见我们创建成功了:
show databases
name: databases
name
----
_internal
test
步骤三、打开soul-admin地址,配置插件minitor:
![964262ee0f08ae22ca32fce61cd8768e.png](https://img-blog.csdnimg.cn/img_convert/964262ee0f08ae22ca32fce61cd8768e.png)
步骤四,配置对应的选择器及规则:
选择器:
![1ca996741dcb3c5915f205704f21fe1d.png](https://img-blog.csdnimg.cn/img_convert/1ca996741dcb3c5915f205704f21fe1d.png)
规则:
![b7260e64afaeeec1296629d32055d281.png](https://img-blog.csdnimg.cn/img_convert/b7260e64afaeeec1296629d32055d281.png)
实际上这里配置的是记录所有请求的意思,嘛。
随后我们使用postman调用指令,就可以在数据库中查看到被记录的网关调用情况了:
![43983cdfefa4d591e20dc8ca731d1b41.png](https://img-blog.csdnimg.cn/img_convert/43983cdfefa4d591e20dc8ca731d1b41.png)