您的位置:首页 > 其它

netty

2016-02-25 15:56 197 查看
如果只有1个服务器线程来处理所有的客户端请求,在高并发的情况下,处理速度慢,这回导致大量的客户端超时,超时后再进行重连,这会加重线程的负载。导致大量消息挤压和超时。

一旦线程造成死循环,那么回导致通信不可再用。

这里就提到多线程的问题了。一般会 服务器监听线程和io线程分开。。

串行处理,避免了并发问题。

http://www.infoq.com/cn/articles/netty-threading-model/

以下是netty多线程的流程图



分别有服务器监听线程池和io线程池

netty服务器端启动

start() {
ServerBootstrap bootstrap = new ServerBootstrap()
EventLoopGroup workerGroup= new NioEventLoopGroup(1);//服务器监听线程池,负责处理客户端的连接请求的,如果只有一个端口需要监听,那么线程数设置为1.
EventLoopGroup workerGroup = new NioEventLoopGroup();//io线程池
Class<? extends ServerChannel> channelClass =     NioServerSocketChannel.class;
SocketAddress localAddress = new InetSocketAddress(port);

bootstrap.group(this.bossGroup, this.workerGroup)
.channel(this.channelClass)
.option(ChannelOption.TCP_NODELAY, false)
.option(ChannelOption.SO_KEEPALIVE, true)
.localAddress(localAddress)
.childHandler(channelHandler());
}
protected ChannelHandler channelHandler() {
return new ChannelInitializer<Channel>() {
protected void initChannel(Channel ch) throws Exception {
SimpleEncrypt encrypt = new SimpleEncrypt();
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(trafficShapingHandler);
pipeline.addLast(new PortUnificationServerHandler(idleSeconds, handler, encrypt));
}
};
}


Acceptor 线程绑定监听端口,启动服务器。

Channel createChannel() {
EventLoop bossLoop = group().next(); //从服务器监听线程池中取出一个
return channelFactory().newChannel(bossLoop , workerGroup);
}


上面的group()就是服务器监听线程池,next()是从线程池中取出一个可用线程.

public EventExecutor next() {
return bossGroup[Math.abs(bossIndex.getAndIncrement()%bossGroup.length)];
}


服务器Channel创建后,将其注册到多路复用器上,用于接收客户端的连接



如果监听到客户端的连接,就创建SocketChannel连接,重新注册到io的线程池中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: