微服务内部调用走网关吗?_微服务-Soul网关接入文档(二) 源码阅读,使用monitor插件来保存调用数据...

首先我要收回Soul网关没什么人用的刻板印象。今天才知道网易的轻舟云微服务架构使用的API网关就是Soul网关改的,虽然网易的云服务也没什么人用的样子,不过这个轻舟还是很厉害的,功能很全面而且强大,值得学习。

微服务网关需要有记录请求的能力,作为请求的入口与转发者,记录请求的来龙去脉,调用的模块、调用的时间,调用的结果,这些东西都需要记录下来。Soul网关内置了monitor插件用来做这一工作。

首先我们读一读源码吧,按照官方文档Soul网关是基于Spring Webflux的,首先得先看看Spring WebFlux,当然本文并不是要学习响应式非阻塞模式开发,我们主要的目的是接入并有必要的话改造这一 网关,所以直接看看文档就好:

Web on Reactive Stack​docs.spring.io
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 | InfluxData​www.influxdata.com
7f1ffa424fc5dfadc26b692e71124cd0.png

步骤二、下载完成后,我们启动influxd.exe(数据库本地)

078b9ac1ea803e419d3306909067469b.png

随后启动influx.exe(命令行工具)

执行指令以创建数据库:

create database test

执行指令查看数据库情况,可见我们创建成功了:

show databases
name: databases
name
----
_internal
test

步骤三、打开soul-admin地址,配置插件minitor:

964262ee0f08ae22ca32fce61cd8768e.png

步骤四,配置对应的选择器及规则:

选择器:

1ca996741dcb3c5915f205704f21fe1d.png

规则:

b7260e64afaeeec1296629d32055d281.png

实际上这里配置的是记录所有请求的意思,嘛。

随后我们使用postman调用指令,就可以在数据库中查看到被记录的网关调用情况了:

43983cdfefa4d591e20dc8ca731d1b41.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值