Netty有什么用随着移动互联网的爆发性增长,小明公司的电子商务系统访问量越来越大,由于现有系统是个单体的巨型应用,已经无法满足海量的并发请求,拆分势在必行。

640?wx_fmt=png&wxfrom=5&wx_lazy=1

在微服务的大潮之中, 架构师小明把系统拆分成了多个服务,根据需要部署在多个机器上,这些服务非常灵活,可以随着访问量弹性扩展。

640?wx_fmt=png&wxfrom=5&wx_lazy=1

世界上没有免费的午餐, 拆分成多个“微服务”以后虽然增加了弹性,但也带来了一个巨大的挑战:服务之间互相调用的开销。

比如说:原来用户下一个订单需要登录,浏览产品详情,加入购物车,支付,扣库存等一系列操作,在单体应用的时候它们都在一台机器的同一个进程中,说白了就是模块之间的函数调用,效率超级高。

现在好了,服务被安置到了不同的服务器上,一个订单流程,几乎每个操作都要越网络,都是远程过程调用(RPC), 那执行时间、执行效率可远远比不上以前了。

远程过程调用的第一版实现使用了HTTP协议,也就是说各个服务对外提供HTTP接口。 小明发现,HTTP协议虽然简单明了,但是废话太多,仅仅是给服务器发个简单的消息都会附带一大堆无用信息:

GET /orders/1 HTTP/1.1

Host: order.myshop.com

User-Agent: Mozilla/5.0 (Windows NT 6.1; )

Accept: text/html;

Accept-Language: en-US,en;

Accept-Encoding: gzip

Connection: keep-alive

看看那User-Agent,Accept-Language ,这个协议明显是为浏览器而生的!但是我这里是程序之间的调用,用这个HTTP有点亏。

能不能自定义一个精简的协议? 在这个协议中我只需要把要调用方法名和参数发给服务器即可,根本不用这么多乱七八糟的额外信息。

但是自定义协议客户端和服务器端就得直接使用“低级”的Socket了,尤其是服务器端,得能够处理高并发的访问请求才行。

小明复习了一下服务器端的socket编程,最早的Java是所谓的阻塞IO(Blocking IO), 想处理多个socket的连接的话需要创建多个线程, 一个线程对应一个。

640?wx_fmt=png

这种方式写起来倒是挺简单的,但是连接(socket)多了就受不了了,如果真的有成千上万个线程同时处理成千上万个socket,占用大量的空间不说,光是线程之间的切换就是一个巨大的开销。

更重要的是,虽然有大量的socket,但是真正需要处理的(可以读写数据的socket)却不多,大量的线程处于等待数据状态(这也是为什么叫做阻塞的原因),资源浪费得让人心疼。

后来Java为了解决这个问题,又搞了一个非阻塞IO(NIO:Non-Blocking IO,有人也叫做New IO), 改变了一下思路:通过多路复用的方式让一个线程去处理多个Socket。

640?wx_fmt=png

这样一来,只需要使用少量的线程就可以搞定多个socket了,线程只需要通过Selector去查一下它所管理的socket集合,哪个Socket的数据准备好了,就去处理哪个Socket,一点儿都不浪费。

好了,就是Java NIO了!

小明先定义了一套精简的RPC的协议,里边规定了如何去调用一个服务,方法名和参数该如何传递,返回值用什么格式…等等。然后雄心勃勃地要把这个协议用Java NIO给实现了。

可是美好的理想很快被无情的现实给击碎, 小明努力了一周就意识到自己陷入了一个大坑之中,Java NIO虽然看起来简单,但是API还是太“低级”了,有太多的复杂性,没有强悍的、一流的编程能力根本无法驾驭,根本做不到高并发情况下的可靠和高效。

小明不死心,继续向领导要人要资源,一定要把这个坑给填上,挣扎了6个月以后,终于实现了一个自己的NIO框架,可以执行高并发的RPC调用了。

然后又是长达6个月的修修补补,小明经常半夜被叫醒:生产环境的RPC调用无法返回了! 这样的Bug不知道改了多少个。

在那些不眠之夜中,小明经常仰天长叹:我用NIO做个高并发的RPC框架怎么这么难呐!

一年之后,自研的框架终于稳定,可是小明也从张大胖那里听到了一个让他崩溃的消息: 小明你知道吗?有个叫Netty的开源框架,可以快速地开发高性能的面向协议的服务器和客户端。 易用、健壮、安全、高效,你可以在Netty上轻松实现各种自定义的协议!咱们也试试?

小明赶紧研究,看完后不由得“泪流满面”:这东西怎么不早点出来啊!

好了,这个故事我快编不下去了,要烂尾了。smiley_5.png

说说Netty到底是何方神圣, 要解决什么问题吧。

像上面小明的例子,想使用Java NIO来实现一个高性能的RPC框架,调用协议,数据的格式和次序都是自己定义的,现有的HTTP根本玩不转,那使用Netty就是绝佳的选择。

其实游戏领域是个更好的例子,长连接,自定义协议,高并发,Netty就是绝配。

因为Netty本身就是一个基于NIO的网络框架, 封装了Java NIO那些复杂的底层细节,给你提供简单好用的抽象概念来编程。

注意几个关键词,首先它是个框架,是个“半成品”,不能开箱即用,你必须得拿过来做点定制,利用它开发出自己的应用程序,然后才能运行(就像使用Spring那样)。

一个更加知名的例子就是阿里巴巴的Dubbo了,这个RPC框架的底层用的就是Netty。

另外一个关键词是高性能,如果你的应用根本没有高并发的压力,那就不一定要用Netty了。

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
PsnDen05yiA0dxjkeyTRnxTsVB/A8U23v*nrmm0F9mHHXuaaNuZNY1VQ6xBIa0QR
o8rA3LNop/zXpm68t8ThbFLR/1nsXl3qphAnTUks2YJXuKK21cFgmb2mb3E9JlOX
63X3BrDzspmq1yFXmJH/OVBtMgxEGiBauBqrwDxir3eRn9F6KNPkgSZa3huaUiR7
UA/KkO/kBsxVcCMLgPmZcS+91LQhfEGlW8nxB2bt2RDzqiZXck/tef6n/8/5Unqm
zScT0GgYLpdhQoOEnVo9qGd2eIBohprSf6zS7I8ythizBjKOs8CRfQw60XnTZdzi
FMmS5E1B+bIG5u0KraUvVs3z417kwdQ2+tR08jmi4fnZn3dfVqPilhTGleO2FHEy
h840pOM5sodMhEeZALzbgtMF3ZpqQKYi8aG5UYucTvtDdf+QDKJnjU5/90NY4PMS

相关文章:

  • 2021-08-11
  • 2021-05-26
  • 2022-12-23
  • 2021-11-02
  • 2022-01-17
  • 2021-05-19
猜你喜欢
  • 2021-04-06
  • 2022-12-23
  • 2022-01-05
  • 2022-01-24
相关资源
相似解决方案