Soul 网关之前的处理流程
前文探索插件链时提到,当有接收到一个请求的时候,会到达SoulWebHandler
的handle
。本文会探索使用DividePlugin
插件接收一个请求到最终返回的全过程。
在handle
打上断点,发起请求。可以通过左侧调用栈来一点一点往前推处理的逻辑。
首先是进入到DefaultWebFilterChain
中的filter
方法。
public Mono<Void> filter(ServerWebExchange exchange) {
return Mono.defer(() -> {
return this.currentFilter != null && this.chain != null ? this.invokeFilter(this.currentFilter, this.chain, exchange) : this.handler.handle(exchange);
});
}
里面是 Reactor 响应式编程的代码。目前还看不懂,但从类名以及方法名推测,应该是执行过滤器的操作。
接着往前依次经过FilteringWebHandler
、WebHandlerDecorator
、ExceptionHandlingWebHandler
找到关键点是HttpWebHandlerAdapter
public Mono<Void> handle(ServerHttpRequest request, ServerHttpResponse response) {
// ...
// 生成了 soul 网关插件链处理中的关键变量 exchange
ServerWebExchange exchange = this.createExchange(request, response);
// ...
return var10000.then(Mono.defer(response::setComplete));
}
可以看到在这个类中,以 request 和 response 这两个参数生成了 soul 网关插件链处理中的关键变量 exchange。
再往前经过ReactiveWebServerApplicationContext
后到达ReactorHttpHandlerAdapter
public Mono<Void> apply(HttpServerRequest reactorRequest, HttpServerResponse reactorResponse) {
// ...
try {
// 这里生成 request 和 response 两个重要实例
ReactorServerHttpRequest request = new ReactorServerHttpRequest(reactorRequest, bufferFactory);
ServerHttpResponse response = new ReactorServerHttpResponse(reactorResponse, bufferFactory);
// ...
return this.httpHandler.handle(request, (ServerHttpResponse)response).doOnError((ex) -> {
// ...
}
在这里,生成了 request 和 response 两个重要实例。
然后往前依次经过HttpServerHandle
、TcpServerBind
找到关键点HttpServerOperations
protected void onInboundNext(ChannelHandlerContext ctx, Object msg) {
if (msg instanceof HttpRequest) {
try {
this.listener().onStateChange(this, HttpServerState.REQUEST_RECEIVED);
}
// ...
}
这里是 netty server 接收请求的入口。再往前找就都是 netty 内部的调用栈,暂时略过。
至此,Soul 网关之前的请求处理流程就如下图所示