龙空技术网

Netty之服务端启动流程

JAVA破局之路 347

前言:

而今咱们对“netty 服务端”大致比较讲究,兄弟们都需要知道一些“netty 服务端”的相关内容。那么小编也在网上收集了一些关于“netty 服务端””的相关内容,希望我们能喜欢,小伙伴们快快来了解一下吧!

上一节我们学习netty的入门demo, 简单编写了客户端服务端相关实现代码. 我们再来回顾下服务端代码如下:

 public static void main(String[] args) throws Exception {        //创建两个线程组 boosGroup、workerGroup        EventLoopGroup bossGroup = new NioEventLoopGroup();        EventLoopGroup workerGroup = new NioEventLoopGroup();        try {            //创建服务端的启动对象,设置参数            ServerBootstrap bootstrap = new ServerBootstrap();            //设置两个线程组boosGroup和workerGroup            bootstrap.group(bossGroup, workerGroup)                    //设置服务端通道实现类型                    .channel(NioServerSocketChannel.class)                    //设置线程队列得到连接个数                    .option(ChannelOption.SO_BACKLOG, 128)                    //设置保持活动连接状态                    .childOption(ChannelOption.SO_KEEPALIVE, true)                    //使用匿名内部类的形式初始化通道对象                    .childHandler(new ChannelInitializer<SocketChannel>() {                        @Override                        protected void initChannel(SocketChannel socketChannel) throws Exception {                            //给pipeline管道设置处理器                            socketChannel.pipeline().addLast(new MyServerHandler());                        }                    });//给workerGroup的EventLoop对应的管道设置处理器            System.out.println("服务端已经准备就绪...");            //绑定端口号,启动服务端            ChannelFuture channelFuture = bootstrap.bind(8000).sync();            //对关闭通道进行监听            channelFuture.channel().closeFuture().sync();        } finally {            bossGroup.shutdownGracefully();            workerGroup.shutdownGracefully();        }    }
首先我们创建了两个NioEventLoopGroup,这两个对象可以看做是传统IO编程模型的两大线程组,bossGroup表示监听端口,accept 新连接的线程组,workerGroup表示处理每一条连接的数据读写的线程组,不理解的同学可以看一下上一小节《认识Netty之 hello world》。举个例子,一个项目需求来了要动工,要有一个leader负责和业务沟通接活,然后有很多开发,负责具体搞代码,leader就是bossGroup,开发们就是workerGroupbossGroup接收完连接,扔给workerGroup去处理。下面我们创建了一个引导类ServerBootstrap,这个类引导我们进行服务端的启动工作.我们通过.group(bossGroup, workerGroup)给引导类配置两大线程组,这个引导类的线程模型也就定型了。然后,我们通过.channel(NioServerSocketChannel.class)来指定 IO 模型为NIO,当然,这里也有其他的选择,如果你想指定 IO 模型为 BIO,那么这里配置上OioServerSocketChannel.class类型即可,当然通常我们也不会这么做,因为Netty的优势就在于NIO。接着,我们调用childHandler()方法,给这个引导类创建一个ChannelInitializer,这里主要就是定义后续每条连接的数据读写,业务处理逻辑。ChannelInitializer 这个类中,我们注意到有一个泛型参数NioSocketChannel,这个类呢,就是 Netty 对 NIO 类型的连接的抽象,而我们前面NioServerSocketChannel也是对 NIO 类型的连接的抽象,NioServerSocketChannelNioSocketChannel的概念可以和 BIO 编程模型中的ServerSocket以及Socket两个概念对应上总结一下就是,要启动一个Netty服务端,必须要指定三类属性,分别是线程模型IO 模型连接读写处理逻辑,有了这三者,之后再调用bind(8000),我们就可以在本地绑定一个 8000 端口启动起来

netty逻辑架构图

感觉有收获点个赞,转发下哦

参考文档:

标签: #netty 服务端