【Tomcat学习笔记】15-Connector

Connector配置

Connector 属于 StandardService 里的一个组件,可以在 server.xml 中配置,指定协议、端口、超时时间等。

1
2
3
4
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
</Service>

每个 Service 里可以配置多个 Connector. Tomcat 的 Connector 支持两种协议,HTTP 和 AJP. 关于这两种协议,官方文档如此说:

  • The HTTP connector is setup by default with Tomcat, and is ready to use. This connector features the lowest latency and best overall performance.
  • When using a single server, the performance when using a native webserver in front of the Tomcat instance is most of the time significantly worse than a standalone Tomcat with its default HTTP connector, even if a large part of the web application is made of static files. If integration with the native webserver is needed for any reason, an AJP connector will provide faster performance than proxied HTTP. AJP clustering is the most efficient from the Tomcat perspective. It is otherwise functionally equivalent to HTTP clustering.

【Tomcat学习笔记】14-Cluster

Tomcat Cluster 这块代码较多,就不贴代码一步步看了,这里从更宏观的视角分析和总结一下。代码主要在 org.apache.catalina.ha 和 org.apache.catalina.tribes 两个package. ha这个package主要做了两件事,或者说Tomcat cluster 主要就做了这两件事:集群间 Session 同步 和 集群War部署。tribes 则是Tomcat 集群通讯模块。

【Tomcat学习笔记】13-Session

说明,为了简洁,这里贴的代码可能有所删减。

1. Session入门

网上会经常看到介绍Session和Cookie区别的文章,当年我也傻傻的看过,然这两个根本不是一个东西,有啥好比较的,简直就好比问TCP和JAVA的区别。

Session 是什么?我就不去抄维基百科了,谢晞鸣的理解:HTTP协议本身是无状态的(所谓无状态,就是指前后两HTTP请求是独立的,后面的HTTP请求没法知道前面那次做了啥),但在很多场景中,我们需要有状态,比如用户的登录态,而 Session 就是这样一种让应用有状态的机制。

Session 最简单的用法是:
【1】在登录方法中

1
2
3
4
5
Boolean isLogin = login(userId, password)
if(isLogin) {
HttpSession session = request.getSession();
session.setAttribute("userId", userId);
}

【Tomcat学习笔记】12-Tomcat的Mapper机制

说明,为了简洁,这里贴的代码可能有所删减。

【Tomcat学习笔记】2-整体架构 中有介绍过 Tomcat 中 Engine、Host、Context、Wrapper 这四个组件的关系。还是以 http://www.mydomain.com/app/index.html 为例。

300
当我们访问这个网址的时候,Tomcat 如何一步步路由找到对应的 Host、Context、Wrapper 的呢?Tomcat 中维护了一个 Mapper,在收到 Http 请求后,会去 Mapper 中查找对应的 Host、Context 和 Wrapper,放到 request 的 MappingData 中一路带下去。

Mapper的构建过程

【Tomcat学习笔记】11-Tomcat中的JMX

JMX 科普

JMX(Java Management Extensions)其实就是一套标准,定义了一套架构(设计模式或者说API)用于管理和监控Java应用程序。JMX官方介绍


这是 JMX 的架构,可以通过各种协议接入进来,然后通过 MBeanServer 操作各个 MBean.

这里的 MBean 分为静态Bean和动态Bean,静态Bean能力有限,只能用于获取一些静态信息。动态Bean, 可以在运行时改变它的属性,执行它的方法,动态Bean,必须继承 DynamicMBean 接口,动态 Bean 会定义 MBeanAttributeInfo(属性信息)/ MBeanOperationInfo(方法信息)等,然后一起注册到 MBeanServer 中去,使用的时候通过MBServer 获取该 MBean, 拿到属性信息或方法信息,然后通过反射的方式去动态的改变属性,执行方法。

关于DynamicBean最基础的用法可以参考动态MBean:DynamicMBean

后面的介绍假设你已经了解JMX了基本概念和使用方法,

【Tomcat学习笔记】10-代码变更时自动部署

一直在入门,但从未精通,所以不敢说深入分析 XXX,顶多就是一个学习笔记,但是是原创,转载请注明出处,好吧,说的好像有人会看一样。
说明,为了简洁,这里贴的代码都有所删减。

在看 ClassLoader 代码的过程中,我发现了 WebappLoader 的 reloadable 属性,通过分析代码,把自动部署的过程摸清楚了。这个属性在开发过程中挺有用的,有时候在Debug的时候改了代码,重启Tomcat又要等半天,reloadable 这个属性就可以派上用场了。

每个 Container 在start的最后,都会执行这样一段代码,ContainerBase#threadStart.

1
2
3
4
5
6
7
8
9
10
11
12
protected void threadStart() {
if (thread != null)
return;
if (backgroundProcessorDelay <= 0)
return;

threadDone = false;
String threadName = "ContainerBackgroundProcessor[" + toString() + "]";
thread = new Thread(new ContainerBackgroundProcessor(), threadName);
thread.setDaemon(true);
thread.start();
}

【Tomcat学习笔记】9-ClassLoader

一直在入门,但从未精通,所以不敢说深入分析 XXX,顶多就是一个学习笔记,但是是原创,转载请注明出处,好吧,说的好像有人会看一样。
说明,为了简洁,这里贴的代码都有所删减。

先来张图:

ClassLoader基础

Java 自带了三个类加载器,BootstrapClassLoader、ExtClassLoader 和 AppClassLoader,它们之间的层级关系如图,上面的 ClassLoader 是下面 ClassLoader 的 parent.不同的 ClassLoader 有不同的职责:

  • BootstrapClassLoader, 引导类加载器,加载JDK最核心的类,比如 rt.jar, java.lang.String, java.lang.Integer 这些类都在这个 JAR 中
  • ExtClassLoader, 扩展类加载器,加载 jre/lib/ext 目录下的类
  • AppClassLoader, 系统类加载器,加载应用程序 classpath 目录下的所有jar和class文件

如果想看 ClassLoader 具体加载了哪些类,可以 getURLs, 然后将它们打印出来

1
2
URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();
URL[] urls = ((URLClassLoader)Thread.currentThread().getContextClassLoader()).getURLs();

【Tomcat学习笔记】8-Context创建过程(应用的部署过程)

之前说过,Context 和 Wrapper 的创建和其他组件的创建过程有点不一样,这两者没有在 server.xml 中配置,并不是在解析 server.xml 的时候创建的. 谢晞鸣 Debug 代码,发现。。。

HostConfig 是 StandardHost 的一个 LifeCycleListener,在 StandardHost start 的时候,会触发 START_EVENT 事件,
HostConfig 监听到该事件后,。。。。

1
2
3
4
5
6
7
//HostConfig#start
public void start() {
....
if (host.getDeployOnStartup())
deployApps();
...
}