热门话题白皮书HR资料
纯干货|Java工程师高薪必备-Netty入门到实战
2024.02.02


温馨提示:本文深度好文,建议好好看哦~


Netty自2008年诞生至今,也走过了12个年头。一款框架产品能够在12年的生命历程中不断演进,不断进化,没有随着时间而销声匿迹,反而被越来越多的人熟知、使用,自有其魅力所在。


大体而言,Netty已经确定了其在Java网络领域开发的霸主地位,正如同在企业开发中Spring的地位一般。


作者早期所在的公司内,一个项目组因为觉得网络部分的交互内容比较简单,不想使用框架而尝试直接基于NIO编写网络交互层。由于技术人员对NIO也算相对熟悉,项目的网络交互层很快就开发完成,随后业务基于其上进行业务开发。


但是很快噩梦接踵而来,网络交互层总是不能稳定,偶尔性的出现一个BUG还难以排查。因为网络交互层面都是并发度很高的设计,因此出现bug后,定位总是要很长的时间,还不能确保成功。甚至有些时候,由于现场信息不足,始终无法复现BUG,部分的bug就不了了之了。受困于网络交互层的不稳定性,业务开发的进展也不太顺利。


这个案例可以充分的反映开发一个健壮的、稳定的网络应用的挑战难度。并非不可能,只不过确实耗时耗力。毕竟API调用顺利,完成一个demo做技术验证和工业生产级别的项目之间的差距着实很大,很多细节都需要时间来打磨。


而真正做项目的时候这些时间成本的付出往往是不可接受的。


Netty的存在帮助我们解决了这个问题,它是一个网络IO编程框架,将网络编程的复杂性隐藏起来,为开发者提供了简单易用的API,即使只是初级工程师也能使用Netty开发出高质量的网络应用。


协议支持,高性能,高可靠,高稳定,这些特性Netty通通都为开发者考虑到了,简单的几句代码便能运行起一个工业级的网络项目。这使得Netty成为了事实上的Java网络应用开发标准。


因此,使用Java语言的开发者,掌握和熟练使用Netty,就很有必要了;正如如今进行企业开发,掌握和熟练Spring一样。


了解了Netty在实际开发应用中的重要性之后,下面我将带领大家 详解Netty 的线程模型从演进的角度看源码设计,但由于篇幅有限,本文只截取了正文的部分内容,如果看完下面这部分,你还想更近一步的详细了解学习的话,可以点击阅读原文,直接免费观看本篇剩余全文



Part 

01

Netty的线程模型



Netty 的线程模型其实没有什么太特别的地方,属于比较自然而然的设计。


首先,基于Selector可以同时监控多个链接的特性,很容易想到将所有通道都注册到一个selector对象,然后死循环获取通道上的就绪事件并且进行处理。


这就是最朴素的设计,也就是作为的单线程模型。这种模式,比较适合客户端,用于服务端的话,因为线程数太少,无法有效的利用多核 CPU 的处理能力。


单线程无法有效的利用 CPU,而且在一个 Selector 上管理太多的链接,效率也会下降。很自然的想到利用多线程提升效率。如何使用多线程按照不同的方向扩展又有所区分。


单线程模式中的点在于两个:

  • 单个 Selector 关注了太多链接,导致一次取出的集合可能很大,遍历耗时太多

  • 所有的链接事件都在一个线程中处理,处理完才能处理下一个链接,导致在后面的链接长时间的等待


根据这两点,对应的也有两种扩展模式。


模式一

针对单个Selector的问题,创建一组Selector对象,将链接的就绪检查平均的分配到每一个Selector对象上。并且为每一个Selector对象,绑定一个线程,线程自身执行一个死循环的就绪检查。


每当有一个新的链接对象时,使用轮训或者其他策略从Selector组中选择一个Selector,将链接注册上去。可以形象的用图来看:



模式二

解决单线程处理链接就绪事件的法子很容易想到就是线程池。这种就成了派发模式。主线程检查通道的就绪事件,发现就绪事件后,将就绪事件的处理逻辑包装为为一个任务,提交到线程池中处理。


提交到线程池的处理速度是十分快的。提交完毕后,主线程继续执行select方法,监控通道的就绪事件。可以形象的用图来看:



对于模式一,一般称之为多主模式。而模式二,因为在就绪事件的处理阶段引入了线程池,常称之为多线程模式。


对于模式一而言,还会有细化的演变。使用一组 Selector 来无差别的服务服务端链接和客户端链接显得职责有些不清晰。因此会将 Selector 分为两组:

  • 第一组,只服务于服务端链接,其绑定的线程处理客户端接入就绪事件。如果应用程序只有一个服务端监听链接,那么该组的大小为 1.

  • 第二组,只服务于客户端链接,其绑定的线程处理客户端读写就绪事件。该组的大小有几种思路,比如 CPU 内核数+1,比如 CPU 内核数的 2 倍


这种演进模式由于具备了明显的职责区分,常称之为主从模式。大多数公开的材料,博客,Netty 官网以及《Netty 实战》等介绍的 Netty 写法,都是使用主从模式。主从模式可以表达为:



实际当中,这几个模式并不会互相排斥,比较常见的有将主从模式和多线程模式结合在一起使用,此时这种模式就是多线程版本主从模式。


Netty 对线程模式的支持主要体现在EventLoopGroup的配置支持上。通过配置不同个数的EventLoopGroup以及在不同地方配置EventLoopGroup,Netty 可以实现从单线程模式变化为多主模型,再演化为主从模式,最后终极的就是多线程版主从模型。


可以看到,整个模型的演进其实是很自然的事情,并不如一些文章中说的特别精巧或者特意的设计。是一种职责梳理后,根据需要扩展的点,很清晰,很容易就能想到的设计方案。



Part 

02

Netty线程模型涉及的类



NioEventLoopGroup: 

负责管理 NioEventLoop


NioEventLoop

实际的线程本身,负责执行具体的 IO 任务和用户任务。


由于篇幅有限,以上两部分只给大家列出了提纲,具体详解内容可以点击文末“阅读原文”免费观看学习


当然以上内容只是Netty 开发实战必备内容的一小部分,如果你想真正学懂的话,还需要掌握以下内容:



……


相信看到这里的同学肯定会知道,我要开始售卖了,没错,那就大大方方开始了


以上内容全部节选自《Java岗高薪必备:Netty从入门到实战30讲》,专刊从入门到实战循序渐进地讲了Netty该如何学习,并且从源码分析的角度入手,手把手带你从源码的层级上分析整个Netty的实现。


专刊适用人群


  • 想要进行网络编程却缺乏相关知识

    学习和掌握Netty需要了解IO和多线程方面的知识,基础的缺乏会使得学习进展缓慢。希望掌握基础知识,使得学习Netty能够事半功倍。

  • 大致了解Netty,希望能在项目中上手

    学习了理论知识,但是具体在项目中实践需要解决问题时又觉得无从下手。希望可以更详细的掌握Netty,并且在实战项目中验证理论知识。

  • 会使用Netty,但是遇到问题不会定位

    会使用Netty,但是项目中遇到问题时,由于对源代码不熟悉,定位问题困难重重,只能依靠上网搜索相似案例。希望可以深入源代码,分析其中的设计关键。


学完之后,你将会获得:


  • 对Java中几种IO实现模式的了解

  • 掌握使用Java NIO开发的能力

  • 掌握使用Netty开发项目的能力

  • 深入理解和掌握Netty的设计精髓,诸如并发安全保证,设计原理,重点算法等

  • 从源码的深度掌握Netty重点设计背后的代码细节和思路

  • ······


当然福利也是必不可少的部分!

12.2-12.12双十二特惠期间

原价69元Netty从入门到实战30讲

仅需40元就可以到手

PS:目前专刊已经全部更新,现在购买即可学习全部内容


👉点击链接立即优惠报名:

https://www.nowcoder.com/order?itemId=356&itemType=ZHUANLAN&couponId=DVZKroF


报名之后进入个人主页,在 学习-已购-专刊 这里,找到本专刊,点击开始学习即可~



当然如果你只想学习本篇剩余内容的话,一定要记得点击 阅读原文 进行免费学习哦~



点击阅读原文免费学习本篇剩余内容

▼▼▼

▼▼▼