Soul网关源码学习05
soul-web 处理流程
soul-web基于webflux 可以使用Netty作为应用服务器,EventLoop 可以说是Netty的调度中心,负责事件的监听(I/O事件、信号事件),ChannelPipeline 事件处理链,ChannelHandler事件处理。
相对于ChannelPipeline 而言Netty事件分为两大类 inboud 和 outbound,分别由ChannelInboundHandler 和ChannelOutboundHandler 负责处理,inbound和outbound 指事件类型。
Inbound:事件是由外部触发的,可以认为并非应用程序主动请求而触发的事件,比如请求连接、管道有数据传递。
Outbound:事件是由应用程序主动请求触发的事件,可认为应用程序发起某个操作事件,比如向socket写入数据,从socket读取数据。
ChannelOperationsHandler
ChannelOperationsHandler 被添加到ChannelPipeline,继承 ChannelInboundHandlerAdapter 重写了父类接收请求事件的方法。
final public void channelRead(ChannelHandlerContext ctx, Object msg) {
if (msg == null || msg == Unpooled.EMPTY_BUFFER || msg instanceof EmptyByteBuf) {
return;
}
try {
ChannelOperations<?, ?> ops = ChannelOperations.get(ctx.channel());
if (ops != null) {
ops.onInboundNext(ctx, msg);
}
}
事件参数msg 请求的数据,从ChannelOperations中取出对应的 channel 是http,websocket。
Netty请求流程
1、HttpServerOperations --> 判断处理请求msg是HttpRequestHtpp。
2、HttpServerHandle --> 调用 ReactorHttpHandlerAdapter。
3、ReactorHttpHandlerAdapter --> 调用 HttpWebHandlerAdapter。
请求传递
1、Reactor 中请求会先执行WebFilter的实现类,再执行WebHandler的实现类。
2、HealthFilter 判断是否为健康检查,FileSizeFilter判断ContentType为form-data取出body。
3、执行SoulWebHandler 调用Soul对应的插件。