基于 AJP 工作
通常一个 web服务站点的后端服务器不是将 Java 的应用服务器直接暴露给服务访问者,而是在应用服务器,如 Jboss 的前面在加一个 web 服务器,如 Apache或者 nginx,我想这个原因大家应该很容易理解,如做日志分析、负载均衡、权限控制、防止恶意请求以及静态资源预加载等等。
下图是通常的 web 服务端的架构图:
图 7. Web 服务端架构(查看大图)
这种架构下 servlet引擎就不需要解析和封装返回的 HTTP 协议,因为 HTTP 协议的解析工作已经在 Apache 或 Nginx 服务器上完成了,Jboss只要基于更加简单的 AJP 协议工作就行了,这样能加快请求的响应速度。
对比 HTTP协议的时序图可以发现,它们的逻辑几乎是相同的,不同的是替换了一个类 Ajp13Parserer 而不是 HttpParser,它定义了如何处理 AJP协议以及需要哪些类来配合。
实际上在 AJP 处理请求相比较HTTP 时唯一的不同就是在读取到 socket 数据包时,如何来转换这个数据包,是按照 HTTP 协议的包格式来解析就是 HttpParser,按照 AJP协议来解析就是 Ajp13Parserer。封装返回的数据也是如此。
让 Jetty 工作在 AJP协议下,需要配置 connector 的实现类为 Ajp13SocketConnector,这个类继承了 SocketConnector 类,覆盖了父类的newConnection 方法,为的是创建 Ajp13Connection 对象而不是 HttpConnect