我是靠谱客的博主 暴躁月饼,最近开发中收集的这篇文章主要介绍soul网关案例学习:http代理大致流程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

今日目标

了解http代理过程。

探索过程

启动admin, bootstrap和http example,用postman发起如下GET请求:

http://127.0.0.1:9195/http/test/findByUserId?userId=1

bootstrap打印如下日志:

INFO 42752 --- [-work-threads-9] o.d.soul.plugin.base.AbstractSoulPlugin
: divide selector success match , selector name :/http
INFO 42752 --- [-work-threads-9] o.d.soul.plugin.base.AbstractSoulPlugin
: divide rule success match , rule name :/http/test/**
INFO 42752 --- [-work-threads-9] o.d.s.plugin.httpclient.WebClientPlugin
: The request urlPath is http://26.26.26.1:8188/test/findByUserId?userId=1, retryTimes is 0

日志中可以看出,通过AbstractSoulPlugin插件识别到选择器和规则,以及最终得到实际服务的url,查找日志中对应类的函数调用情况,可以定位到客户端请求到达soul网关的最初入口(从spring web传给soul入口),入口是org.dromara.soul.web.handler.SoulWebHandler.handle(ServerWebExchange)
从上述入口进行代码跟踪,发现在如下位置调用各个插件进行相关的过滤和处理:

org.dromara.soul.web.handler.SoulWebHandler.DefaultSoulPluginChain.execute(ServerWebExchange)

对应函数体如下:

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();
});
}

在这里会过一遍所有的插件,每个插件都有一个orderId,表示插件处理的顺序,WebClientPlugin的orderid是divide插件id加一,说明WebClientPlugin插件处理排在divide插件处理之后,实际也是在WebClientPlugin中就将客户端请求转到对应的服务上去。

感想

看代码过程中,对响应式编程不是很理解,造成代码阅读有点困难,这一块需要尽快补上,并争取落实到自己平时的编码中。

最后

以上就是暴躁月饼为你收集整理的soul网关案例学习:http代理大致流程的全部内容,希望文章能够帮你解决soul网关案例学习:http代理大致流程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部