Netty实战:服务端启动流程

270 阅读3分钟
原文链接: fageiguanbing.gitee.io

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设置一些属性(指定要用到新创建的 ServerChannelChannelConfigChannelOption )。值得注意的是,这个选项将会通过bind方法设置到Channel,在bind方法调用之后,再次设置或者改变 ChannelOption 不会有任何效果。

  • childOption

    给每条连接设置一些TCP底层相关的属性。指定当子 Channel

    被接收时,应用到子 ChannelChannelConfigChannelOption

  • attr

    可以给服务端的 channel,也就是 NioServerSocketChannel 指定一些自定义属性,然后我们可以通过channel.attr()取出这个属性。指定 ServerChannel 上的属性,属性将会通过bind方法设置给channel,如果设置过,更改将不会起作用。

  • childAttr

    给每一条连接指定自定义属性,然后我们可以通过channel.attr()取出这个属性。

  • bind

    绑定 ServerChannel 并且返回一个 ChannelFuture ,作用:在绑定操作完成后收到通知。

参考资料

本文由 发给官兵 创作,采用 CC BY 3.0 CN协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出 处。如转载至微信公众号,请在文末添加作者公众号二维码。