中间件核心技术与实战
丁威
中通快递资深架构师,RocketMQ 社区首席布道师
19674 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 33 讲
中间件核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

08 | Netty:如何优雅地处理网络读写,制定网络通信协议?

你好,我是丁威。
上一节课,我们介绍了中间件领域最经典的网络编程模型 NIO,我也在文稿的最后给你提供了用 NIO 模拟 Reactor 线程模型的示例代码。如果你真正上手了,你会明显感知到,如果代码处理得过于粗糙,只关注正常逻辑却对一些异常逻辑考虑不足,就不能成为一个生产级的产品。
这是因为要直接基于 NIO 编写网络通讯层代码,需要开发者拥有很强的代码功底和丰富的网络通信理论知识。所以,为了降低网络编程的门槛,Netty 框架就出现了,它能够对 NIO 进行更高层级的封装。
从这之后,开发人员只需要关注业务逻辑的开发就好了,网络通信的底层可以放心交给 Netty,大大降低了网络编程的开发难度。
这节课,我们就来好好谈谈 Netty。
我会先从网络编程中通信协议、线程模型这些网络编程框架的共性问题入手,然后重点分析 Netty NIO 的读写流程,最后通过一个 Netty 编程实战,教会你怎么使用 Netty 解决具体问题,让你彻底掌握 Netty。

通信协议

如果你不从事中间件开发工作,那估计网络编程对你来说会非常陌生,为了让你对它有一个直观的认知,我给你举一个例子。
假如我们在使用 Dubbo 构建微服务应用,Dubbo 客户端在向服务提供者发起远程调用的过程中,需要告诉服务提供者服务名、方法名和参数。但这些参数是怎么在网络中传递的呢?服务提供者又怎么识别出客户端的意图呢?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Netty框架为网络编程提供了高层次的封装,使开发人员能更专注于业务逻辑的开发,而将网络通信的底层交给Netty来处理。本文从通信协议、线程模型等共性问题入手,重点分析了Netty NIO的读写流程,并通过实例教授了如何使用Netty解决具体问题。文章介绍了制定通信协议的方法,以及通过协议头+Body的设计理念来解决粘包问题。此外,文章还详细解释了Netty的线程模型,包括Boss Group线程组、Work Group线程组和扩展机制的设计,以及业务线程的处理流程。读者通过本文可以深入了解Netty框架的特点和使用方法,以及在网络编程中的一些常见问题和解决方案。文章还介绍了Netty的网络读写流程,包括如何处理网络读写事件以及业务线程与IO线程的协作过程。整体而言,本文为读者提供了深入了解Netty框架和网络编程的宝贵资源。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《中间件核心技术与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(6)

  • 最新
  • 精选
  • 防腐基
    讲的不够通俗易懂

    作者回复: 你好,能否帮忙提提具体意见不,让我知道你具体的疑惑的点。弱弱的说一句,我们真有“缘”呀,你在我生日那天提的问题,我的个人微信dingwpmz,期待我们能够再细细交流。

    2022-12-18归属地:湖北
  • Geek_1cd0c8
    问题:将数据写入网络最终通过socket的read,write接口吧,为什么还需要注册读写事件和开辟不属于socket的读写缓存 作者回复: 首先需要明确的是,通过Socket的write方法写入数据,并不需要注册写事件,那在什么时候需要注册写事件呢? 是在通过调用 SocketChannel的write方法,返回写入的字节数为0,但应用程序本次数据并未全部写入到通道中,这个是需要注册写事件,等待底层网络通知应用程序,该通道可以继续再写入,应用程序的事件选择器将会再次选择该通道,让应用程序可以继续写入 那在什么时候会出现写入的字节数为0呢,这个是与tcp的通信与拥塞控制有关,因为我们知道,tcp传输是 可靠传输,发送端将数据发送给接受端,如果接受端接受后,会通过ack机制告知发送端数据已接收,那发送端就可以把这些数据从底层的缓存区中删除,相反,如果接受端没有发送ack,则发生端底层会重新发送,直到收到ack,但发送端接收缓存区是有大小限制的,一旦缓存区满了,应用程序就无法通过该网络通道继续发送数据,注册写事件,就是等缓存区有空闲时,就会通知应用程序 那为什么Netty的Channel内部还要维护一个缓存区呢?这个缓存区,是为了存储应用程序待发送的数据,因为如果底层的缓存区满了后,未发送完的,需要有一个地方存储,这个缓存区就是用来存储这个用的,这个缓存区,还有一个作用就是确保数据的顺序发送,因为一个底层网络通道,会被多个线程共享用来发送数据,这样可以确保一个线程发送时,会锁这个队列,然后完整存储一个数据包,另外一个线程才可以继续写
    2023-03-24归属地:天津
    1
  • Dylan
    Java看得真累
    2022-09-15归属地:上海
  • William Ning
    不是Java开发者,而且文章看有点懵~需要捋捋
    2022-07-17
  • 雨落~紫竹
    滴 追番卡
    2022-07-03
  • 冠生!🤪
    netty 的nioEventLoopGroup 默认线程数不等于cpu核数,而是cpu核数*2啊。
    2022-07-02
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部