再见,Netty!你好,smart-socket!

再见,Netty

Netty,当前最流行的NIO框架,通信领域开发的不二之选。经过多年的发展,已在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,一些业界著名的开源组件也基于Netty的NIO框架构建。目前市面上几乎找不到同类型可以与之媲美的通信框架,但是作为通信技术的爱好者,却向来无法对其产生亲近感。

我并不否认Netty的确是一款优秀的框架,曾经我也自己写过NIO框架,深知其实现难度有多大,最终选择了放弃。Netty的出现为广大程序员提供了便利,大大降低了开发高效、稳定服务的难度。至于本人对其无好感,究其原因有以下几点(首先申明一下,本人仅曾经简单使用过netty,并未深入研究):

  • 复杂;以下代码摘录自Netty官网,初看代码,应该大部分人对于run方法比较费解。EventLoopGroup是干嘛的?bossGroupworkerGroup是什么关系?childHandle入参如此复杂!ch.pipeline().addLast(new DiscardServerHandler())实现的是什么功能?等等...。总之,这一个方法会引发你诸多疑惑。

public class DiscardServer {  private int port;  public DiscardServer(int port) { this.port = port; }  public void run() throws Exception { EventLoopGroup bossGroup = new NioEventLoopGroup(); // (1) EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); // (2) b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) // (3) .childHandler(new ChannelInitializer() { // (4) @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new DiscardServerHandler()); } }) .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 { int port; if (args.length > 0) { port = Integer.parseInt(args[0]); } else { port = 8080; } new DiscardServer(port).run(); }}
  • 臃肿;下载Netty源码后,你会看到它的工程里有二十几个模块。发展了这么多年,它已然成了一个庞然大物。再加上其高深的设计哲学,以致于吾等凡夫俗子难以通过阅读源码领悟其精髓。

  • 面试必问;有过几年工作经历后再去面试,基本都会遭遇被问及Netty相关问题的情况。似乎没用过Netty你就不是一个合格的程序猿,不懂Netty线程模型就要给你的技术能力打上一个问号。亲身经历,不爽!也不屑去背网上那些相关的理论,不务实。

  • Netty解决了人们工作上的困扰,但同时它也限制了很多Java开发人员的技术成长。有些同学花费几十元RMB购买Netty相关的书籍,可无论书读的有多么透彻,也只是茶余饭后与同行有一些谈资,又不能让你也有能力写一个Netty出来。

Netty是一条横跨在你与通信领域之间的河,你可以远观河对岸的景色,却无法近距离感受其魅力。结合对Netty的个人成见,是时候跟Netty说再见了,或者说回头见。工作中可以采用Netty,出于学习目的则可以考虑一下本文的主角:smart-socket。

你好,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。

  • 高性能

    参见《每秒处理 500W 条消息,人、机为之颤抖》,不少朋友不认可这种测试方式。假设采用同样的测试方式,Netty每秒处理400W,那smart-socket这500W的数据是否更有说服力。

    此处再提供一份某网友的测试数据,该网友测试的关注点在于smart-socket建立连接的性能:

  • 测试环境: CPU E3-1231 v3 @ 3.40GHz,8核,内存16G

  • 测试结果:每秒处理8000个长连接请求,服务器总连接数达18W(调整配置项后每秒建立连接数1W左右)

smart-socket的定位很纯粹,仅仅负责协调数据读写资源,最大化的发挥系统性能,用户只需关注协议编解码以及消息的业务处理。smart-socket不会包揽通信层面方方面面的功能,希望每一个使用smart-socket的朋友,可以通过它加深对socket的理解与认知。如果您是对Socket技术有浓厚兴趣的朋友,非常欢迎体验以下smart-socket。


鲜花

握手

雷人

路过

鸡蛋
该文章已有1人参与评论

请发表评论

全部评论

查看全部评论>>

本文作者2018-1-9 06:09
hoei
粉丝0 阅读102 回复1

迪恩微信公众号码

扫码微信公众号
给你想要与成长

上一篇:
CF手游2.0版本号称业界良心的滑翔伞太享受了!发布时间:2018-01-08
下一篇:
绝地求生制作人:山寨游戏残害游戏生命发布时间:2018-01-09

精彩阅读

排行榜

本站不提供任何视听上传服务,所有内容均来自视频分享站点所提供的公开引用资源。 模板制作:魔趣吧moqu8.com 
中国互联网举报中心 北京12318文化市场举报热线 网络110报警服务  业务许可证:B1.B2-20140071