1. 聚能聊>
  2. 话题详情

手淘、微博一直钟情的 Netty框架是个什么鬼?

众所周知,构建高性能的现代互联网架构,我们一定离不开分布式系统,这些系统必定是反应式的。反应式的系统是一个比较新的概念,即消息驱动、弹性、极具适应性并且即时响应。构建这样的系统,定然离不开优秀的网络通信框架,其中 Netty 就是一款及其优秀的网络通信框架。

我们知道,GRPC-Java、Cassandra、Spark、Spring 5 以及 Akka 、Play等都是基于Netty构建的。在大型公司中,阿里巴巴、苹果、微博、谷歌、Twitter、Facebook等都在使用 Netty 构建他们的现代网络服务。比如说,每次您访问淘宝网或者手机淘宝,你都在使用 Netty,当然也包括使用苹果的 ICloud ,发微博或者Tweet等。

同样,在一些中小企业甚至是创业型公司以及游戏行业,也大面积地使用 Netty,比如杀毒软件厂商 Avast使用它来服务递交病毒库,LeanCloud使用它来提供消息服务,甚至我们在看《权力的游戏》时,您看到的(如果您在美国看直播)也是通过 Netty 来直播的。当然我们也看到很多直播系统、网络游戏以及在线播客(比如喜马拉雅)都大面积 的使用了 Netty。

TB1sXpYRXXXXXalaXXXXXXXXXXX_700_880

此为聊主:何品,最新翻译出版的《Netty 实战》一书,

本书《Netty 实战》是由Netty 项目技术负责人Norman 所编写的《Netty IN ACTION》的中文版,由人民邮电出版社已经并出版,点此下载试读章节,当然也包括主流的电商渠道,如天猫购买链接>>

当然,不光是 Netty 项目本身,整个 Netty 社区也在探索更多更大的可能,所以我们在这里一起来聊一聊下面的几个话题吧:

1. 您是否正在使用或者打算使用 Netty?

2. 为什么选择 Netty?

3. Netty 解决了什么痛点?

4. Netty 在您的生产系统中的实践有什么值得分享的?

本作者这次带来了10本亲笔签名的《Netty 实战》用于话题大打赏,希望大家积极参与~!

参与话题

奖品区域 活动规则 活动已结束,可继续参与讨论哦

  • 奖品一

    《Netty实战》 x 10

91个回答

5

小柒2012 已获得《Netty实战》

无论的Tomcat的Nio,还是是传统的Mina框架都是基于异步实现的,而Netty则是集大成者,吹个牛逼。

Netty是个网络通讯框架,在很多网络应用,RPC,分布式框架都有使用Netty进行网络通讯。

熟悉编程的同学肯定都了解同步阻塞IO、伪异步IO、非阻塞IO(NIO)和异步IO(AIO)的编程,然而开发出高质量的NIO程序并不是一件简单的事情。JAVA本身自带原生NIO编程的,但是大多数开发者会倾向于选择Netty。

why?

  • API使用简单,开发门槛低;

  • 功能强大,预置了多种编解码功能,支持多种主流协议;

  • 定制能力强,可以通过ChannelHandler对通信框架进行灵活的扩展;

  • 性能高,通过与其它业界主流的NIO框架对比,Netty的综合性能最优;

  • 成熟、稳定,Netty修复了已经发现的所有JDK NIO BUG,业务开发人员不需要再为NIO的BUG而烦恼;

  • 社区活跃,版本迭代周期短,发现的BUG可以被及时修复,同时,更多的新功能会被加入;

  • 经历了大规模的商业应用考验,质量已经得到验证。在互联网、大数据、网络游戏、企业应用、电信软件等众多行业得到成功商用,证明了它可以完全满足不同行业的商业应用。

目前在使用的是当当维护的Dubbox,Dubbo 协议默认使用 Netty 作为基础通信组件,用于实现各进程节点之间的内部通信。据说阿里的HSF这些都是基于Netty的。

当然除了阿里,其他电商比如JD内部的JSF也是基于Netty开发的。

Netty 解决了什么痛点?我理解的异步化并不会提升系统的响应时间,但会增加系统的吞吐量和服务的灵活性,这也就说明了为什么很多直播系统、网络游戏以及在线播客(比如喜马拉雅)都大面积 的使用了 Netty的缘由了。

就拿比较流行的游戏行业来说:
高并发:由于采用异步非阻塞模式,一个Netty游戏服务端可以同时处理成千上万的游戏玩家登陆和在线,这是传统的IO模式所达不到的。
高性能:Netty的性能在各个NIO框架中最高,它的单节点吞吐量非常大,适合海量玩家同时在线游戏。
安全性:支持HTTPS、SSL等,可以在传输层进行安全控制
定制性:可以方便的实现业务逻辑的定制、游戏编解码的定制,可以方便的与第三方进行集成,例如amf3等

千万别惹猫 回复

阿里的确大面积在用Netty,HSF也是基于Netty 4.1的。

idealities 回复

hsf还是基于netty的?

千万别惹猫 回复

是的,Netty 4.1

评论
3

jackyliu 已获得《Netty实战》

您是否正在使用或者打算使用 Netty?
答: 在上一家公司的时候,我们的聊天服务器使用了Netty开发。到现在的公司后,服务器主要使用的是mina框架,部分业务用到了netty。

为什么选择 Netty?
答:

1.在上家公司的时候,我们的手游客户端是在Phonegap框架之上,使用HTML5技术开发的。在开发聊天服务器的时候,我们自然而然的选择了websocket协议。Netty对websocket支持很好,可以直接打包到我们现有的游戏服务器内,只需定义一个Handler,在回调里面处理客户端传来的文本即可。

2.现在公司的项目,采用的是apache mina,系统内大多数数据是自定义HEADER+protobuf传送的,但是充值系统的回调需要HTTP服务。mina框架对HTTP的支持是非常简陋的,甚至可以说根本不能用。之前同事从网上找了一份mina http encoder/decoder的代码,巨坑无比,先后发现过大量链接处于TIMED_WAIT状态、URL中特殊字符没有urldecode、post里面的内容"="后面内容被截断等各种问题。Netty原生支持HTTP,我们切换到Netty应该可以解决这个问题。但考虑到切换网络框架有一定风险,同时为了推动我们项目向spring cloud方向演进,我直接嵌入了一个spring-boot,使用tomcat-embed,开一个独立端口,来解决了HTTP问题。

3.Trustin Lee这个传奇人物[https://github.com/trustin],开发了mina\netty\armeria,几乎奠定了java network framework的基础。现在java领域的rpc framework如grpc,各种nosql数据库如elasticsearch,各种data grid如infinispan,大数据套件如hadoop,分布式中间件如zookeeper,无不使用netty作为底层传输框架。可以说,netty已经成为java互联网项目数据传输层框架的事实标准。

4.我们项目大量使用redis,目前使用了redisson,而redisson使用了netty做为传输框架,研究netty势在必行。

Netty 解决了什么痛点?
答:

游戏业务常用长连接,而处理二进制网络数据,处理网络连接,是非常繁琐易错的。Netty提供了各种协议的支持,session支持,连接池管理,这些可以大大减轻程序员的心智负担,快速高效地完成工作。要知道C++服务器开发的领土被java/golang大肆侵占,正是因为它缺少好用的各种网络库啊。C++ 17才有了network的草案,呵呵。

Netty 在您的生产系统中的实践有什么值得分享的?
netty-common这个模块里面有很多工具函数,例如IntObjectHashMap,CharsetUtil,ConcurrentSet,即使没有使用到netty做网络传输,这个模块儿也可以做工具库使用。至于Netty在实践中的问题,一般是遇到一个解决一个,一定要看官方文档,必要时读源码,调试源码。

千万别惹猫 回复

答主回答的细给力

评论
1

曾标彪 已获得《Netty实战》

  1. 您是否正在使用或者打算使用 Netty?

正在使用,主要用于电梯监控及通信业务。

  1. 为什么选择 Netty?

原因有很多:
a) API友好。在使用Netty前,有同事使用过Java NIO用于网络通信,主要问题是开发难度大,要写好多代码处理细节。
b) 功能强大,Netty中的reactor模型主要表现可以创建boss和worker,boss用于管理连接,worker负责业务处理,职责做了分离。在处理业务时,有许多预置的Handler及encoder/decoder,方便增加和修改业务。另外一个很好用的功能是AttributeKey,为每个创建的channel附加任意多个对象。之前用mina时,只能attach一个对象,如果要attach多个,需要写一个包装类或者用Map。
c) 高性能,Netty内部大量并且正确使用了volatile,CAS以及原子类等。
d) 成熟稳定,许多成熟框架,大公司都用到Netty,选择它也算放心了。

  1. Netty 解决了什么痛点?
    降低的网络编程的复杂性,Netty自带线程池处理业务,并且支持channel handler的处理绑定到线程,省去了多线程编程的复杂度,也提高了性能。

  2. Netty 在您的生产系统中的实践有什么值得分享的?
    我们系统中,使用了Netty+Akka组合实现电梯监控,Handler只负责协议encode/decode,具体业务放到Actor中处理。处理业务时,如果需要使用channel,因为channel接受数据和发送数据的线程池和Actor使用的线程池不一样,需要考虑并发问题。解决思路是判断channel绑定的eventLoop是否正在被执行,如果是则直接执行任务,否则安排一个任务,等下次eventLoop被执行时执行该任务,代码如下:
    // validate current channel is in event loop, ensure thread safety
    if (message.getChannel().eventLoop().inEventLoop()) {
    message.getChannel().writeAndFlush(message.getProtocol());
    } else {
    message.getChannel().eventLoop().execute(() -> message.getChannel().writeAndFlush(message.getProtocol()));
    }

千万别惹猫 回复

我也特别爱结合Akka使用。

评论
2

sunning_彼岸 已获得《Netty实战》

  1. 您是否正在使用或者打算使用 Netty?

答: 由于历史原因大部分使用apache mina ,部分已经升级到Netty

  1. 为什么选择 Netty?

答:

2-1、与各大银行相关连的支付业务。各大银行与外部企业对接的银企系统使用各种不同的消息协议与消息解析方式。比如: 短连接、http 协议等。
同时,消息编码解码采取不同的形式。例如:包头+包体等形式。 但是银行业务形式比较单一。
采用Netty 内置的HTTP协议等协议, 采用LengthFieldBasedFrameDecoder 解决了各种形式的包头+包头的解析.Netty内置的各种编码极大减少了工作量。

2-2、由于我们之前系统使用apache mina ,由于业务的发展,需要支持各种网络协议与消息格式。例如:HTTP协议。 apache mina 对应http协议仅仅支持http1.0,而且支持很低。
当我们遇到需要使用websocket协议时,发现我们需要做大量重复工作。而这些协议在netty 中都是内置的。不需要我们重复造轮子节约大量时间开发与测试。

2-3、在我们系统中大量使用apache mina, 对于升级到netty 是非常方便,线程模式一样,使用方式一致,而且能够获得netty的高性能。

2-4、我们向外提供的各种服务接口。例如:基于netty,定制各种简单的服务.

2-5 Netty被大量顶尖公司使用实践,Netty4.x版本非常稳定,从mina升级到netty ,无后顾之忧。

  1. Netty 解决了什么痛点?

答:

3-1、对于业务中大量相似而不同的消息解码,采用LengthFieldBasedFrameDecoder 而统一。
3-2、对应业务中大量不同的消息协议,例如:http 、websocket 都已经内置,不需要重新开发、测试。

  1. Netty 在您的生产系统中的实践有什么值得分享的?

线程模型一定要弄清楚!

1

dreajay

netty的优点其他评论已经说了很多,但对于netty的学习还是有些门槛,尤其缺乏中文资料,我在这里主要介绍下自己学习netty的一些资料^_^

1.学习java nio编程,对比传统io区别,可参考Jakob Jenkov写的nio系列教程http://tutorials.jenkov.com/java-nio/overview.html,
并发编程网有翻译版http://ifeve.com/overview/。

2.netty官方指南。

3.国人华为大牛李林峰写的中文书籍《netty权威指南》可以学习使用netty的各种例子,了解netty线程模型。

4.不得不看netty 技术负责人Norman 所编写的《Netty IN ACTION》,了解netty的设计思想。

5.比较老的一本书籍 《java nio》,豆瓣链接https://m.douban.com/book/subject/1433583/,也有中文板。

6.实战netty,学习网络编程,一个是rpc,另一个是im,可通过开源框架的源码学习,比如dubbo,rocketmq,nettyio(socketio服务端实现)等等,GitHub可以找到很多。

现在终于多一本中文图书《netty实战》来更好的学习netty了,发现世界是不是更美好了些,《netty实战》快到我的碗里来吧^_^

千万别惹猫 回复

亲哥,如果您按照上面的答主的写法可能更好呢。

评论
1

feidada

最近一次使用Netty是用来采集设备上送的采样数据,tcp长连接,5秒上送一次,一次好几十条几百条数据,好几万的设备。用Netty的好处就是轻轻松松解决并发问题,吞吐问题,简单优化就能满足需求。当然要用好Netty也还是需要下点功夫。

千万别惹猫 回复

亲哥,您可以更加详细的描述下不呢,谢谢了!

评论
1

szm.

因为之前没有接触过过Netty,看了您的介绍之后对它感觉不错,就去网上搜索了一下,根据网上的说明,Netty简化高性能网络应用程序的开发,能够快速开发高性能、高可靠性的网络服务器和客户端程序。如果你需要开发网络应用,有服务器,有客户端,有基于TCP或UDP的网络协议,Netty能提供高性能的网络通讯机制,提供基于事件和流水线的编程模型,提供一些协议的支持,比如HTTP,WebSockets,SSL等。用Netty,你可以容易地利用Java NIO来提高服务端的性能。
作为一个态度积极的程序猿,当然是对自己不了解的东西深入去学习了,Netty相对于其他同类型应用,有着更易用、更健壮、更安全和更好的性能的特点,文档也相对来说更健全,自然选择使用Netty。
Netty可以解决传统web服务器在分布式方面的不足,在处理高并发等方面的问题有着更好的性能。
因为目前还没有使用,所以没有好的建议,希望这可以赏一本书让我深度学习Netty

千万别惹猫 回复

您可以描述下您目前使用的是什么不呢?以及有没有什么痛点?

评论
1

瑞港消防

Netty对UDP改善吗?nio为我未见到明显改善, 我是一个UDP重度使用人员。我使用UDP做远程控制,视频监控。而这些都是无连接的通信

千万别惹猫 回复

有啊,甚至还有UDT。

评论
1

51干警网

作为一个小白,我想问Netty是什么鬼?

千万别惹猫 回复

几乎所有的服务都涉及到Netty。。。。高性能网络编程框架

评论
1

浮生递归

听聊主这么一介绍,感觉netty还是很不错的。特别是看到博文里说不需要精通Java 网络和并发编程,那就更值得一读了。
若netty真像楼主说的这么优势,有必要在单位内部推广一下,在合适的项目里都逐步使用netty。正好单位里也有一些是JAVA的项目。以后JAVA的项目应该也会越来越多。

千万别惹猫 回复

Netty 快速上手本书就够了,不过细致学习还需要很多书籍的。

评论
1

我的中国

Netty的高性能通信,低延迟省资源,而且支持SSL安全协议让他可以用在淘宝、游戏行业以及企业IT的通信方面,特别是在如今高负载高可靠性QOS要求高的情况下,Netty是不二人选。Netty的上手度对于有些基础的,写个helloworld半天就可以搞定,一周解决个问题还是可以的。最后说个现实点的,传统的io,一个线程服务一个,netty是一个线程池服务一大堆,从在这里就知道他的本事了。

千万别惹猫 回复

Helloworld不需要半天吧,哈哈。

评论
0

zongwan

看到置顶的大段回答, 感觉答主完全理解了 netty
这样的人还获得奖励丛书是为了让他收藏吗?
像我这种小白 获得奖励丛书才是对奖品的最大化利用

千万别惹猫 回复

哈哈,亲哥你的这个回答蛮可爱啊,哈哈,其实也不用全部回答嘛。

评论
0

casephoen

因为历史原因,一直使用的是mina,其实mina很稳定,已经够好的了,不过作者跳槽去做了netty,毫无疑问netty站在mina的肩膀上发展的,肯定更好,如果做新项目的话还是挺想使用netty的,不过netty太活跃了,版本分支貌似较多,之前还出了一个beta-5,支持websocket的,不知道和netty4这个主分支有啥区别,希望netty主分支能更强大吧

千万别惹猫 回复

Netty 5主要是FJ,不过各种原因下掉了。目前最好的是Netty 4.1.x了

评论
0

天机浮现

不了解netty,看名字和jetty很近视啊,我们有个发布地图服务的应用,用tomcat发布的,培训时,多人同时访问时系统就瘫了,卡在首页死了,正在寻求解决方案;netty看大家的介绍和回答,netty应该适合高并发的场景;我要好好研究研究了,有本书最好啦

千万别惹猫 回复

哈哈,是比较类似。
阿里大量用到Netty哦。

评论
2

code_xzh

Netty是由JBOSS提供的一个java NIO框架,用它可以实现分布式网络应用程序开发,特别是在如今高负载高可靠性高QOS的情况下,Netty是不二的选择。相比于传统基于Java序列化+BIO(同步阻塞IO)的通信框架,使用Netty4 + Thrift,可以实现10W TPS跨节点远程服务调用,性能上至少提升了10倍以上。
传统的Java序列化有以下问题:
1)Java序列化机制是Java内部的一种对象编解码技术,无法跨语言使用;
2)相比于其它开源的序列化框架,Java序列化后的码流太大,导致额外的资源占用;
3)序列化性能差
而采用异步、事件驱动的Netty框架很好的解决了这一问题。在IO编程过程中,当需要同时处理多个客户端接入请求时,可以利用多线程或者IO多路复用技术进行处理。并且基于NIO框架的Netty框架也提供了SocketChannel和ServerSocketChannel两种不同的套接字通道实现。这两种新增的通道都支持阻塞和非阻塞两种模式。
在实现上,Netty中的Boss类充当mainReactor,NioWorker类充当subReactor(默认NioWorker的个数是当前服务器的可用核数)。在处理新来的请求时,NioWorker读完已收到的数据到ChannelBuffer中,之后触发ChannelPipeline中的ChannelHandler流。
所以,对于一些需要即时响应的系统,使用Netty作为网络通信框架确实是不错的选择。

2

似水的流年

Netty是业界最流行的NIO框架,它的可靠性、高性能和可扩展性已经得到了上百上千的商用项目验证,它的优点总结如下:
API使用简单,开发门槛低;
功能强大,内聚了很多实用的功能,简化用户的开发;
定制性好,通过ChannelPipeline机制可以灵活的进行功能定制和扩展;
性能高;
成熟稳定,社区活跃,Bug的修复周期比较短,新功能不断的被加入,用户可以体验到更多、更实用的功能。
经历了大规模不同行业的商用考验,架构质量得到了充分的验证。

1

1810678032410571

Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果

0

chelkim

  1. 您是否正在使用或者打算使用 Netty? 现在公司的核心项目使用的正是netty ^_^
  2. 为什么选择 Netty? netty无需多考虑高并发环境下socket通信异常等问题,已经非常好的封装了对各种隐患的解决方案
  3. Netty 解决了什么痛点? 高并发环境下表现很优秀,性能消耗也很低
  4. Netty 在您的生产系统中的实践有什么值得分享的? 现在的项目采用netty+protobuf,感觉非常不错

0

chelkim

netty确实是个很优秀的框架,在高并发长连接环境下依然很稳定,性能消耗也很低,现在公司项目里采用了netty + protobuf,protobuf也是非常好的协议框架,很不错!

0

大哥大哥大

—你知道书店有卖《Netty实战》一书吗?
—不曾听讲,貌似很牛。

4
10570
浏览
0
收藏
邀请他人互动
关注
1
粉丝
12
话题
1

简介:

  何品,目前是淘宝的一名资深软件工程师,热爱网络、并发、异步相关的主题以及函数式编程,同时也是Netty、Akka等项目的贡献者,活跃于Scala社区,目前也在从事GraphQL相关的开发工作。

著作:

2017年 5月 《Netty实战》
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...

RDS是一种稳定可靠、可弹性伸缩的在线数据库服务。支持MySQL、SQL Server、PostgreSQL、高...