北京网站关键词排名公司,有什么网站可以免费看电影,郑州天道做网站,公司大全免费查询前言
本文介绍了 ES 使用的网络模型#xff0c;并介绍 transport#xff0c;http 接收、响应请求的代码入口。
网络 IO 模型
Node 在初始化的时候#xff0c;会创建网络模块。网络模块会加载 Netty4Plugin plugin。 而后由 Netty4Plugin 创建对应的 transports#xff0…前言
本文介绍了 ES 使用的网络模型并介绍 transporthttp 接收、响应请求的代码入口。
网络 IO 模型
Node 在初始化的时候会创建网络模块。网络模块会加载 Netty4Plugin plugin。 而后由 Netty4Plugin 创建对应的 transports以及 http server。 代码分别入口为Netty4Plugin#getTransportsNetty4Plugin#getHttpTransports
众所周知Netty 中使用的网络 IO 模型是 主从 Reactor。 接下来带大家一起看创建的细节。
Transport
代码入口为构造函数 Netty4Transport。 因为 transport 主要用于内部因此既有 ServerBootstrap又有 Bootstrap。 ServerBootstrap 是 Netty 中表示 Server 的类。 Bootstrap 是 Netty 中表示 Client 的类。
ES 使用的是 NioEventLoopGroup其底层实现基于 Java NIO。 而 JAVA NIO 在不同的平台上会执行不同的系统调用。例如在 Linux(2.6之后) 会使用 epoll。
创建 NioEventLoopGroup 的代码入口为SharedGroupFactory#getGenericGroup()默认会创建 Runtime.availableProcessors() 个 EventLoop(工作线程)可通过 transport.netty.worker_count 修改创建的个数。 其中Server 和 Client 会共用同一个 NioEventLoopGroup。代码入口 Netty4Transport#doStart() 接收请求代码入口 Netty4MessageChannelHandler#channelRead(ChannelHandlerContext ctx, Object msg)
响应请求代码入口 Netty4MessageChannelHandler#write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise)
http server
创建
代码入口为构造函数 Netty4HttpServerTransport。在 doStart() 函数中描述了 ServerBootstrap 的创建过程。
默认情况下 http server 和 transport 共用同一个 NioEventLoopGroup。如果想改变这个行为需要设置 http.netty.worker_count 的值大于 0。描述这段逻辑的代码入口为SharedGroupFactory#getHttpGroup() 接收 http 请求
接收请求的入口为Netty4HttpRequestHandler#channelRead0(ChannelHandlerContext ctx, HttpPipelinedRequest httpRequest) 与我们所熟知的 MVC 框架类似请求进来后都会交由某个类去做请求的分发。在 ES 中负责分发请求的类为RestController#dispatchRequest(RestRequest request, RestChannel channel, ThreadContext threadContext) 不同的请求可能会运行在不同的业务线程上。 响应 http 请求
响应 http 请求的入口为 Netty4HttpResponseCreator#encode Netty4HttpResponseCreator 继承的是 Netty 的 MessageToMessageEncoder 类。该类在可以写就绪时会自动调用 write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) 方法而 write 方法中则会调用 encode 方法因此这里说入口是 encode 方法。 本文由mdnice多平台发布