龙空技术网

Java程序员进化必知:Netty

叩丁狼stef 4735

前言:

眼前你们对“mina和netty区别”大概比较关心,姐妹们都需要学习一些“mina和netty区别”的相关文章。那么小编在网络上收集了一些有关“mina和netty区别””的相关知识,希望同学们能喜欢,朋友们快快来学习一下吧!

作者:叩丁狼教育,禹明明老师

作为一个已经有了几年工作经验的JAVA程序员,网络编程是一个必须接触的一个领域.如果你还只是停留在会用MVC框架,优化只会用用缓存,平常写写CRUD的水平,那么你对编程的理解还停留在一个非常表层的阶段!

如果想要深入理解各种服务器,Netty就是我们要过的第一道坎

Netty是什么

我在NIO的文章中简单学习了NIO的使用,现在回想一下,可以发现NIO的API设计过于复杂,代码量比较大,使用中需要考虑的细节也很多,如果对底层了解不深的同学写出来的代码可能会有各种各样的BUG导致服务不够稳定.

Netty就是为了解决这个问题而开发的一套简单易用封装良好的NIO框架,使用Netty可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地降低了网络编程的开发难度,极大简化了开发过程。

Netty可以用来干什么?

开发自定义的HTTP服务器开发自定义的FTP服务器开发自定义的UDP服务器开发自定义的RPC服务器,例如Dubbo就是基于Netty开发自定义的WebSocket服务器开发自定义的Proxy服务器,例如MySQL的Proxy服务器等总之就是可以开发定制符合自己需求的各种自定义协议和服务器

为什么选择Netty?

NIO框架有Netty , Mina , xSocket , Grizzly等,为什么选择Netty呢?

虽然NIO框架有很多,但是使用比较广泛的就是Netty和Mina,从学习成本和后期维护难度上来考虑选择流行的框架可以降低开发维护难度和风险.

Netty 和Mina的作者其实都是同一个人Trustin Lee (韩国人),但是Netty出生的更晚, 作者在写出了Mina之后又搞出了Netty, 所以从这方面来说Netty应该更加完善.

从使用上来讲目前很多著名的开源项目比如阿里的Dubbo,Apache Spark , FaceBook Nifty , Google gRPC 等都是基于Netty.

其实最根本的还是超高的性能和简单的API

Netty架构

这是Netty4.1官方架构图,我们先大概了解一下

Netty中几个重要概念

Channel

Channel是Netty最核心的接口,一个Channel就是一个联络Socket的通道,通过Channel,你可以对Socket进行各种操作。

ChannelHandler

ChannelHandler:每一个ChannelHandler都用来处理一些逻辑,所有的handler形成一个链表结构,作用类似于springMVC中的拦截栈或者一个个的过滤器

ChannelHandlerContext

ChannelHandlerContext是ChannelPipeline的上下文,负责传递上下文数据. ChannelHandlerContext.channel()方法可以得到和Context绑定的Channel,调用ChannelHandlerContext.handler()方法可以得到和Context绑定的Handler。

ChannelPipeline

ChannelPipeline:可以把ChannelPipeline看成是一个ChandlerHandler的链表,当需要对Channel进行某种处理的时候,Pipeline负责依次调用每一个Handler进行处理。每个Channel都有一个属于自己的Pipeline,调用XXChannel.pipeline()方法可以获得Channel的Pipeline,调用XXPipeline.channel()方法可以获得Pipeline的Channel。

他们的关系图如下:

简单了解完这些概念之后我们就可以写个helloworld来体验一把Netty了

要求JDK1.6或以上

Netty5.0官方已经不再支持了,不建议大家使用

目前最新稳定版是4.1

添加依赖

编写Server端

服务端涉及到了一个自定义的Handler用来处理接受到的数据

编写Client端

Client端负责数据处理的Handler

启动Server—>启动Client—>查看日志

# server端日志:这里给大家展示覆盖了ChannelInboundHandlerAdapter 中所有方法打印的日志,方便大家理解整个处理流程handlerAddedchannelRegisteredchannelActive18:13:27.672 [nioEventLoopGroup-3-1] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.maxCapacityPerThread: 3276818:13:27.672 [nioEventLoopGroup-3-1] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.maxSharedCapacityFactor: 218:13:27.672 [nioEventLoopGroup-3-1] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.linkCapacity: 1618:13:27.672 [nioEventLoopGroup-3-1] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.ratio: 818:13:27.683 [nioEventLoopGroup-3-1] DEBUG io.netty.buffer.AbstractByteBuf - -Dio.netty.buffer.bytebuf.checkAccessible: true18:13:27.685 [nioEventLoopGroup-3-1] DEBUG io.netty.util.ResourceLeakDetectorFactory - Loaded default ResourceLeakDetector: io.netty.util.ResourceLeakDetector@125622c7server收到数据:Hello I am Client channelReadCompletechannelInactivechannelUnregisteredhandlerRemoved# Client端日志:Client 收到数据:你好,我是Server18:13:29.903 [nioEventLoopGroup-2-1] DEBUG io.netty.buffer.PoolThreadCache - Freed 2 thread-local buffer(s) from thread: nioEventLoopGroup-2-1

单从代码量来看用过NIO的同学应该就可以感受到使用Netty比直接使用NIO要简单了太多了吧,但是Netty更大的好处其实是进行了完好的封装,我们可以少关注很多繁琐的细节的处理。

参考资料:

Netty4.0文档(官方推荐使用4.x版本):

w3cSchool的Netty手册:

标签: #mina和netty区别