带你读《Apache Tomcat的云原生演进》——Tomcat的技术内幕和在喜马拉雅的实践(4)https://developer.aliyun.com/article/1377539
3. Classload Feature
Tomcat一直比servlet多,classload机制,它打破了双亲委派模型。我们JDK的classload一般都是一层一层先问,我们先问他的附近有没有交代,一直到最顶上去。Tomcat的整个原理是,首先classpath指定,然后这两个,CommonClassLoader有自己的class。它主要做了WebAppClassLoader,因为Tomcat支持部署多个服务,我们一般还能做多个业务。
那么它怎么隔离呢?
每个应用都有一个WebAppClassLoader,它会进入JDK里面加载一下。然后它这里两个顺序,一个是从WEB-INF下的Class,这个是我们自己写代码的ClassPath,还有一个我们依赖包。而且它还分顺序,需要先加载class,这就是为什么我们能把我们依赖的第三方框架重写,还能加载的有序。因为Tomcat先加载了class,我们编译的class里面的路径代码,再加的依赖包里面的路径。
4. Performance Optimization
我们的实践基本上都是用Tomcat来做的,不论是通过Tomcat部署的,还是SpringBoot嵌套的,全部默认的是Tomcat容器。
此外,还有一些个性化配置:
线程数,阻塞web服务可以2k:我们所有的web都是IO型的,你要读数据库、调rpc、调各种远程服务都是偏阻塞型的。web服务你基本都可以设定很大的线程数,要不然很容易不饱满。
Backlog,连接队列1024,gc影响建连:因为TPC以后,你需要先到Backlog里面等到accept建连,所以我们设置成1024,你在gc可能会影响你的建连。
maxHeepAliveRequests 1024,提升连接复用次数:Tomcat连接多少次是有限制的,默认最多100次,比如请求往里发送100次之后,它就会把你close,如果不close就会报错。所以我们会把次数调的比较大,让连接尽可能复用,减少建连的开销。
maxHttpHeaderSize 32k,和网关一致,减少400code:如果你公司会经过网关,
经过Tomcat,一些头比较大的时候,可能会等你400排查是哪里的问题。因为我们碰到很多这种case,所以我们尽快把全链路设置的一样大,减少配置的问题。
对象池技术,下面两张图是Tomcat用的最多的链接池,和每个请求相关:
带你读《Apache Tomcat的云原生演进》——Tomcat的技术内幕和在喜马拉雅的实践(6)https://developer.aliyun.com/article/1377537