Netty是什么
首先有一个场景:你正在为一个大型公司开发一款全新的任务关键型的应用程序,这个系统必须能够支撑150000名并发用户,并且不能有任何性能损失。
基于高吞吐量,高可用性和低成本的需求,屏蔽NIO底层的优秀网络框架Netty成为首选。
Netty是异步和事件驱动的,非阻塞的网络调用是的我们可以不必等待一个操作的完成,选择器使得我们能够通过较少的线程便可以监视许多连接上的事件。
—– 《Netty in action》
第一小节:服务端启动流程
一个服务端启动的demo
public class NettyServer {
public static void main(String[] args) {
// 监听端口,接收新连接的线程组
NioEventLoopGroup bossGroup = new NioEventLoopGroup();
// 处理每一条新连接数据读写的线程组
// 形象一点就是说boss负责接活,worker负责干活
NioEventLoopGroup workerGroup = new NioEventLoopGroup();
// 配置引导类
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap
// 配置两个线程组
.group(bossGroup, workerGroup)
// 指定所使用的NIO传输的channel
.channel(NioServerSocketChannel.class)
// 绑定(localhost:8080)
.localAddress(new InitSocketAddress(8080))
// 给引导类创建一个ChannelInitializer,当一个新的连接创建时,一个系的子Channel将会被创建,而ChannelInitializer将会把一个你的handler添加到该Channel的ChannelPipeline中
.childHandler(new ChannelInitializer<NioSocketChannel>() {
protected void initChannel(NioSocketChannel ch) {
// 这里将会绑定一个handler来处理业务逻辑,暂时先不指定hanler
ch.pipeline.addLast(handler);
}
});
}
}
以上就是创建一个服务器的主要代码组件:
- 创建两个线程组,用于不同的分工
- 创建一个
ServerBootstrap的实例引导服务器配置 - 指定IO模型(NIO)
- 绑定地址
- 使用handler初始化每一个channel
ServerBootstrap其他配置
-
channelFactory
如果不能通过默认的无参构造方法创建Channel,那么可以提供一个channelFactory
-
option
给服务端channel设置一些属性(指定要用到新创建的
ServerChannel的ChannelConfig的ChannelOption)。值得注意的是,这个选项将会通过bind方法设置到Channel,在bind方法调用之后,再次设置或者改变ChannelOption不会有任何效果。 -
childOption
给每条连接设置一些TCP底层相关的属性。指定当子
Channel被接收时,应用到子
Channel的ChannelConfig的ChannelOption -
attr
可以给服务端的 channel,也就是
NioServerSocketChannel指定一些自定义属性,然后我们可以通过channel.attr()取出这个属性。指定ServerChannel上的属性,属性将会通过bind方法设置给channel,如果设置过,更改将不会起作用。 -
childAttr
给每一条连接指定自定义属性,然后我们可以通过
channel.attr()取出这个属性。 -
bind
绑定
ServerChannel并且返回一个ChannelFuture,作用:在绑定操作完成后收到通知。
参考资料
-
掘金小册《Netty 入门与实战:仿写微信 IM 即时通讯系统》
Github地址:github.com/lightningMa…
-
《Netty in action》
本文由 发给官兵 创作,采用 CC BY 3.0 CN协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出 处。如转载至微信公众号,请在文末添加作者公众号二维码。