Netty有什么用

随着移动互联网的爆发性增长,小明公司的电子商务系统访问量越来越大,由于现有系统是个单体的巨型应用,已经无法满足海量的并发请求,拆分势在必行。在微服务的大潮之中, 架构师小明把系统拆分成了多个服务,根据需要部署在多个机器上,这些服务非常灵活,可以随着访问量弹性扩展。 世界上没有免费的午餐, 拆分成多个“微服务”以后虽然增加了弹性,但也带来了一个巨大的挑战:服务之间互相调用的开销。 比如说:原来用户下一个订单需要登录,浏览产品详情,加入购物车,支付,扣库存等一系列操作,在单体应用的时候它们都在一台机器的同一个进程中,说白了就是模块之间的函数调用,效率超级高。 现在好了,服务被安置到了不同的服务器上,一个订单流程,几乎每个操作都要越网络,都是远程过程调用(RPC), 那执行时间、执行效率可远远比不上以前了。 远程过程调用的第一版实现使用了HTTP协议,也就是说各个服务对外提供HTTP接口。 小明发现,HTTP协议虽然简单明了,但是废话太多,仅仅是给服务器发个简单的消息都会附带一大堆无用信息:GET /orders/1 HTTP/1.1 Host: order.myshop.comUser-Agent: Mozilla/5.0 (Windows NT 6.1; )Accept: text/html;Accept-Language: en-US,en;Accept-Encoding: gzipConnection: 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。 另

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值