Get netty的魅力 从核心组件到工作原理

  生活不只有眼前的苟且,还有远方的凑合。

  工作不只有眼前的CRUD,还有远方的netty、linux内核、网络原理、1000+算法...

  洗干净,排好队,一个一个来!

  感受netty的魅力,很多知识来源于《netty》实战这本书。

正文在努力生成中。

一生编程中必须要翻过的山:通信

  这可能需要一些前置知识,比如网络原理,通信协议。

  凡是线上运行的程序,需要有用户和服务器的交互,凡是有用户数据产生的事情,都要用到通信,都要用到传输。也就是说,如果你不想一直写CRUD,像通信这种知识是必不可少要掌握的,它将会给你未来的职业生涯带来无限的可能性。

  而netty是一个封装的非常丝滑的通信框架。借助它能带来意向不到的提升。

魅力第一点:NIO

  非阻塞,多路复用模型,基于这点,让一台服务器连接上万个客户端成为可能。

魅力第二点:异步与事件驱动

   异步也是加快想用的个非常有效的手段,它改变了传统的通信模型(一个请求必须等到返回结果才返回)。 举个栗子,这好比我要接客,来了第一个人,我在处理他的需求,然后来了第二个人就站在门口等待,但是门口只能站有限的人。一旦门口占满了,就不能再接客了。如果使用异步的通信模型,那就是来一个人把需求告诉我然后就可以离开了,等我完成他的需求,打电话通知他来取就行了。这样门口就被让出来了,我就能接更多的客。这一点也说明上边的为什么基于NIO和异步,让一台服务器连接上万个客户端成为可能。

魅力第三点:一个优秀的框架,它替你想好了并实现了百分之八十的需求

  这点就要稍微了解一下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的引用。

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

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

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

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

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

netty核心组件三

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

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

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

  

~ 天亮了,今天就到这里,讲明白了netty中的核心组件,已经之间的关联关系。我要睡一会去上班了。今天晚上或者明天继续搞他们的工作原理,以及顶级的设计思想。

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值