目录
今天是学习soul网关的第五天,前几天学会了http、dubbo、sofa协议的项目是如何接入soul网关的,今天来了解下网关是如何调用对应的服务。
一、sofa服务调用过程
昨天搞明白如何在sofa协议的项目中接入soul网关,并且也调试成功。但是网关是如何调用业务服务的呢?今天以sofa插件为例子,去探索soul网关。
在soul-admin上看见过很多的Plugin,很明显的源码也是如此命名,很容易的找到SofaPlugin.java,查看其源码:
在doExecute()方法里打个断点,然后继续使用我们的老朋友postman请求服务:
请求进入断点后发现其上层调用:是WebHandler.java
对这个类不太了解,查了下资料,是响应式编程WebFlux的类,结构如下:
参考资料:https://www.cnblogs.com/niechen/p/9303451.html
WebHandler是WebFlux处理请求的入口,SoulWebHandler实现了该接口,接着查看它的调用链:
大致思路就是在SoulWebHandler.execute里查找到对应的插件,然后根据该插件配置的选择器,规则、权重通过代理调用业务方接口。
选择插件:
@Override
public Mono<Void> execute(final ServerWebExchange exchange) {
return Mono.defer(() -> {
if (this.index < plugins.size()) {
SoulPlugin plugin = plugins.get(this.index++);
Boolean skip = plugin.skip(exchange);
if (skip) {
return this.execute(exchange);
}
return plugin.execute(exchange, this);
}
return Mono.empty();
});
}
当我debug到SofaProxyService. genericInvoker ()的这里,这里根据元数据(MetaData)获取了对应的接口类,方法,以及参数内容,但是选择哪个业务服务,目前还没有找到对应的代码。
ConsumerConfig<GenericService> reference = ApplicationConfigCache.getInstance().get(metaData.getPath());
if (Objects.isNull(reference) || StringUtils.isEmpty(reference.getInterfaceId())) {
ApplicationConfigCache.getInstance().invalidate(metaData.getServiceName());
reference = ApplicationConfigCache.getInstance().initRef(metaData);
}
GenericService genericService = reference.refer();
明天继续刚genericService.invoke(),弄明白,是如何调用具体的业务服务,难道在这之前,先获取了某个业务服务??
二、今天的学习分析、总结
Debug代码时很有意思的事,一步步的揭开真相……