netty介绍

Netty介绍

Netty简介

  • Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。
  • 一个非常好的处理socket的东西
  • Netty是建立在NIO基础之上,Netty在NIO之上又提供了更高层次的抽象。
  • 在Netty里面,Accept连接可以使用单独的线程池去处理,读写操作又是另外的线程池来处理。
  • Accept连接和读写操作也可以使用同一个线程池来进行处理。而请求处理逻辑既可以使用单独的线程池进行处理,也可以跟放在读写线程一块处理。线程池中的每一个线程都是NIO线程。用户可以根据实际情况进行组装,构造出满足系统需求的并发模型。
  • Netty提供了内置的常用编解码器,包括行编解码器[一行一个请求],前缀长度编解码器[前N个字节定义请求的字节长度],可重放解码器[记录半包消息的状态],HTTP编解码器,WebSocket消息编解码器等等
  • Netty提供了一些列生命周期回调接口,当一个完整的请求到达时,当一个连接关闭时,当一个连接建立时,用户都会收到回调事件,然后进行逻辑处理。Netty可以同时管理多个端口,可以使用NIO客户端模型,这些对于RPC服务是很有必要的。
  • Netty除了可以处理TCP Socket之外,还可以处理UDP Socket。
  • 在消息读写过程中,需要大量使用ByteBuffer,Netty对ByteBuffer在性能和使用的便捷性上都进行了优化和抽象。

网络应用发展历程

  • 远古:java.net + java.io
  • 近代:java.nio
  • 现代:Mina,Grizzly
  • 再到现在的Netty

java原生NIO的问题

  • NIO的类库和API繁杂,使用麻烦,你需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等
  • 需要具备其它的额外技能做铺垫,例如熟悉Java多线程编程,因为NIO编程涉及到Reactor模式,你必须对多线程和网路编程非常熟悉,才能编写出高质量的NIO程序
    可靠性能力补齐,开发工作量和难度都非常大。例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常码流的处理等等,NIO编程的特点是功能开发相对容易,但是可靠性能力补齐工作量和难度都非常大
  • JDK NIO的BUG,例如臭名昭著的epoll bug,它会导致Selector空轮询,最终导致CPU 100%。官方声称在JDK1.6版本的update18修复了该问题,但是直到JDK1.7版本该问题仍旧存在,只不过该bug发生概率降低了一些而已,它并没有被根本解决

Netty的特点

  • 设计优雅
  • 适用于各种传输类型的统一API - 阻塞和非阻塞Socket
  • 基于灵活且可扩展的事件模型,可以清晰地分离关注点
  • 高度可定制的线程模型 - 单线程,一个或多个线程池
  • 真正的无连接数据报套接字支持(自3.1起)
  • 使用方便,详细记录的Javadoc,用户指南和示例
  • 没有其他依赖项,JDK 5(Netty 3.x)或6(Netty 4.x)就足够了
  • 高性能;吞吐量更高,延迟更低;减少资源消耗;最小化不必要的内存复制
  • 安全;完整的SSL / TLS和StartTLS支持;社区活跃,不断更新
  • 社区活跃,版本迭代周期短,发现的BUG可以被及时修复,同时,更多的新功能会被加入

Netty常用的使用场景

  • 互联网行业;在分布式系统中,各个节点之间需要远程服务调用,高性能的RPC框架必不可少,Netty作为异步高性能的通信框架,往往作为基础通信组件被这些RPC框架使用。 典型的应用有:阿里分布式服务框架Dubbo的RPC框架使用Dubbo协议进行节点间通信,Dubbo协议默认使用Netty作为基础通信组件,用于实现各进程节点之间的内部通信。
  • 游戏行业;无论是手游服务端还是大型的网络游戏,java语言得到了越来越广泛的应用。Netty作为高性能的基础通信组件,它本身提供了TCP/UDP和HTTP协议栈。非常方便定制和开发私有协议栈,帐号登录服务器,地图服务器之间可以方便的通过Netty进行高性能的通信
  • 大数据领域;经典的Hadoop高性能通信和序列化组件Avro的RPC框架,默认采用Netty进行跨界通信,它的Netty Service基于Netty框架进行二次封装

Netty与Mina相比有什么优势

  • 同一作者,Netty更晚
  • Mina将内核和一些特性的联系过于紧密,使得用户在不需要这些特性的时候无法脱离,相比下性能会有所下降,Netty解决了这个设计问题;
  • Netty的文档更清晰,很多Mina的特性在Netty里都有;
  • Netty更新周期更短,新版本的发布比较快;
  • 它们的架构差别不大,Mina靠apache生存,而Netty靠jboss,和jboss的结合度非常高,Netty有对google protocal buf的支持,有更完整的ioc容器支持(spring,guice,jbossmc和osgi);
  • Netty比Mina使用起来更简单,Netty里你可以自定义的处理upstream events 或/和 downstream events,可以使用decoder和encoder来解码和编码发送内容;
  • Netty和Mina在处理UDP时有一些不同,Netty将UDP无连接的特性暴露出来;而Mina对UDP进行了高级层次的抽象,可以把UDP当成"面向连接"的协议,而要Netty做到这一点比较困难。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值