java容器很很多,tomcat、jetty、jboss、resin、weblogic、webspere等等。
有收费的,也有开源免费的,性能可能是有些许差异的,理论上,收费的应该比免费的,性能要要一些。
但是,用开源免费的来做巨大访问量的(比如千万PV)应用,也是毫无问题的,当前我们所处的技术浪潮,性能的瓶颈一般都在数据库上,在硬盘的访问上,而不是网络请求和响应。
已知互联网公司使用的java容器:
jetty:google、美团
tomcat:yougou.com
jetty官网:http://www.eclipse.org/jetty/
jetty源码:git clone https://github.com/eclipse/jetty.project.git
关于tomcat的博客:http://blog.csdn.net/puma_dong/article/details/21875253
Jetty 的工作原理以及与 Tomcat 的比较
Google App Engine转向了Jetty
本周遇到一个jetty日志的问题,看jetty的request.log日志中,我们post过来的参数没有记录,google了好久,没有答案,于是把jetty源码下载下来,看了看日志这部分:jetty-server/src/main/resource/org/eclipse/jetty/server/NCSARequestLog.java,发现日志中关于参数相关的日志,只记录了request.getUri(),也就是说只有get的参数才能记录到日志里面去,post的参数都不会记录到日志里面。
相关帖子:
http://wiki.eclipse.org/Jetty/Tutorial/RequestLog
启动过程中,jetty的INFO级别及以上的日志,会打印到IDE控制台(比如Eclipse),突然有一天,日志不再打印到IDE控制台,而是到某个地方后,重定向到了logs/jetty.log.2015-06-10,如图:
开始发现这个日志和mms-boot-0.8.jar中的配置一致,截图如下:
所以把问题的原因定义为:jetty定义的重定向,对于控制台的输出重定向到了文件(实际jetty8.xml仅仅是对System.out/error进行了重定向)。
后来了解到,其他的项目也是同样的启动方式,没有这个问题。
于是重新查原因,对比hotel-campaigns和hotel-cms的日志的不同,开始时有“先入为主”的思维定势,潜意识相信是jetty8.xml再捣鬼,所以对比两个项目的依赖mms的版本、及执行jetty8.xml处的日志,修改log4j.xml配置文件进行多种办法的尝试,没有找出问题。
结合下午发现的log4j.xml配置文件不生效,可以确定:IDE启动hotel-campaigns项目时,对于slf4j的实现,用了logback,为什么突然用了logback呢?
结合pom.xml,可以看到:
于是exclusions 这个jar,问题解决。
参考文章:
http://www.slf4j.org/codes.html#multiple_bindings
http://www.slf4j.org/manual.html
使用RunJettyRun插件,项目运行正常,截图如下:
使用嵌入式方式运行,打不出启动成功的标记,截图如下:
开始尝试解决问题:
1、由于“springmvc”是web.xml里面关于SpringMVC的servlet,尝试把SpringMVC相关的内容都去掉,依然没有打出启动成功的日志
2、尝试着访问了一下antispider-server提供的Thrift服务和Web服务,结果都是正常的,很是疑惑,这个时候怀疑:RunJettyRun插件(这相当于Jetty容器)和Bootstrap(这相当于Jetty内嵌),对于SpringMVC或者Web项目的处理方式,有很大不同,导致没有正常启动完毕。
评:这实际是由于对Jetty理解不深刻,胡乱猜忌Jetty了,如果作为容器和嵌入式,有很大的差别,这简直是不可想象的。
由于没有解决问题,结合Bootstrap源码,关注以上图示中的“第一点”和“第二点”
第一点:这一点没啥好说的,就是src/main/resource下没有config.properties,对于结果没有影响,期间经历一个小插曲,hotel-campaigns-web项目,没有config.properties文件,也没打这行日志,经查是因为依赖的sinai.client里面有config.properties
第二点:这一点因为使用RunJettyRun插件时没有这个日志,所以被高度怀疑,差异了一些资料,但是依然没有解决
http://stackoverflow.com/questions/22938689/info-no-spring-webapplicationinitializer-types-detected-on-classpath
http://stackoverflow.com/questions/16321819/no-spring-webapplicationinitializer-types-detected-on-classpath
http://steveliles.github.io/setting_up_embedded_jetty_8_and_spring_mvc_with_maven_and_no_xml.html
http://hitmit1314.iteye.com/blog/1315816
3、万不得已,新建一个单纯的aitispider-test项目,使用Bootstrap运行,并逐渐增加antispider-server的配置文件,终于在一步增加log4j.xml时,问题重现,找出原因:
4、"org"中,“ERROR”以下级别的日志被过滤了,用RunJettyRun插件,启动成功,是oejs包打印的,所以能显示;而用嵌入式Jetty,启动成功是org包打的,所以被过滤掉了,截图如下:
5、故事到此就结束了,但这个经历,加深了对嵌入式Jetty的理解:服从一套规范,实现一组标准,帮我们实现高效的Web通讯。如果写过ServerSocket通讯程序,会对嵌入式Jetty更深入的了解。
另外一个没有微观佐证的问题,关于Maven解决冲突的方式:
对于,这个问题,我使用准确告诉maven使用版本的方式解决(这是最标准、明确的方式,本身对于pom.xml就应该进行准确的定义,不应该依赖Maven自定义的方式帮我们解决冲突):