Tomcat 作为一款应用服务器,为了实现隔离 Web 应用,需要在架构设计上打破双亲委派机制。双亲委派是指一个类的加载过程,由一个类加载器(通常是基础类加载器)递归调用其父类加载器的类加载逻辑完成。在 J2EE 规范中,规定应用服务器要默认使用一个基础类加载器作为双亲委派模型的起始点,从而保证应用服务器中所有类都从基础类加载器加载。
想要打破双亲委派机制,Tomcat 的架构设计可以分为以下几个步骤:
Tomcat 通过实现一套扩展的类加载器体系,来突破双亲委派机制。这包括创建多个独立的类加载器,每个类加载器负责加载一个应用服务器应用和相关的依赖。这些类加载器互相独立,不会触发递归加载,从而实现应用的独立加载。
在 Tomcat 中,我们需要重写 ClassLoader.loadClass()
方法,在创建类加载器上下文之前设置双亲委派逻辑,并实现自定义类加载器上下文共享与隔离。通过这种方式,每个自定义类加载器都能独立地实现自己的类加载。
WebAppClassLoader
实现 Web 应用的隔离Tomcat 使用一个特殊的类加载器 WebAppClassLoader
实现 Web 应用的隔离。WebAppClassLoader
会优先加载当前 Web 应用中的类,实现了 Web 应用之间的隔离。
综上,Tomcat 在架构设计上打破了经典的 J2EE 双亲委派模型,实现了一套类加载器体系,使得不同应用能够在服务器上独立加载运行。
领取专属 10元无门槛券
手把手带您无忧上云