Netty权威指南:Netty总结-服务端创建

第13章 服务端创建

13.1 原生NIO类库复杂性

开发高质量的NIO的程序并不简单,成本太高

13.2 服务端创建源码

通过ServerBootStrap启动辅助类启动Netty

13.2.1 创建时序图

在这里插入图片描述

以下是关键步骤:

  1. 创建ServerBootStrap实例。这是启动辅助类,提供一系列方法用于设置启动相关的参数,因为参数太多,所以构造函数没有参数

  2. 设置并绑定Reactor线程池,Netty的Reactor线程池是EventLoopGroup,就是EventGroup的数组。EventLoop就是用来处理所有注册到Selector上的Channel,由EventLoop的run方法进行轮询操作。除了处理I/O事件,也处理用户自定义的Task,和定时任务。

  3. 设置并绑定服务端Channel,Netty对NIO中的ServerSocketChannel进行了封装,对应NioServerSocketChannel。在ServerBootStrap中可以指定ServerSocketChannel的类型。

  4. 链路建立的时候创建并初始化ChannelPipeline,本质是一个负责处理网络事件的职责链,负责管理和执行ChannelHandler。网络事件以事件流的形式在ChannelPipeline中流转,由ChannelPipeline根据ChannelHandler的执行策略调度ChannelHandler,有一些典型的网络事件:

    1. 链路注册
    2. 链路激活
    3. 链路断开
    4. 接收到请求消息
    5. 请求消息接收并处理完毕
    6. 发送应答消息
    7. 链路发生异常
    8. 发生用户自定义事件
  5. 初始化ChannelPipeline后,添加并设置ChannelHandler。通过ChannelHandler可以完成用户自己的定制与扩展,同时Netty也提供了大量的系统ChannelHandler,一些实用的:

    1. 系统编解码框架-ByteToMessageCodec
    2. 通用基于长度的半包解码器-LengthFieldBasedFrameDecoder
    3. 码流日志打印Handler-LoggingHandler
    4. SSL安全认证Handler—SslHandler
    5. 链路空闲检测Handler-IdleStateHandler
    6. 流量整形Handler-ChannelTrafficShapingHandler
    7. Base64编解码-Base64Decoder和Base64Encoder

    创建和添加ChannelHandler源码:

    .childHandler(new ChannelInitializer<SocketChannel>() {
          // (4)
                     @Override
                     public void initChannel(SocketChannel ch) throws Exception {
         
                         ch.pipeline().addLast(
                                 //new LoggingHandler(LogLevel.INFO),
                                 new EchoServerHandler());
                     }
                 });
    
  6. 绑定并启动端口。将ServerSocketChannel注册到Selector上监听客户端连接

  7. Selector轮询。由Reactor线程NioEventLoop负责调度和执行Selector轮询操作,选择准备就绪的Channel集合

  8. 当轮询到准备就绪的Channel之后,就由Reactor线程NioEventLoop执行ChannelPipeline的相应方法,最终执行ChannelHandler

  9. 执行ChannelHandler,ChannelPipeline根据具体网络事件的类型,调度并执行ChannelHandler

13.2.2 服务端创建源码

public class EchoServer {
   
    private final int port;
    public EchoServer(int port) {
   
        this.port = port;
    }

    public void run() throws Exception {
   
        // Configure the server.
        EventLoopGroup bossGroup = new NioEventLoopGroup();  // (1)
        EventLoopGroup workerGroup = new NioEventLoopGroup();  
        try {
   
            ServerBootstrap b = new ServerBootstrap(); // (2)
            b.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class) // (3)
             .option(ChannelOption.SO_BACKLOG, 100)
             .handler(new LoggingHandler(LogLevel.INFO))
             .childHandler(new ChannelInitializer<SocketChannel>() {
    // (4)
                 @Override
                 public void initChannel(SocketChannel ch) throws Exception {
   
                     ch.pipeline().addLast(
                             //new LoggingHandler(LogLevel.INFO),
                             new EchoServerHandler());
                 }
             });

            // Start the server.
            ChannelFuture f = b.bind(port).sync(); // (5)

            // Wait until the server socket is closed.
            f.channel().closeFuture().sync();
        } finally {
   
            // Shut down all event loops to terminate all threads.
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值