龙空技术网

大话Netty-1.1之四大构件

正直帆船vd 135

前言:

而今小伙伴们对“apache和netty”大约比较着重,你们都需要剖析一些“apache和netty”的相关文章。那么小编在网络上汇集了一些关于“apache和netty””的相关资讯,希望朋友们能喜欢,小伙伴们一起来学习一下吧!

上周讲到Netty就是NIO操作的封装,是NIO的一套封装,那么Netty有什么特性,都是哪些大佬公司在用。这些看了对实际开发没啥用,不过也要了解下,至少你面试的时候得答上一两句,面试官才知道你真的了解过吧!

Netty特性:

1.统一的API,支持多种传输类型,阻塞和非阻塞的都支持。

2.拥有比 Java 的核心 API 更高的吞吐量以及更低的延迟 ,得益于池化和复用,拥有更低的资源消耗 ,最少的内存复制。

3.使用简单,发布快速。

Netty谁在用:

Apple、Twitter、 Facebook、Google、Square和Instagram,还有流行的开源项目,如Infinispan、HornetQ、Vert.x、 Apache Cassandra和Elasticsearch,它们所有的核心代码都利用了Netty强大的网络抽象 。反正是大公司,我看了也没认识几个。面试官问到你就说谷歌和苹果吧!反正没错。哈哈哈!

接下来进入主题,Netty 的主要构件块:

Channel;

回调;

Future;

事件和 ChannelHandler。

Channel。目前可以把Channel看做数据的载体。粗暴理解就是Netty看你用Socket好麻烦,我封装成Channel给你用,简单吧!专业一点的说法就是:Netty是对IO/NIO操作的封装,而这些操作基于 Java 的网络编程中,其基本的构造是 Socket,所以其实就是对Socket操作的一套封装。这就是书上说的Netty 的 Channel 接 口所提供的 API,大大地降低了直接使用 Socket 类的复杂性。

回调。一个回调其实就是一个方法,一个指向已经被提供给另外一个方法的方法的引用。这使得后者可以在适当的时候调用前者。这话看的我想吐血,举个例子吧:孙悟空要过火焰山,我给他个锦囊,等他到了火焰山打开锦囊里面有个芭蕉扇,嘻嘻开心不?我先准备好锦囊相当于我们代码先写好个方法,准备被调用!孙悟空到达火焰山就是一个契机,就是上文所说的适当的时候,这时候打开锦囊就相当于调用我们的锦囊也就是调用方法。这个锦囊(方法)就是回调!!再上个Netty代码你就懂了,如图先写好当一个新的连接被建立的时候调用什么方法,然后就等着触发调用

Future。Future 提供了另一种在操作完成时通知应用程序的方式。这个对象可以看作是一个异步操作的结果的占位符;它将在未来的某个时刻完成,并提供对其结果的访问。

举个例子你就懂了:爸爸让儿子打电话给学校 怕儿子不知道怎么处理,写在纸上说:如果对方是语文老师你就说老师我语文作文写好了,如果对面是班花儿子就挂电话(苦逼程序员不需要爱情) 这些操作都是在打电话之前,处于未来即将发生的。所以这也是为啥英文是Future!

看了上面代码你会发现,突然多了些Listener鬼代码,有什么用?简单!JDK 预置了 interface java.util.concurrent.Future,但是其所提供的实现,只允许手动检查对应的操作是否已经完成,或者一直阻塞直到它完成。而你看到的上图返回的是ChannelFuture提供了几种额外的方法,这些方法使得我们能够注册一个或者多个 ChannelFutureListener实例。监听器的回调方法operationComplete(),将会在对应的操作完成时被调用。

就是说我不去检查了。太累!你好了用事件告诉我,我这里监听事件就行了。这样就不用一直阻塞着也不用手动检测!注意,这里也是用了回调的方法,先在监听事件里写好回调,到时候被调用即可。

通过事件监听和回调有什么好处,每个 Netty 的出站 I/O 操作都将返回一个ChannelFuture;也就是说,它们都不会阻塞。线程可以去处理其他事的同时等事件通知他处理,正如我们前面所提到过的一样,Netty 完全是异步和事件驱动的。

事件和 ChannelHandler。刚才你通过代码和我讲的已经接触了事件和 ChannelHandler。事件容易理解,那么另外的ChannelHandler就是我们主要写逻辑的地方,看英文后缀都知道handler就是处理器,所以ChannelHandler就是处理事件的逻辑代码,业务代码。

需要注意的是,往往一个处理器是不足够处理我们得需求的。所以这里Netty提供了处理器链,就相当于加工流水线,每个处理器就是工人,每个事件都会让工人看看是不是需要你加工下,如果加工的话,做什么处理,处理完记得流给下一个工人,以此反复操作。

总结一句话,Netty的异步编程模型是建立在Future和回调的概念之上的,而将事件派发到ChannelHandler的方法则发生在更深的层次上。就是说Netty完全是异步和事件驱动的,而事件发生后,由一位神秘嘉宾通知到ChannelHandler处理器去加工。

神秘嘉宾是谁?是EventLoop。Netty在内部,将会为每个 Channel 分配一个 EventLoop,用以处理所有事件,其中就是有个功能:将事件派发给 ChannelHandler

讲到这,脑子大概就对Netty有个大概的了解,大概的框架。如果没有。emn...周董快出新歌了,期待下吧!

标签: #apache和netty