java基础-netty详解

nio是net开发中最常被提起的点,而游戏服务器端对这个也是看的比较重。java底层提供了nio但是确实很少见有人直接用他,原因很简单,看netty或者mina的文章都可以看到原因,就是它比较难用,想实现很稳定的商用需要功底很深。
那么网络底层框架解决了这些问题,现在最主流的就是netty,最开始解除游戏行业的时候还是用的mina,mina实现的比较简单易上手,但是功能和灵活度欠缺。改用netty的时候刚好是主程职位,所有的工作都是我来做,所以有更深入了解netty的机会,但是也是被动的,因为公司要用就得研究的比较透啊,不然哪里敢使用。
一转眼使用了很多年了,也就是最开始转用netty的时候进行很深入的了解,net底层实现好了以后,几乎就不会再去管它了。一直都是花时间在游戏业务和团队管理上了。

接下来从经常被问到的一些主要问题分别讲起。
netty的结构?
1.AbstractBootstrap引导程序,无论是服务器端(ServerBootstrap)还是客户端(Bootstrap)都是用它来进行引导的。实例化一个这个对象、设置好内容、绑定端口,开启同步就OK了。
2.EventLoopGroup事件线程池组,它是组,这个组里面管理的就是EventLoop。这里需要两个线程池组,一个是boss一个是worker,boss线程池组个数与绑定的端口数相关,几个端口就设置几个,多了也没有用,它是用来管理外部连接事件的,连接成功创建了channel了就扔到worker里面去管理了。worker线程池组数量默认是核心数*2,它是管理真实连接的地方,当有任何事件的时候就会得到通知在线程池中处理channel的响应。
3.EventLoop事件线程池,线程池大家都可以理解,它里面管理一个执行线程池(但是像epollEventLoop其实是单线程运行的,也就是一个线程池只有一个线程)、一组channel、还有其他的锁;状态;任务队列等。最重要的是各种事件选择器(selector)是在这里面定义,后面会介绍各种selector的区别。
4.channel通道,简单的理解为socket连接的一种抽象,所有的连接都单独抽象成为通道放在EventLoop中管理,当哪个通道有事件了,就生成一个任务执行。worker通道建立是通过ChannelInitializer完成的。
5.ChannelInitializer通道初始化器,每个链接建立的时候,调用初始化器初始化一个channel,并且给channel构造后一个channelPipeline。
6.ChannelPipeline管道,一个channel有个管道,管道的作用就是管理一个责任链,任何事件的执行都是通过这个责任链一层一层执行的。每个责任链环节就是一个channelHandler。

你可能感兴趣的:(java,开发语言,后端)