Java 并发编程实战
王宝令
资深架构师
72486 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
学习攻略 (1讲)
Java 并发编程实战
15
15
1.0x
00:00/00:00
登录|注册

39 | 案例分析(二):高性能网络应用框架Netty

EventLoopGroup
EventLoop
Reactor类
类结构图
Reactor模式
非阻塞式(NIO)API
BIO模型
深入理解Netty的线程模型
线程模型设计
Netty的优化
用Netty实现Echo程序服务端
Netty中的线程模型
Reactor模式
网络编程性能的瓶颈
总结
主题:Netty框架中的线程模型
标题:案例分析(二):高性能网络应用框架Netty
文章

该思维导图由 AI 生成,仅供参考

Netty 是一个高性能网络应用框架,应用非常普遍,目前在 Java 领域里,Netty 基本上成为网络程序的标配了。Netty 框架功能丰富,也非常复杂,今天我们主要分析 Netty 框架中的线程模型,而线程模型直接影响着网络程序的性能
在介绍 Netty 的线程模型之前,我们首先需要把问题搞清楚,了解网络编程性能的瓶颈在哪里,然后再看 Netty 的线程模型是如何解决这个问题的。

网络编程性能的瓶颈

《33 | Thread-Per-Message 模式:最简单实用的分工方法》中,我们写过一个简单的网络程序 echo,采用的是阻塞式 I/O(BIO)。BIO 模型里,所有 read() 操作和 write() 操作都会阻塞当前线程的,如果客户端已经和服务端建立了一个连接,而迟迟不发送数据,那么服务端的 read() 操作会一直阻塞,所以使用 BIO 模型,一般都会为每个 socket 分配一个独立的线程这样就不会因为线程阻塞在一个 socket 上而影响对其他 socket 的读写。BIO 的线程模型如下图所示,每一个 socket 都对应一个独立的线程;为了避免频繁创建、消耗线程,可以采用线程池,但是 socket 和线程之间的对应关系并不会变化。
BIO 的线程模型
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Netty是一个高性能网络应用框架,其线程模型对网络程序性能有着直接影响。文章首先介绍了网络编程性能的瓶颈,指出BIO模型适用于连接不多的场景,但无法解决百万连接的问题。随后,文章引入了Reactor模式,解释了其类结构图和核心逻辑。接着,文章详细介绍了Netty中的线程模型,强调了EventLoop的重要性以及bossGroup和workerGroup的作用。最后,文章通过示例代码演示了如何用Netty实现Echo程序服务端,并总结了Netty的优化和线程模型设计。总的来说,本文深入浅出地介绍了Netty框架的线程模型设计和实现原理,对于想要深入了解网络编程和Netty框架的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 并发编程实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(33)

  • 最新
  • 精选
  • 那只羊
    QQ怪:Netty可以先从《Netty实战》开始,虽然翻译得一般,但是对于它的整体及各个组件你都能了解到;再就是调试源码来了解它了;最后应用到项目中去啦,比如实现一个简单的RPC,一个IM之类的

    作者回复: 👍感谢回复!

    2019-05-28
    33
  • QQ怪
    老师,学习netty除了学习老师的专栏还有什么从入门到专精的学习路线吗?

    作者回复: 热心同学回复了,我再加一点就是把网络编程的基础搞好

    2019-05-28
    17
  • 墙角儿的花
    这是我读过的最好的netty基本原理介绍

    作者回复: 😄

    2019-09-09
    10
  • Sunqc
    我想知道老师后续有发布新的课程吗,喜欢你的课程

    作者回复: 感谢信任😄写不动了😂😂😂

    2019-05-28
    2
    5
  • 张德
    谢谢老师讲这个reactor模式 我最近要优化的系统主体就是采用这个模式 今天看了一天都云里雾里的 看到这篇文章瞬间有了一种有章可循的感觉

    作者回复: 对你有帮助就好😄

    2019-05-29
    4
  • 蓝山
    网络通信程序性能设计重点要关注三个方面: 1、网络传输方式:同步阻塞方式、异步非阻塞方式; 2、数据序列化:Java序列化(基本不能考虑)、protobuf、jason、Avro等等; 3、网络IO处理线程模型:同步阻塞IO、同步非阻塞IO、IO多路复用(Reactor模式)、AIO异步IO; Netty在应对解决上述三个问题中提供了比较完善的方案。采用IO多路复用机制实现网络传输,同时配合灵活的reactor实现模式,支持通过编码灵活选择不同的reactor模式以应对不同负载和性能要求的场景。同时提供了完善的异步事件驱动实现和API,为开发人员提供了如何获取数据、数据编解码、编解码之后业务处理线程具体在哪个线程执行、编解码之后消息如何派发等等灵活且方便的机制。同时在协议层面直接支持了通用的网络通讯协议,同时对于扩展针对个性化性能需求的私有化协议定制提供了便利的开发工具支持。

    作者回复: 👍🏻

    2020-09-01
    2
  • sswrock
    看了 Doug Lee的 “Scalable IO in Java”,对于做个Swing GUI开发的人豁然开朗, 感谢宝哥 和 DougLee

    作者回复: 客气客气,我就是借花献佛😄

    2019-12-01
    1
  • 潭州太守
    老师,Reactor可以理解是Actor模式的一种吗

    作者回复: 我没这么想过😂思路上好像也有相通的地方,不过感觉还不是

    2019-06-04
    1
  • 反过来说的话就是一个线程有多个EventLoop 一个EventLoop有多个网络连接 对吧

    作者回复: EventLoop 和 Java 线程是 1 对 1 关系

    2019-09-24
  • 墙角儿的花
    问下老师,im服务端除了用netty,是不是用go的协程也好,连接和协程1对1服务,感觉这个场景下go协程并发能力绝对在netty之上啊

    作者回复: 协程最终也是依靠线程执行,所以理论上没有这种结论

    2019-09-09
收起评论
显示
设置
留言
33
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部