再见,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<SocketChannel>() { // (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。

如果你也想在IT行业拿高薪,可以参加我们的训练营课程,选择最适合自己的课程学习,技术大牛亲授,7个月后,进入名企拿高薪。我们的课程内容有:Java工程化、高性能及分布式、高性能、深入浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点。如果你想拿高薪的,想学习的,想就业前景好的,想跟别人竞争能取得优势的,想进阿里面试但担心面试不过的,你都可以来,群号为:575745314

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

相关推荐