志在指尖
用双手敲打未来

Java能抵挡住JavaScript的进攻吗?

公元2014年,Java第八代国王终于登上了王位。
第一次早朝,国王坐在高高的宝座上,看着毕恭毕敬的大臣,第一次领会到了皇权的能力。
德高望重的IO大臣颤悠悠地走上前来:“启禀陛下,昨日收到战报,有个叫做Node.js的番邦又一次向我国进攻,我边防将士死伤沉重。”
“Node.js?那是什么东西?”国王心中一乐,还真有人自不量力,想蚍蜉撼树。想我Java帝国人口之众多,版图之宽广,踩死你小番邦还不像踩死一只蚂蚁似的。
“那是用JavaScript写的一个框架。”IO大臣看到国王不晓得Node.js,心里一沉。
“JavaScript?爱卿说笑了,一个在阅读器中运转的东西,怎样可能进攻我Java后端。”
“陛下有所不知,这JavaScript开展迅猛,不只占领了前端,还经过Node.js向后端,特别是我国浸透,臣还听说他们用Electron开端蚕食桌面开发了!”
“竟有这等事!难道他们想通吃?我们不是有Tomcat吗?派Tomcat去把Node.js给镇压了。”
国王开端仇恨本人的父亲JDK7世和祖父JDK6世没把这个Node.js当成一回事,没有把Node.js给扼杀在摇篮之中,把这个祸患留给了本人,心里开端发虚。
非阻塞异步IO
线程大臣走上前来:“陛下,Tomcat曾经率军和Node.js恶战了几日,败下阵来,这Node.js有个独门武器,叫做‘非阻塞异步IO’。”
“非阻塞?我听说我们的Tomcat也能完成非阻塞啊!”王国有点诧异。
“不行的,陛下,Tomcat在处置衔接的时分能完成非阻塞,但是在真正处置恳求的时分还是需求同步操作,一个恳求对应一个线程来处置,不像Node.js那样,都是异步操作,只要一个主线程在忙活。”线程大臣做了一个长篇大论的汇报,不晓得国王能否听懂。Java能抵挡住JavaScript的进攻吗?
(码农翻身老刘注:Node.js的故事请参见《Node.js:我只需求一个店小二》)
“众位爱卿,你们说说该怎样办?总不能让这小小番邦多次欺负我堂堂Java帝国吧。”
“臣倒是有一计,”汇合大臣说道,“这Node.js固然来势汹汹,但是它也有个致命的缺陷,那JavaScript是个动态言语,无法停止编译时类型检查,错误只要等到运转时才干暴显露来。用它开发个小项目还能够,一旦项目变大,代码变多,人员变多,那就会变成噩梦了。”
“爱卿说说详细怎样办?”
“我们能够派一些卧底去Node.js,四处传播这样的音讯,瓦解他们的军心和士气,让他们以为Node.js写的系统,很快就会堕落,最终还是要用我堂堂正正的Java言语来重写。”
“嗯,此乃心理战也,至少会稳住一些墙头草,准奏,由爱卿来布置。”国王说道,“不过,此法治本不治标,还是得想方法直接把他们打败。”
“陛下真乃一代圣君,”线程大臣马上开端拍马屁,与此同时,巧妙地把锋芒转向老不死的IO大臣:“我Java帝国在第4代国王的时分就呈现了非阻塞IO,这么多年过去了,竟然还没开展出相似Node.js的系统,真实是不应该啊。”
“老不死”的IO大臣是何等精明:“陛下明鉴,我Java帝国应用效劳器不断以来都是Tomcat独大,他们采用了线程池,每个恳求一个线程的方式,我也不好干预。”
IO大臣把义务推得一尘不染。
“没错,”汇合大臣为IO大臣仗义执言,两肋插刀,“还有一点就是这异步编程,听起来很好,但是写起来可就要命了,那么多的回调,几乎就是反人类,臣民们戏称为回调天堂,没人愿意那么写,开展不起来也很正常。”
线程大臣马上接口:“此言差矣,陛下曾经教会了臣民们如何运用Lambda表达式,并且如今也呈现了RxJava,曾经没什么回调天堂了!”
“那是如今,以前可没有!”
“……”
国王看到这几位大臣要打起来,马上发挥和稀泥之术:“众位爱卿各有道理,你们且说说,怎样才干打败着来势汹汹的Node.js吧。”
没人说话。
国王只好退朝。
京城酒馆
京城的小酒馆向来是一个多方音讯的集散地。
一个金发碧眼的小伙子正在“危言耸听”:“听说了没有,Node.js又赢了几仗,Tomcat大军死伤沉重,有不少臣民都投靠到那个番邦去了。”
“这异步操作真的有这么凶猛?”有人问道。
小伙子喝了一口酒:“其实不是异步操作更好,而是在高并发的环境异步操作更有效,大家都晓得,一个机器能支持的线程数目是有限的,不可能不断增加。Tomcat那种一个恳求一个线程的方式很快就会遇到瓶颈。”
“你说说,到底有什么益处?”有人寻根究底。
“如今效劳器端的操作无非就是操作文件,读写数据库,访问远程效劳,这些都是所谓阻塞操作。”小伙子展开了一张图:
“橙色的都是IO操作,绿色的才是真正的线程执行,IO操作十分耗时,线程大局部时间都糜费在了等候上面!假如能让线程不要等候,去做别的事情,那用少量的线程,以至一个线程就能够了。”
众人纷繁点头,这小伙子曾经看出了问题的关键,如今的很多系统,都是IO密集的,高并发状况下,假如一个恳求一个线程,糜费宏大。
“想我Java虚拟机如此强悍,假如能完成异步操作,那还不把Node.js秒成渣?!”小伙子狠狠地用手锤了一下桌子。
正在此时,酒馆冲进一队兵士,赶走众人,围住小伙子,领头的喝问到:“大胆刁民,居然四处鼓吹异步思想,给我带走!”
兵士恶狠狠地把他五花大绑,推出门去,留下一堆人在那里谈论纷繁。
IO王府
“我让你们把他请来,怎样绑来了?快松绑!”IO大臣呵责完下属,转头亲切地问道:“叫什么名字啊?”
“小人蒂姆,Tomcat府上的幕僚。”蒂姆一边说一边揉肩膀。
“Tomcat府上的人……”IO大臣捻着胡须若有所思。
“是的,大人,我还见过您呢,您上次半夜去Tomcat府上密谈……”
“住口!”IO大臣赶紧转换话题,“我的下属发现你四处鼓吹异步思想,终究要干什么?”
“小人创造了一个系统,叫做Node.x。”
“为什么不献于Tomcat将军?”
“唉,小人进言屡次,可是将军不听啊!”
“你说说看,这是个什么东西?是要模拟Node.js吗?”IO大臣问道。
之前蒂姆给Tomcat将军讲述过Node.js,他理都不理,经常是一甩袖子就走,本人是空有一身身手却无人赏识,难道这IO大臣能帮本人一把?想到此处,蒂姆肉体大振。
“的确遭到了它的启示,但是我的Node.x在架构和一些关键的笼统上和Node.js有很大不同。”蒂姆不好意义地笑了笑,“先说说相同的局部,既然都是异步操作,那肯定是经过事情驱动的,所以都有一个事情循环。”
IO大臣之前和Swing大臣聊过,晓得事情循环是怎样回事,这是一个相当古老的概念了。
无非就是有个线程在检测一个队列,假如队列中有事情,就拿出来处置。
“只不过我这里有所不同,能够创立多个事情循环出来,比方每一个CPU中心有一个,这样能够充沛应用CPU的多核性能。”蒂姆自得地说道。
(4个CPUcore,4个事情循环)
IO大臣点头表示赞同,他听说Node.js仿佛只要一个主线程,没法直接应用多核的才能。想应用多核的话还得开多个进程才行。
异步操作
“你图中的那个Hanlder就是详细的业务代码所在地吧?详细长什么样子啊,让我看看!”IO大臣问道。
蒂姆赶紧呈上代码,这是简单的HelloWorld。
这段代码生成了一个简单的HTTP效劳器,在8080端口监听,每当有恳求来的时分,都返回一个字符串“HelloWorld!”。
IO大臣一看,大为吃惊:“你这代码不需求外部容器,本人就搞了一个HTTP效劳器啊?”
“是的,这样我们就完整不用Tomcat了。我把这品种起来一个称号,叫做Verticle,部署以后,这个Verticle就能够和一个事情循环关联了。每次有HTTP恳求过来,Node.x会封装成事情,然后分派给它处置了。”
真是个二愣子,IO大臣心想,怪不得Tomcat对你不待见,你这个东西出来,他的位置不保啊!
IO大臣问道:“那关于数据库查询,你这个Handler,哦不,Verticle该怎样写?查询数据库这么慢,岂不是把事情循环都阻塞了?什么事情都做不了了?”
“大人您忘了,我们这里操作必需都是异步的,查询数据库也不例外。”
蒂姆说着展现了一段代码,经过异步的方式来查询数据库。
IO大臣慨叹道:“唉,老了,真是不中用了,连异步都忘了。对了,这些个Verticle看起来都是独立的,是被不同的线程调用的,他们之间怎样停止交互啊?难道也经过共享内存的方式?”
“大人真是凶猛,一下子就问到了中心问题,不能让他们共享内存,那样就需求加锁了,我这里引入了EventBus的办法,让他们之间经过音讯传送。”
“嗯,不错,完成了低耦合。”
“不只如此,这些Verticle还能够部署到不同的JVM中,经过EventBus完成真正的散布式通讯。”蒂姆又抛出一个重磅炸弹。
“如此甚好!”IO大臣爱才之心骤起,“你愿不愿意到老夫府上做幕僚啊?”
“小人愿意跟随大人!”
“好!明日早朝,你随我入宫,面见圣上,老夫保你一世荣华富贵。”
为什么是Vert.x?
第二日早朝,IO大臣迫不及待地给国王报喜:“陛下,我Java帝国也能够采用非阻塞异步编程了!击败Node.js之日可待。”
IO大臣讲述了昨晚的状况,细数了Node.x的种种益处。
Tomcat将军脸上极尴尬看,赶紧阻止:“陛下不可,我Java帝国采用同步处置曾经很久了,臣民们曾经习气了,如今改成异步,怕激起民变。”
“爱卿不要低估臣民采用新技术的才能嘛,宣蒂姆进殿,呈上代码。”
蒂姆都不敢看Tomcat,从怀里掏出一张纸,双手奉上。
国王盯着看了半天:“嗯?不对啊,你这不是Java代码吧?”
Tomcat拿过国王递过来的代码,扫了一眼:““大胆!你居然敢在朝堂之上悍然宣传JavaScript,来人,拿下!”
“陛下动怒,这是小人制定的一个战略,我的Node.x支持很多言语编程,除了Java之外,还有JavaScript,Ruby,Scala,Kotlin等等。”
“哦?是吗?这还能把番邦的人给吸收过来呢!你说呢,Tomcat将军?”国王说道。
Tomcat有些不自由,想找回场子:“嗯嗯,有一定道理,不过这个Node.x这个名字不好,拾人牙慧,让人看低我堂堂Java帝国。”
“Node是节点的意义,朕把他改成vertex如何?也是节点的意义。”
“陛下圣明,可否叫做vert.x?”IO大臣提议。
“好,准奏,即日起,命你和蒂姆锻炼臣民运用vert.x,一个月后向Node.js开战!”国王曾经忍Node.js很久了。
不,不能让IO大臣的Vert.x一家独大!
国王忽然想到了亲爹留下来的祖训,帝王之术是一定要均衡朝局。
“叮嘱下去,今晚朕要和Spring将军,嗯,还有线程大臣,共进晚餐,朕有些事情要和他们好好谈谈……”

未经允许不得转载:IT技术网站 » Java能抵挡住JavaScript的进攻吗?
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载