Netty初步

1.入门文档
如果是入门的话,官网的文档已经相当好了。里面的例子程序得仔细阅读,这里就不再重复转载了。参见[url]http://netty.io/wiki/user-guide.html[/url]

2.为什么需要netty
2.1 主要是scalibity和performance

2.2 另外Netty In Action有一些说明,笔记如下:

2.2.1 传统的异步编程有2种模式:callback和Future

2.2.2 3种API比较
BIO: N个连接N个Thread
NIO: N个连接1个Selector-->1个Thread
NIO2:CompletionHandler避免了Selector的轮询(JDK7)

这张图是BIO和NIO的比较。
[img]http://dl2.iteye.com/upload/attachment/0095/8054/18c8f11d-a3d8-368f-869e-e817ab461e90.png[/img]

2.2.3 JDK的问题:
1.跨平台:linux上OK,windows上却出问题
2.ByteBuffer无法扩展
3.scattering gathering可能有内存泄露(直到java6的后期update版本或者Java7才解决)
4.epoll bug,可导致CPU 100%。 [url]https://github.com/netty/netty/issues/327[/url]
Netty解决了以上4点问题。


3.Netty3,4,5 API不同点

本文写作时,各版本的最新版如下:
[table]
|netty3|3.9.0|
|netty4|4.0.18|
|netty5|5.0.0 Alpha1|
[/table]

3.1 ChannelHandler的变化
首先有一些术语需要理解,请参见下面的表格和3张图,从中可以看到netty3,4,5之间的很大的不同。

[table]
|收消息|上行,入站| InputStream.read(byte[])
|发消息|下行,出站| OutputStream.write(byte[]), Socket.connect(SocketAddress), Socket.close()
[/table]

Netty3使用了上行下行的概念
[img]http://dl2.iteye.com/upload/attachment/0095/8056/9991ac83-3351-3a35-8ac7-32371cd28465.png[/img]

Netty4使用了入站出站的概念
[img]http://dl2.iteye.com/upload/attachment/0095/8058/94c2284e-e0b5-3721-8af8-a52c22d19d5c.png[/img]

Netty5则干脆取消了两者的划分,统一为一个概念
[img]http://dl2.iteye.com/upload/attachment/0095/8060/814e99a8-cf17-3e79-b5a2-90ccbc5c7562.png[/img]

Netty3: ChannelHandler有两个子接口ChannelUpstreamHandler,ChannelDownstreamHandler,
上行和下行,这里的上行和下行和我们一般理解上的上下行不太一样,为何如此可以参考上面的3张图。
相应的类有SimpleChannelUpstreamHandler,SimpleChannelDownstreamHandler,以及一个同时实现两个接口的SimpleChannelHandler

[img]http://dl2.iteye.com/upload/attachment/0095/8062/66798b49-9eed-3b6b-a62a-ae22613b45eb.png[/img]


Netty4: 接口变成了ChannelInboundHandler ChannelOutboundHandler,可能是为了避免原来的上下行造成误解,所以改成入站和出站了。
相应的类有ChannelInboundHandlerAdapter,ChannelOutboundHandlerAdapter,我们只要选择一个继承就可以了。

[img]http://dl2.iteye.com/upload/attachment/0095/8064/8ca077c4-5f07-3056-b0dc-7c25b236dab0.png[/img]


Netty5: 取消了进站、出站的划分,统一为继承ChannelHandlerAdapter,原来的ChannelInboundHandlerAdapter,ChannelOutboundHandlerAdapter被废弃。

[img]http://dl2.iteye.com/upload/attachment/0095/8066/db945ac8-d13c-3f5e-b4f7-3e069ff13f1b.png[/img]

ChannelHandler的API,从中可以看到netty3,4,5之间的很大的不同。


3.2 BootStrap的变化

3.2.1 netty4构造ServerBootstrap时采用了构建者模式,使得代码更优雅。

EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new DiscardServerHandler());
}
})
.option(ChannelOption.SO_BACKLOG, 128)
.childOption(ChannelOption.SO_KEEPALIVE, true);

而netty3则是用最平常的setter。

ChannelFactory factory = new NioServerSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool());

ServerBootstrap bootstrap = new ServerBootstrap(factory);

bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline() {
return Channels.pipeline(new DiscardServerHandler());
}
});

bootstrap.setOption("child.tcpNoDelay", true);
bootstrap.setOption("child.keepAlive", true);


3.2.2 对比一下netty3和4,我们发现netty4因为采用了泛型的写法(.channel(NioServerSocketChannel.class)),所以NioServerSocketChannelFactory就不需要透露给用户了,这个工厂也被取消了。

3.2.3 另外netty4引入了ChannelOption的常量定义,注意这个类是泛型的(ChannelOption<T>),用了这个技巧从而可以确保赋值安全,使得SO_BACKLOG只能传一个int进来,SO_KEEPALIVE只能传一个boolean进来。

public static final ChannelOption<Integer> SO_BACKLOG
public static final ChannelOption<Boolean> SO_KEEPALIVE


Bootstrap的API,netty4相比netty3有比较大的变化,而netty5和netty4比则基本相同。

作为初步,暂时先分析到这里。其余不同点有待以后继续分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值