2022-6月更文挑战25-netty之服务搭建

107 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情

netty之服务搭建

前文

前面介绍过netty的相关基础知识,本文将从实际应用的角度,对netty搭建服务的过程进行简单的介绍。本文内容为笔记性质,其中可能存在不准确之处。

jar包引入

<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>${netty.version}</version>
</dependency>

配置服务启动信息

                EventLoopGroup bossGroup = new NioEventLoopGroup();
                EventLoopGroup workerGroup = new NioEventLoopGroup();
                ServerBootstrap serverBootstrap = new ServerBootstrap();
                try {
                    ChannelFuture channelFuture = serverBootstrap
                            .group(bossGroup, workerGroup)
                            .channel(NioServerSocketChannel.class)
                            .option(ChannelOption.SO_BACKLOG,128)
                            .childOption(ChannelOption.SO_KEEPALIVE,true)
                            .childHandler(new NettyServerChannelHandler())
                            .bind(port)
                            .sync();
                    channelFuture.channel().closeFuture().sync();
                }catch (Exception e){
                    e.printStackTrace();
                }finally {
                    bossGroup.shutdownGracefully();
                    workerGroup.shutdownGracefully();
                }

如上,为netty服务启动的最核心代码内容,根据上面的代码逐行进行解释。首先我们需要声明两个EventLoop组,这两个分别作为boss和worker的角色。其中的boss是后续nio处理中的selector的角色,主要作用是用于处理客户端的连接,当连接后将其分发给worker进行实际的数据处理。也就是boss主要的作用是监听,而worker才是实际业务逻辑的处理线程,以此避免阻塞。此后初始化一个初始化器,用它来进行实际参数的指定。首先需要对于boss和worker的线程组进行指定,上述的代码已经完成初始化。此后指定一个通道的处理类,声明服务采用nio的io方式进行处理。后面则是一些其他的配置参数,例如超时时间等等。最后还需要设置两个内容,其中一个是端口的绑定,指定我们采用哪个端口进行连接,另一个则是实际消息的处理类,下一部分会详细叙述。最后,对于服务进行启动。而在finally中则是统一进行平滑的服务关闭操作。

具体的消息处理

public class NettyWebsocketServerHandler extends SimpleChannelInboundHandler<Object> {
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception{
        super.channelActive(ctx);
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception{
        super.channelInactive(ctx);
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception{
        super.channelReadComplete(ctx);
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception{
        super.exceptionCaught(ctx, cause);
    }

如上,则是实际的消息处理类。当接收到消息时,通过上面的处理类进行实际的处理。包括消息的接收、通道的连接、异常处理等等内容,该类实际是我们处理逻辑的核心组成。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。