再见,Netty
Netty,当前最流行的NIO框架,通信领域开发的不二之选。经过多年的发展,已在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,一些业界著名的开源组件也基于Netty的NIO框架构建。目前市面上几乎找不到同类型可以与之媲美的通信框架,但是作为通信技术的爱好者,却向来无法对其产生亲近感。
我并不否认Netty的确是一款优秀的框架,曾经我也自己写过NIO框架,深知其实现难度有多大,最终选择了放弃。Netty的出现为广大程序员提供了便利,大大降低了开发高效、稳定服务的难度。至于本人对其无好感,究其原因有以下几点(首先申明一下,本人仅曾经简单使用过netty,并未深入研究):
1.复杂;以下代码摘录自Netty官网,初看代码,应该大部分人对于run方法比较费解。EventLoopGroup是干嘛的?bossGroup和workerGroup是什么关系?childHandle入参如此复杂!ch.pipeline().addLast(new DiscardServerHandler())实现的是什么功能?等等...。总之,这一个方法会引发你诸多疑惑。
publicclass DiscardServer {
privateintport;
public DiscardServer(int port) {
this.port = port;
}
public void run() throws Exception {
EventLoopGroup bossGroup =newNioEventLoopGroup();// (1)
EventLoopGroup workerGroup =newNioEventLoopGroup();
try{
ServerBootstrap b =newServerBootstrap();// (2)
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)// (3)
.childHandler(newChannelInitializer() {// (4)
@Override
publicvoid initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(newDiscardServerHandler());
}
})
.option(ChannelOption.SO_BACKLOG,128)// (5)
.childOption(ChannelOption.SO_KEEPALIVE,true);// (6)
// Bind and start to accept incoming connections.
ChannelFuture f = b.bind(port).sync();// (7)
// Wait until the server socket is closed.
// In this example, this does not happen, but you can do that to gracefully
// shut down your server.f.channel().
closeFuture().sync();
}
finally{
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
}
}
public static void main(String[] args) throws Exception {
intport;
if(args.length >0) {
port = Integer.parseInt(args[0]);
}
else{
port =8080;
}
newDiscardServer(port).run();
}
}
2.臃肿;下载Netty源码后,你会看到它的工程里有二十几个模块。发展了这么多年,它已然成了一个庞然大物。再加上其高深的设计哲学,以致于吾等凡夫俗子难以通过阅读源码领悟其精髓。
3.面试必问;有过几年工作经历后再去面试,基本都会遭遇被问及Netty相关问题的情况。似乎没用过Netty你就不是一个合格的程序猿,不懂Netty线程模型就要给你的技术能力打上一个问号。亲身经历,不爽!也不屑去背网上那些相关的理论,不务实。
4.Netty解决了人们工作上的困扰,但同时它也限制了很多Java开发人员的技术成长。有些同学花费几十元RMB购买Netty相关的书籍,可无论书读的有多么透彻,也只是茶余饭后与同行有一些谈资,又不能让你也有能力写一个Netty出来。
Netty是一条横跨在你与通信领域之间的河,你可以远观河对岸的景色,却无法近距离感受其魅力。结合对Netty的个人成见,是时候跟Netty说再见了,或者说回头见。工作中可以采用Netty,出于学习目的则可以考虑一下本文的主角:smart-socket。
针对上面的技术我特意整理了一下,有很多技术不是靠几句话能讲清楚,所以干脆找朋友录制了一些视频,很多问题其实答案很简单,但是背后的思考和逻辑不简单,要做到知其然还要知其所以然。如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java进阶群:694549689,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。
你好,smart-socket
这也是一款通信框架,而且是一款没有资格与Netty相提并论的国产开源项目,至少现阶段是如此。smart-socket是学习的产物,是作者在学习AIO过程中逐渐优化改进而成。本文的目的也是希望可以把smart-socket介绍给大家,让大家了解到有那么一波人,不安于已有的优质解决方案,致力于通过重复造轮子的形式,为这个开源社区注入新鲜血液。
Java于1.7版本提供了AIO通信API,Netty曾经也发布过AIO版,但最终还是选择了放弃,据说是由于性能改善并不显著。但通过开发smart-socket,本人有一点愚见。Java AIO已经将Socket编程门槛降到了一个非常低的程度。只要该技术点得到普及,会有很多AIO框架如雨后春笋般冒出来,有点技术能力的朋友都可以开发一套属于自己的通信框架。而Netty基于AIO的实现方案,相当于革了自己的命,在NIO上实现异步非阻塞通信并达到目前这种成就所付出的成本不言而喻,但AIO却让这一切来得非常低廉,致使Netty陷入了进退两难的局面,总不好舍弃过去在NIO模式上的付出吧。纯属个人YY,不喜勿喷,哈哈。
smart-socket经历了五个月的发展,并在开源中国平台上发布了四个版本,始终秉持着极简、易用、高性能的原则。项目可从码云中下载:smart-socket,欢迎各位下载。接下来正式开始王婆卖瓜,自卖自夸。
极简
何为“简”,代码量少即为“简”。smart-socket初期的实现仅用了11个文件,514行代码。这样的一款框架应该极具吸引力了吧,意味着你只要理解这514行代码,就可以彻底掌握AIO技术。不过随后的版本中增加了一些辅助编解码的工具类,导致代码量有所增加,但还是不到800行。
易用
何为“易”,学之轻松,使之便捷即为“易”。smart-socket只需熟悉三个接口(Filter、MessageProcessor、Protocol),三个类(AioSession、AioQuickServer、AioQuickClient)即可玩转Socket。
高性能
1.参见《每秒处理 500W 条消息,人、机为之颤抖》,不少朋友不认可这种测试方式。假设采用同样的测试方式,Netty每秒处理400W,那smart-socket这500W的数据是否更有说服力。
2.此处再提供一份某网友的测试数据,该网友测试的关注点在于smart-socket建立连接的性能:
3.测试环境: CPU E3-1231 v3 @ 3.40GHz,8核,内存16G
4.测试结果:每秒处理8000个长连接请求,服务器总连接数达18W(调整配置项后每秒建立连接数1W左右)
smart-socket的定位很纯粹,仅仅负责协调数据读写资源,最大化的发挥系统性能,用户只需关注协议编解码以及消息的业务处理。smart-socket不会包揽通信层面方方面面的功能,希望每一个使用smart-socket的朋友,可以通过它加深对socket的理解与认知。如果您是对Socket技术有浓厚兴趣的朋友,非常欢迎体验以下smart-socket。
如果对你有帮助请动动小手关注下吧!