Netty是目前无论是国内还是国外各大互联网公司必备的一个网络应用框架。Netty本身既然是网络框架,处理的基本都是与网络相关的这样的一些作用。由于Netty本身在设计上的一些非常巧妙的方式,是对于NIO的一个很好的实现。Netty在各种应用场景下都会得到很广泛的应用。无论是传统的基于http的这种短连接方式还是基于底层Socket的这样的访问方式。另外还支持H5中规范中新增加的一个特别重要的标准,就是关于长连接的websocket这样一种新的规范。Netty对于其提供了非常好的支撑。那么Netty本身其实从我个人的经验和学习的匹配来看,他的学习的曲线呢应该是比较陡峭的,换句话说学习Netty要掌握的一些无论是理论还是具体的一些关于并发的理解,都是涉及其中的。那么这篇文章除了介绍Netty,也会介绍和Netty相关的一些重要的技能,包括底层和基础的理论知识。无论你之前是不是在项目当中使用过Netty,或者是说仅仅使用Netty写过一些非常简单的练习程序。又或者对于Netty压根就没有一个很清晰的认识,根本就不知道Netty是干什么的。不管你是处于什么样的一种技术水平之上,我相信通过这篇文章的学习,大家都会对Netty有一个非常好的理解和把握。除了在这种非常大的互联网公司使用Netty之外,如果你有机会面试互联网公司开发职位的话,其实Netty或多或少都是会被提及的一个很重要的面试的点。当然在面试的时候会问你关于Netty相关与并发相关的一些很基础和重要的,也可能是很理论的一些内容。
我们先来了解一些关于Netty的介绍性的内容,帮助大家对Netty有一个很直观的理解,不着急上来就写程序。写程序之前你得知道你要编写的程序到底是干什么的对吧?我们先看下面关于Netty简短的介绍
“Netty是一个异步的,驱动的网络应用框架”。
其实这句话描述了有三点。第一点Netty是一个异步的;第二点它是一个事件驱动的;第三点它是一个网络框架。
一:异步
我们首先来介绍异步:其实Netty的很多API都是异步的,这一点和我们经常写的那种传统比如struts、mvc等框架的编程模式有不太一样的地方。如果我们按照传统的这种mvc框架编写代码的话,就拿SpringMvc来说吧,或者Springboot道理都差不多:我们首先去定义自己的controller,然后实现若干的方法。每个方法上会指定一个url映射的一个地址。当用于请求了与之映射的url地址之后,并且携带了对应的参数。那么,请求就会映射到对应的controller方法上面。映射完方法之后再完成一些参数的装配,校验等基本逻辑。紧接着内开始进行调用,可能是调用service相关代码。完成一些真正的业务处理。处理完之后呢我们把结果返回给客户端。不管Struts还是SpringMvc,基本的逻辑都差不多。只不过实现方式有一些差别。
这就是很传统的代码编写方式。然而Netty呢是有比较多差别的。它本身之前也说了是一个异步的,换句话说呢,就说当我们执行完一个回调或者处理逻辑之后,实际上这个事情到底完成了吗,其实是不一定的,它有一个相应的回调,一般是通过监听器呢来去实现后续的一些逻辑的判断。比如说:当把一个消息你想发给用户,那么这个消息发出去之后,其实流程立刻就返回了,并且往下去执行,但是这个消息真正是不是达到客户端,其实是不一定的。它说通过相应的监听器作为一个回调的方式来去跟不同的状态决定这个消息到底是否真的发出去了,还是说在处理过程当中出现了异常等等,都是通过监听器的方式来进行进一步的判断。相应的这个发送消息这样的处理逻辑,其实调用完之后立即就返回了。它并没有真正的把消息发送出去,发送成功与否是由回调或者说是监听器进行判断的。这就是所谓的异步。那么,异步相对于同步来说复杂性就会提升很多。其实大家都知道,无论是Netty还是Node本身都是基于异步的这种线程模型。既然是异步,它比同步一定是复杂很多。因此大家一定要理解异步底层到底是如何进行处理的。我们如果去编程更好的代码。编写更健壮的代码。
二、事件驱动
什么叫事件驱动呢?对于Netty来说,它本身实现了很多的协议。这个协议来说呢其实是由一个一个阶段来构成的。举个简单的例子,像我们使用的WebSocket这种长连接的方式,让客户端和服务器端的能在一个持续连接上进行双向的这种数据通信,实际上就是一种分工的网络通信。对于这种方式来说呢,其实WebSocket本身是基于http的。首先呢,对于客户端来说,要发送一个http的请求,请求完之后会升级到一个WebSocket的协议之上。一旦链接建立好之后,客户端与服务器端实际上可以进行一个双向的数据通信。那么,在整个过程当中实际上会发生很多很多的事情,这些事情本身就对应着一个一个的事件。而Netty是将这些事件根据协议的规范,将这些事件一个一个都抽取出来,形成一个一个的回调方法,使得开发者只需要去处理相关的回调方法就OK了。
比如说在这个连接建立好之后,我们去重写一些相应的方法,实现相应的代码。如果获取到客户端发送过来的数据,这个事件一旦发生之后,Netty就会将流程转向一个特定的读方法。对于开发中来说只需要去覆写对应的读方法就可以了。当这个数据过来之后,这个read方法就会得到调用。那么,当连接处于不活跃状态之后,它有对应的回调方法。当连接一旦关闭掉,不管是服务器关闭还是客户端关闭,会回调一个相应的关闭的方法。实际上就是将一个一个的事件给抽取出来,抽取出来之后将这些事件映射到对应回调方法上面。那么,当这个事件一旦发生一直,那么相应的回调方法就会得到立刻的调用,从而进行业务代码的执行。这就是所谓的事件驱动的概念。
三、网络框架
这个就不多说了。
Netty的相关入门理论知识就介绍到这里,有不懂的或者基础都没有的,获取相应教程的,都可以+秋秋 14 012345 14
总结
其实你在学习Netty的时候并不仅仅是对Netty本身有一个很好理解,有很多的项目都是或多或少使用了Netty或者是基于了Netty,比如说像大数据处理中的Spark框架,它本身也是基于Netty。所以Netty学习好了之后,会对于你未来的无论是从事何种技术的学习都带来一些帮助,而且这些帮助有一些你根本就感觉不到。当你遇到了对应的你想学的技术之后,你会发生底层都是基于Netty框架的,Netty我已经学过了,所以你会更有信心地去学习你想学的技术。这就是学好一个基础给你带来的好处!
原文地址:https://www.cnblogs.com/java14/p/11395455.html