netty支持哪些协议_【IT新手之路】Netty学习之旅(一)

bc8e7ecc93f21749ddcc4af97f6788a8.png

3e6f7cc6af34f00b3797ea0043e427ff.png

你知道网络架构分层吗?TCP/UDP各有什么优缺点? 你知道网络通信过程吗?一次https请求要经历哪些流程? 你知道网络IO模型吗?c10k问题是如何解决的? 你知道Java如何实现网络编程吗?Netty在Java Nio上做了哪些优化呢?

个人认为,学习知识,应该先构建知识全貌,然后再针对核心知识点进行学习,最终将每个知识点串联起来,融会贯通,即最终要构建我们的知识体系.所以,这篇文章的目的,是让你了解netty在网络编程中的知识全貌,先在脑海里有了这些知识点的概念,才能避免"不识庐山真面目,只缘身在此山中"的问题。

一、Netty是什么

官网: https://netty.io/index.html 

github: https://github.com/netty/netty

Netty is an asynchronous event-driven network application frameworkfor rapid development of maintainable high performance protocol servers & clients.

Netty是一个异步、事件驱动的网络应用框架,用于快速开发可维护、高性能协议服务端和客户端。

下图是netty所包含的组件:

fd1687abfb4e66c3bf22084daaf72f69.png

可以看到netty包含三个模块:

  • Core 核心模块: 可扩展的事件模型;通用的通信api;有零拷贝能力的Byte Buffer

  • Transport Services 传输服务: socket、UDP、http tunnel等

  • Protocol Support 协议支持: http、websocket、rtsp等协议的支持

我们来看看netty涉及到的知识层级划分:

77d3f4026feddb16ae7166b86bcc3c82.png

  • netty可以应用于各rpc框架,如dubbo等

  • netty是基于Java NIO实现的,并在此基础上做了优化

  • netty是基于reactor模式,Linux IO多路复用模型

  • netty可以实现传输层TCP/UDP协议的通信

  • netty的多路复用器基于poll、epoll系统调用实现,通过mmap、sendfile实现零拷贝

Netty有哪些优点
  • 性能优秀,高吞吐、低延迟

  • 可扩展性好,基于事件驱动模型、可自定义线程模型

  • 支持非阻塞的socket

  • 文档齐全、社区活跃

相比于市面其他网络编程框架,为什么要选择使用Netty

•Apache Mina netty与mina是同一作者的不同产品,netty是作者用来针对mina提高扩展性与解决一些已知问题的产品,可以理解为netty是mina的升级版

  • Sun Grizzly 社区没有Netty活跃,更新没有netty频繁

  • Apple Swift NIO 非java语言

  • tomcat/jetty tomcat/jetty是Servlet容器,主要应用基于Servlet的Http协议的处理;而netty不仅支持Http,还支持FTP、SSH等应用层协议以及传输层的UDP协议,并且还支持自定义协议;

https://java.libhunt.com/compare-netty-vs-mina https://java.libhunt.com/compare-grizzly-vs-netty

为什么不直接使用Java Nio,而使用Netty呢?
  • Netty支持常用的应用层协议如Http,而Java Nio需要开发人员去手动进行协议处理

  • Netty处理了TCP粘包半包问题,而Java Nio未处理

  • Netty支持流浪整形,而Java Nio不支持

  • Netty完善的处理了断连、空闲等异常处理

  • Netty修复了一些Java Nio的bug

二、如何去学习Netty

如何学习一个框架,重要的不是学习如何去使用它,也不是仅仅去读一读源码,而是学习它的过程中,理解它的原理及设计思路,这样当你学习其他相关框架,或自己设计系统的时候,就能事半功倍. 在上面的[知识层级划分图]中,黄色部分是偏底层及理论的知识,让我们通过两个Java程序,来了解下它们; Java NIO Demo

什么是NIO,个人理解,操作系统层面,是Non-blocking IO,Java层面叫它new IO或许比Non-blocking IO合适,因为它并不是完全非阻塞的,比如Selector.select()就是阻塞的方法;

让我们来看一个比较原始的Java NIO demo
import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.util.Date;import java.util.Iterator;public cl
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值