接口学Tomcat

极客

接口学Tomcat:我用了一个月才搞明白的那些事儿

说真的,刚开始听到“接口学Tomcat”这个说法的时候,我整个人是懵的,啥?接口还能跟Tomcat扯上关系?这不是两个八竿子打不着的东西吗?后来真正上手做项目了,才慢慢琢磨出味儿来——哎,还真不是瞎说的。

接口学Tomcat

先说说我踩过的坑吧,最开始写接口,我就是那种“能跑就行”的心态,一个Servlet写完,doGet里面随便返回个JSON,觉得自己可牛了,结果呢?项目一上线,并发稍微一上来,接口响应慢得跟蜗牛爬似的,我当时就纳闷了,代码逻辑没问题啊,咋就这么慢呢?后来老大一句话点醒我:“你了解Tomcat是怎么处理请求的吗?”我愣住了,是啊,我天天用Tomcat,可我从来没想过它是怎么工作的。

于是我开始认真研究Tomcat的线程模型,你知道吗,Tomcat默认用的是线程池来处理请求的,maxThreads默认200,也就是说,你的接口再快,同时能处理的请求数也是有上限的,我当时那个接口里面做了个数据库查询,还没加索引,一个请求要跑两秒多……你算算,200个线程全卡在那儿,后面的请求全得排队,这不就是典型的“接口设计没考虑Tomcat的运行机制”嘛!说白了,接口学Tomcat,第一步就是得搞清楚你的接口跑在什么样的容器里,容器的脾气你得摸清楚啊!

再说个有意思的,Tomcat有个连接器(Connector)的概念,什么BIO、NIO、APR,我一开始根本不管这些,默认配置直接用,后来有一次压测,发现QPS死活上不去,查了半天才发现连接器配置和我的接口特性不匹配,我的接口是IO密集型的,大量时间花在等数据库返回上,这时候NIO的优势就体现出来了——一个线程可以管多个连接嘛,改了配置之后,QPS直接翻了一倍多!那一刻我真的有种“原来如此”的顿悟感,兴奋得差点从椅子上跳起来。

还有啊,Tomcat的web.xml配置、Filter链的执行顺序、Servlet的生命周期……这些东西你写接口的时候要是不注意,真的会出各种幺蛾子,我就遇到过一个Filter顺序配错了,导致权限校验在日志记录之后执行,出了问题查日志根本查不出来谁调的,你说气不气人?所以我现在写接口,一定会先想想:这个请求进了Tomcat之后,会经过哪些环节?每个环节我能做什么优化?这就叫接口学Tomcat,真的,你把这个思路理清楚了,接口的质量能上一个台阶。

最后说句掏心窝子的话,别觉得Tomcat就是个“跑War包的容器”,它里面的学问大着呢,线程池参数怎么调、连接数怎么配、JVM内存怎么分,这些都跟你的接口性能直接挂钩,我现在每次设计新接口,都会问自己一句:这个接口在Tomcat里跑起来,会不会有什么隐患?你要也这么想,恭喜你,你也开始接口学Tomcat了。

行了,今天就唠到这儿,有啥问题评论区见,我看到就回!

文章版权声明:除非注明,否则均为极客网安-咸鱼原创文章,转载或复制请以超链接形式并注明出处。

目录[+]