先不要被标题吓着,呵呵。
在 Windows/.NET 的Web应用架构中,基本上没有什么Web服务器与应用服务器(App Server)之分,都是 IIS 来共同负责,当然在 Windows 2003 的 IIS 6.0 的内部实现上,似乎也还是有点区分的,如 HTTP.Sys、HTTP SSL 及 ASP.NET 等,没有深究过,但整体上感觉还都是属于 IIS 一个整体。
在基于 Java 的 Web 应用架构中(PS:为什么不说是 J2EE 呢?个人觉得 J2EE 这个名词被滥用和用烂了,有些人拿 JSP 随便写个东西就说是 J2EE 应用,还分辩说大海里的水不叫水?其意是既然 J2EE 规范中有 JSP ,那用了 JSP 就可以名正言顺的叫 J2EE 应用了,我的意见是:大海里的水是叫水,但不能拿一滴水出来就说自已是大海吧?),一般是将 Web Server 和 App Server 明确划分开的,负责静态页面的 Web Server 一般由 Apache 来负责,负责 JSP/Servlet/EJB 的 App Server 由各厂商不同的产品负责,如 WebSphere、WebLogic 等,表面上看,也算不算的搭配,Web Server 接收所有的 HTTP 请求,如果发现是 JSP/Servlet 请求,再通过 App Server 的插件转给 App Server 来处理,并将结果再返回给客户端。
试想一下,真正 Web 应用有多少是静态页面?以前还真没注意过这个问题,最近接触了一个网上银行的系统,估算了一下,此系统的静态 HTML 页面不超过 50 个,而 JSP 有近 800 个,这样的结果是大约 95% 的请求都要由 Web Server 来转给 App Server 来处理,那么这种两个进程甚至两个机器间的通讯而带来的性能消耗是不是有点太大了?
当然 Web 应用中还有图形/图像文件、JavaScript、CSS 文件等静态内容,但这些内容都是可以缓存在客户端的。
在 Sina、网易或以信息发布为主这样的网站中,静态内容占绝大多数,使用 Web Server 是有道理的,但是如果基于 Java 的 Web 应用架构应用在企业中,静态内容很少,Web Server 是否是个多余的东西?再说了,这些 App Server 产品的厂商自吹自擂的那么好,难道处理一点静态内容就成问题了?
是呀,Martin Fowler都说“分布式的第一原则是尽量不要采用分布式”。Web Server与App Server分离的采用有时完全是一些大的软件供应商基于市场推广的目的在鼓励用户采用的,即便是用户真的不是那么需要。
别光拿Java说事嘛,.Net大型应用里面,也是可以把繁重的任务从aspnet_wp里面拿出来的。:)
xp都内置firewall了,企业就不要花冤枉钱买硬件firewall了 🙂
还有php呢,况且apache又不是说光静态
分离HTTP和Java Servlet容器在很多环境下是非常必要的,这个话题很大,简单来说,起码可能出于两个理由:
1、安全以及防火墙的隔离
有人说XP内置了防火墙,这种防火墙叫做“个人”防火墙,随便一个DOS,XP就完蛋了。
2、负载均衡
在HTTP Server端进行请求的负载均衡是一种很理想的方式,WebSphere的群集就是这样做的
再着,如果你非常熟悉Apache,你就会知道,Apache提供了非常非常多的很需要的功能,JavaWeb容器并不具备
分布式的第一原则是尽量不要采用分布式 – 高见!
To robbin:
1. 关于个人防火墙
本来不关文章主题的,随便说说的,首先指明你的拼写错误,是 DoS 而非 DOS;另外,XP 本来就是个人操作系统,用的防火墙当然也是“个人”防火墙了;Windows 中带的防火墙并没有你说的那么差,“随便一个 DoS 就完蛋了”也属于危言耸听,Windows 2003 中自带的防火墙和 XP 的防火墙是差不多的,也很少听人说“随便一个 DoS 就完蛋”的事情。
2. 确实有很多 Load Balance 是用 Web Server 来实现的,但再考虑一下,明明是 Web Server ,不负责 Web ,却负责 Load Balance ,那不如改叫 Load Balance Server 算了;Apache 的功能是很多,但在企业应用中,尤其是最典型的基于 Java 的企业 Web 应用中,Apache 的功能能用多少?用得着虚拟主机吗?
3. Apache 支持 cgi ,也是 php 的理想选择,但在企业内部应用中,使用并不多。
感觉楼主说的和.net路子是一条,只不过在.net中app server是aspnet_wp是微软自己的。
没错。之前做了一个项目就是前面用Apache来处理http请求,通过桥接再把相关的应用请求转发给Weblogic来处理。
后来发现这样做浪费硬件成本和维护成本不说,处理效率也不见得很高。
于是把Apache给撤掉直接Weblogic访问。
"基本上没有什么Web服务器与应用服务器(App Server)之分,都是 IIS 来共同负责"
不大明白……COM+是做啥的……ServicedComponent是做啥的……MSDTC是做啥的……
To Wang Ting:
要这么说,那得把 EJB ,甚至 CICS 拖出来比较了,本文并没有深究后端的东西,再说了,ASP 时代用 COM+ 尚有一点,到 ASP.NET ,用 COM+ 的有多少? 有没有统计一下基于 MS IIS 的 Web 应用 COM+ 的比例有多少?
本文没扯那么远。
WebSphere和WebLogic 都提供了Web Server,分开了就意味着松耦合,松耦合就意味着可以切换。与其说Web Server与Application Server的结合,还不如说Servlet Container与Application Server的结合,譬如Tomcat+JBoss, JRocket+ Jetty。
软件与硬件之间是可以对比的,如果CPU跟主板集成了(这在386和486年代都是常见的),你希望升级的时候,你就要付出CPU+主板的成本。
Java世界里更多的是标准与架构,也就成就了百家争鸣的局面,也就成就了更多更好的产品,更多的公司能够从中获利。
BTW:PHP在企业内部中使用并不会少~~
不好意思,上面写错了一个地方:JRocket+ Jetty应该是Jetty+JBoss。
http与Servlet Container的分离,可以多一处性能的优化切入点,例如:gis地图信息文件可以在代理服务器缓存,这些url文件是可以不访问Servlet Container,理论上是可以优化性能。