转自:码农翻身(微信号:coderising)程序员
我是Servlet, 因为不少框架把我深深地隐藏了起来,我变得彷佛可有可无了,不少人也选择性的把我给遗忘了。 其实,我还活得好好的呢, 只不过是从前台明星慢慢退居幕后而已。
好基友Servlet + JSPweb
想当年我刚刚诞生的时候,无数人对我趋之若鹜。数据库
由于那个时候Web服务器只能处理静态的HTML页面,图片,JavaScript这样的东西, 好比Apache 这个著名的Web服务器。编程
人类想要看一点动态的内容,好比什么留言板,购物网站等,还得靠极为难用的CGI。后端
我一出生, 他们就欢呼着把CGI给抛弃,纷纷改用Java写Servlet程序, 再后来个人好兄弟JSP问世,咱们简直造成了绝配。浏览器
我负责控制,JSP负责视图,再加上负责数据的Java Bean, MVC三驾马车正式造成,风靡一时,想当年,著名的开源论坛软件Jive就是咱们的巅峰之做。安全
提及JSP,这小子有时候还不太服我,常常振振有词地说:“你Servlet没什么了不得的,我也能够当Controller!”服务器
JSP确实能够当Controller, 早些年我还真的见过,一个长达6000多行的JSP,行使着Controller的职责,每当程序员要改这些代码就胆颤心惊,叫苦连天。微信
其实JSP不知道,它本质上也就是Servlet ,JSP只不过穿了一件漂亮的外衣,给了程序员们一个轻松写动态页面的工具而已,实际运行的时候会被编译成Servlet类, 本质上咱们是同样的。网络
我和JSP都生活在Servlet Container当中,Container这个词有点高大上,可是说白了,无非就是能执行Servlet和JSP的一个东西,好比说Tomcat, 好比说Jetty。
可是不管是我仍是JSP, 咱们能处理的只是HTTP请求,必须得有人把HTTP请求转发给咱们才能够。
这件事情只有让Tomcat, Jetty他们来作了,他们本身能够接收HTTP请求,而后转发给咱们;
他们也能够从别人,例如Apache那里接收HTTP请求,而后发给咱们处理,处理完了再转发给Apache, Apache再发给人类的浏览器。
虽然有点麻烦, 可是这种方式确实很是灵活,各司其职,扩展性比较好,好比,一个Apache能够把请求分发给后台多个Tomcat中的一个。
Apache,Nginx 他们专心致志地去处理静态内容(HTML, JS, 图片) ,咱们这里心无旁骛地执地执行“不讲逻辑的”业务逻辑,访问数据库,而后生成页面返回。
日子过得波澜不惊,我一度认为,这个世界就将这么运行下去。
应用程序越开发越多,出现了一些通用的需求,好比安全,事务,分布式等等,这些需求应用程序不肯意处理,想丢给操做系统,操做系统也不肯意处理, 那怎么办?
不知道是谁提了一个叫作中间件的概念: 大家不肯意作的,咱们中间件来作。
Java 世界也不敢怠慢,也搞出了一大堆的规范,像什么EJB,JMS,JTA等等,把我和JSP也合并到其中,造成一个大“杂烩”,叫作J2EE。
其中最春风得意的就是EJB这家伙,独自生活在EJB Container中(又是Container!),号称能支持真正地分布式计算:一个EJB能够有多个实例,分布到多个服务器中,应对用户的请求, 听起来很高深的技术。
他们把Servlet Container称为Web Container , 和EJB Container 一块儿,还有其余的一些东西,被合并到一个叫作Application Server当中去了。 最知名的几个Application Server 就是 Weblogic , WebSphere , JBoss。
国内的金蝶也实现过一个,叫作Apusic,虽然影响力不如前面那几位,但值得赞扬。
退居幕后
我和JSP都没有料到,EJB抢了咱们的风头,成了系统的中心, 让咱们极为不爽。
我和JSP岂能善罢甘休? 咱们决定抓住EJB的弱点进行反击, 咱们和人类一个叫作Rod Johnson的联合,让他出面,列举出EJB的36大罪状,昭告天下,这些罪状包括但不限于:笨重,性能低下,难于测试,昂贵…
EJB确实是个扶不起的阿斗, 很快就被人批得体无完肤,你们纷纷投入Rod Johnson 建立的Spring的怀抱。
我松了一口气, 但是很快就发现事情不对劲,你们纷纷用起了框架! 好比Struts, SpringMVC…
在这些框架中,我虽然处于一个很是重要的角色, 可是一般状况下只要配置一下web.xml,就能够把我扔到一边了。
Container 照例把HTTP请求传递给我,可是我却不能亲手处理,我须要传递给框架,框架分派给Controller,没我什么事了!
那些程序员们要作的事情就是写Controller, Service , DAO这些和我八班杆子打不着的东西。
我恨框架, 可是看到程序员们写代码写得那么高兴,又无话可说,毕竟框架极大地减小了他们的工做量:
以前对于每一个HTTP请求,程序员得手工地去解析URL, 调用相关的Java Bean。
如今只须要用个配置文件或者注解就能够把URL给映射到一个Java 类。
以前对于HTTP请求中的参数, 程序员也得手工解析和验证。
如今也能够直接映射到Java 对象或者变量
…
用起来这么简单,他们不用才怪。
更让人生气的是,Rod他们后来倒腾出来一个叫作Spring Boot的东西,完全地把我给隐藏起来了!
尤为是对于一个新手来讲,甚至彻底不知道个人存在。
Tomcat和Jetty这样的Servlet Container也很悲催,他们居然被内嵌到了Spring Boot中! 程序员开发出的Web应用,就像一个普通的Java程序同样,从main函数开始运行。
咱们完全地退居幕后了!
不过我有义务提醒一下学习后端编程的同窗,不要一上来就学习框架,不要被框架迷住你的双眼!
仍是应该好好看看最基本的Java Web, 就是我和个人兄弟JSP。
虽然是退居幕后,可是个人核心地位依然稳固,是Java Web应用的中坚力量,我生活在Servlet Container中,专门处理HTTP请求,这么多年难逢敌手。
直到有一天,有个叫作Netty的家伙上门挑战。
这个Netty竟然彻底不用Servlet Container,或者换句话说,人家本身就是一个“Container” , 这对我来讲绝对是釜底抽薪的攻击, 我引觉得傲的Servlet 规范, Servlet API通通无论用了。
我只能处理HTTP, 但是这个Netty支持各类各样的协议:HTTP, FTP, UDP, 它还支持实现各类各样自定义的协议! 这就意味着程序员彻底能够自定义一套本身应用的RPC协议,而后放到Netty上运行。
它的底层是Java NIO,又封装了Java NIO那些复杂的底层细节,能够轻松实现高性能、高可靠的网络服务器, 这实在是太可怕了。
我彷佛看到了一个可怕的场景: 用Netty 开发的服务器端,运行着众多的Web 服务,他们之间使用私有的协议在互相调用,效率极高,性能极高, 根本没有Servlet, HTTP, Tomcat什么事。
让我稍感安慰的是,直接使用Netty的程序员们还很少,虽然说有很多人在使用基于Netty的Dubbo, 可是Netty也被封装隐藏起来了。 我估计真正具备钻研精神的程序员才愿意去研究他吧。