netty全部核心组件

 看看netty为我们提供的核心组件 一

  1. channel:netty中把一个端到端的通信定义为了通道。所谓的端包含但不限于硬件设备,文件。这是对通信的第一层抽象。通道也是一个连接。
  2. 回调:这个回调是netty的一个机制,我用生活的栗子来解释。理解下边的一句话:"等发工资了,就买一个新手机;如果有女朋友了,就带她去吃好吃的"。其中买手机和带女盆友吃好吃的是预定于好要做的事情,这就是netty中将要回调的事情。而发工资是实践驱动,如果不发工资,那么预定义好的事情都不能做。如果发工资这件事情发生了,那么就发生回调。在netty中,定义包含了回调的组件就是 ChannelHandle,真正的回调就是 ChannelHandle 中的channelActive()方法。
  3. Future:未来结果的占位符。还是先用生活的栗子来将这个未来占位符的概念,其实不难懂。 就好比方买房子,你买之前肯定有计划打算,就买四居室,自己和女朋友住一间,父母住一间,并且打算好了要两个孩子,那就需要两个卧室。但是现在还没有孩子,你依旧预留好两间卧室。这就是未来的占位符,等有了孩子这件事情发生了,那么这个卧室就可以被用了。这也很好的体现了netty的基于事件驱动的思想,给异步非阻塞带来了可能性。这对应我们程序中的就是一个方法,调用另外一个方法,但是前者调用的方法定义好了拿到结果以后怎么做。并告诉被调用者怎么做。再举一个栗子,你想要给女朋友预定一个生日蛋糕,于是你去了蛋糕店,你跟老板说,给我来一个米其林蛋糕,如果做好了,送到 XXX。你调用了蛋糕店老板去完成做蛋糕的这个动作,并且定好了这个动作完成后执行的动作。JDK预置interface  java.util.concurrent.Future ,但是其所提供的实现,只允手动检查对应的操作是否已完成,或者一直阻塞直到它完成。这是非常繁琐的,所以Netty提供它自己的实现——ChannelFuture ,用与执行异步操作的时候用。
  4. 事件和channelHandle。事件又是怎么一回事呢,什么是netty中的事件?前边一直提到netty基于事件驱动。那么什么又是事件:举个栗子,还说上边发工资买新手机的栗子,其中买手机这个动作就是事件。考虑到扩展性,所有的动作成为是事件,实际上发了工资你不光能买手机,还能和同事出去撮一顿,还能买房子。那么对应程序中,处理业务逻辑,打印日志,等等操作就是事件,这些都由你来定义。而netty给我们实现好的事件就包括了:处理SSL,编码与解码。把要做的事情一件一件的列出来,然后放在channelHandle里边等着去执行。

 那么核心组件,基本上已经确定了事情怎么干,大致已经又了一个雏形。接下来再看看netty给我们实现了哪些

netty核心组件二

  • 程序引导器
  • Channel
  • EventLoop 
  • ChannelFuture
  • ChannelHandler 
  • ChannelPipeline

  这也是netty的魅力所在,感觉就像是发射火箭一样。先准备引导程序,接下来完成通信的壮举。又像是在造汽车,先准备好了一些零件,又准备了一个劳斯莱斯的车架子。来看看这些零件是如何被一个一个填充到车架子里边的。

  1. 引导器
  2. Channel  -- socket 连接。 channel 就像是“披着羊皮的狼”,为什么这么说,它其实是一个外表看着简单,但是里边封装了复杂的socket操作。把温顺的API给你提供出来。
  3. EventLoop ,这个称为任务分发器。这个先简单的介绍,下边会有一个专题来讲EventLoop 模型。
  4. ChannelFuture,这个上边讲的比较清楚了,事件占位符、异步通知的内容。
  5. ChannelHandler  ,上边也讲的比较清楚了,它就是用来承载事件的。
  6. ChannelPipeline,这个是本文第一次提到。这个其实就像是任务清单列表,你在本本上写了:吃早饭-——> 上班 ——> 吃午饭——> 午休——> 上班——> 加班 ——> 下班并接女朋友回家 ——>  继续些博客。 你要把待完成的事件列在本本上,ChannelPipeline 就像是这个本本,它记录了哪些动作要执行。 所以它和 ChannelHandler  对应关系就是下图:其中我连接成橙色线是想说,可以通过ChannelHandler  拿到 ChannelPipeline的引用。netty全部核心组件_第1张图片

 我觉得有比较讲一下,这几个关系,他们是如何在一起工作的。

netty全部核心组件_第2张图片

 EventLoop 实际上就是对应的服务器端的真正干活的线程。并且EventLoop和线程 是一对一的关系。

 Channel 是依附于 EventLoop 的,Channel  与 EventLoop 是多对一的关系。在Channel (一次通信过程中)中只注册在一个 EventLoop 上。

  Channel 与 ChannelPipeline ,是包含关系。Channel 一次通信包含了要处理的事件列表 ChannelPipeline。

  ChannelPipeline 和 ChannelHandler 上边有说过了,他们是一多的关系。

netty核心组件三

  引导器:这就像是最终的纽带,它讲上边的组件组装引导为客户端或者是服务端。所谓的引导器实际上就像是飞机起飞前,飞机本身具备了飞行的能力,但是它还是有引导车把飞机拖到了正确的起飞航道上。

  Bootstrap 为客户端的引导器,也就是由它引导出来一个客户端;ServerBootstrap 为服务端的引导器。

  其中服务端引导器需要一个 EventLoopGroup (就是EventLoop的集合,一个EventLoopGroup 里边包含了多个 EventLoop) ,而服务端需要两个EventLoopGroup ,原因就是:服务端要使用一个绑定本地的一个端口。

用一个经典的服务端客户端案例,看一下上文提到的所有的核心组件是如何在一起工作滴

 请看我的另外一篇文章

一个超级简单的使用netty NIO实现服务端和客户端的栗子

你可能感兴趣的:(Netty)