ES 源代码阅读(三)

elasticsearch 1.7.5 中 的maven依赖  io.netty netty 3.10.5.Final
NettyTransport.java
首先使用 ServerSocketChannelFactory 来创建 ServerBootstrap 实例, 然后设置
piplineFactory.ServerSocketChannelFactory 包括两种,oio/nio两种实现.
对于ServerSocketChannelFactory需要两种线程池,boss和worker.boss负责监听端口,
每一个端口都有专门的线程复制处理,当一个请求来临时,boss线程会打开socket,封
装成channel,然后将channel交给worker来完成,然后boss线程继续监听.
worker 线程则是由于oio/nio 的两种实现来决定.
对于oio方式,channel被交由worker后,之后直到socket都关闭的过程中都有这个worker
线程处理.
而对于nio方式,每一个worker可以处理不同的channel.可以使用少量的worker线程处
理大量channel. worker线程在处理channel时,交给channelPipline来处理.在channelPipline中
可以有很多channelHandler.一般情况下Pipline中的handler是由相关worker线程
来完成,因此为了节约worker线程处理时间,通常另外创建线程和使用额外的线程池来
完成逻辑的处理.
netty3和4还是有些差别的.
参考:
http://blog.163.com/wm_at163/blog/static/132173490201271154751439/
http://ifeve.com/channel-pipeline/

NettyTransport.java 关键代码
// 创建ServerBootstrap方法
serverBootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(bossFactory),Executors.newCachedThreadPool(workerFactory),workerCount));
// 加载pipline
serverBootstrap.setPipelineFactory(configureServerChannelPipelineFactory(name, settings));
ServerChannelPipelineFactory 作为setPipelineFactory的参数. ServerChannelPipelineFactory 实现 org.jboss.netty.channel.ChannelPipelineFactory接口.
在生成getPipline方法中

            ChannelPipeline channelPipeline = Channels.pipeline();
            channelPipeline.addLast("openChannels", nettyTransport.serverOpenChannels);
            SizeHeaderFrameDecoder sizeHeader = new SizeHeaderFrameDecoder();
            if (nettyTransport.maxCumulationBufferCapacity != null) {
                if (nettyTransport.maxCumulationBufferCapacity.bytes() > Integer.MAX_VALUE) {
                    sizeHeader.setMaxCumulationBufferCapacity(Integer.MAX_VALUE);
                } else {
                    sizeHeader.setMaxCumulationBufferCapacity((int) nettyTransport.maxCumulationBufferCapacity.bytes());
                }
            }
            if (nettyTransport.maxCompositeBufferComponents != -1) {
                sizeHeader.setMaxCumulationBufferComponents(nettyTransport.maxCompositeBufferComponents);
            }
            channelPipeline.addLast("size", sizeHeader);
            channelPipeline.addLast("dispatcher", new MessageChannelHandler(nettyTransport, nettyTransport.logger, name));
            return channelPipeline;

这就表示:任何请求符合条件的都会经过pipline来处理.会交给MessageChannelHandler来完成处理.
最后bind开始提供服务.

 

转载于:https://my.oschina.net/u/937015/blog/759658

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值