注意:本篇博文涉及的知识内容如下,实验中所用的系统环境为RHEL6.4。

1.Java基础知识讲解
2.Tomcat的安装和实现

3.通过apachemod_proxy模块代理并实现Tomcat负载均衡

4.基于Tomcat集群的网上商城的实现

------------------------------------------------------------------------------------------

1.Java基础知识讲解

1.1.Java相关的体系结构

1.Java程序设计语言

2.Java class 文件格式

3.Java 应用编程接口

4.Java 虚拟机

1.2.Java运行环境

用Java语言编译源代码,把它编译成Java Class文件,然后在Java VM中运行class文件;当编写程序时,通过调用类(Java API)中的方法来访问系统资源,而当程序运行时,它通过调用class文件中实现了Java API的方法也满足程序的Java API调用。Java VM和Java API一起组成了一个“平台”,所有Java程序都在其上编译和运行,因此,它们有时也被称作Java运行时环境。

相关实现模型如下:

Tomcat原理详解和各种集群的实现_第1张图片

1.3.JVM(虚拟机)运行数据区域 

Tomcat原理详解和各种集群的实现_第2张图片

1.4.相关术语概念

1.JVM : Java虚拟机 主要包含类加载器和相关的执行引擎

2.JDK : Java开发工具 主要包括Java运行环境,和javac编辑器及相关的API

3.Java SE : 包含JDK和一些核心的JAVA API

4.Java EE : 由Java SE 和一些Java企业级的API组成

1.5.web容器(Tomcat)

当JSP应用程序第一次调用之后,JSP会被编译成一个servlet类,后续的操作直接使用此类,从而避免了每次调用的都要重新分析和编译。因此,类似servlet,JSP的执行需要在container中完成JSP的container跟servlet的container基本相同。但在JSP执行之前,需要一些额外的步骤如与servlet代码建立会话等。Tomcat包含了一个叫做Catalina的Servlet container(执行servlet和编译过的JSP)和一个JSP编译器(Jasper)。

事实上,一个包含了JSP编译器和Servlet容器的应用程序组合通过被称作Web容器。


2.Tomcat的安装和实现

2.1.JDK的安装

目前开源JDKApacheHarmony, OpenJDK, SunJDK等。下载链接:

http://www.oracle.com/technetwork/java/javase/downloads/index.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@TomcatA ~]# rpm -ivh jdk-7u9-linux-x64.rpm
[root@TomcatA ~]# ll /usr/java/
total 4
lrwxrwxrwx 1 root root 16 Oct 3 19:52 default -> /usr/java/latest
drwxr-xr-x 10 root root 4096 Oct 3 19:52 jdk1.7.0_09
lrwxrwxrwx 1 root root 21 Oct 3 19:52 latest ->/usr/java/jdk1.7.0_09
[root@TomcatA ~]# vim /etc/profile.d/java.sh
exportJAVA_HOME=/usr/java/latest
exportPATH=$JAVA_HOME/bin:$PATH
[root@TomcatA ~]# . /etc/profile.d/java.sh
[root@TomcatA ~]# java -version
java version "1.7.0_09"
Java(TM) SE Runtime Environment (build 1.7.0_09-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)
[root@TomcatA ~]#

2.2.Tomcat安装(JAVA程序) --> 解压部署

官方网站http://tomcat.apache.org/

1
2
3
4
5
6
7
8
9
[root@TomcatA ~]# tar xf apache-tomcat-7.0.42.tar.gz -C /usr/local/
[root@TomcatA ~]# cd /usr/local/
[root@TomcatA ~]# ln -sv apache-tomcat-7.0.42 tomcat
`tomcat' -> `apache-tomcat-7.0.42
[root@TomcatA ~]# vim /etc/profile.d/tomcat.sh
exportCATALINA_HOME=/usr/local/tomcat
exportPATH=$CATALINA_HOME/bin:$PATH 
[root@TomcatA ~]# catalina.sh --help #显示相关的命令选项
[root@TomcatA ~]# jps #显示当前系统运行的JVM程序

2.3.编辑启动服务脚本

[root@TomcatA ~]# vim/etc/rc.d/init.d/tomcat

1
2
3
4
5
6
7
8
9
10
#!/bin/sh
# Tomcat init script for Linux.
#
# chkconfig: 2345 96 14
# description: The Apache Tomcat servlet/JSP container.
JAVA_OPTS= '-Xms64m -Xmx256m'#设置JAVA运行时的内容大小
JAVA_HOME=/usr/java/latest
CATALINA_HOME=/usr/local/tomcat
exportJAVA_HOME CATALINA_HOME
exec$CATALINA_HOME/bin/catalina.sh $*

2.4.配置文件介绍:

Tomcat的配置文件默认存放在$CATALINA_HOME/conf目录中,主要有以下几个:

1.server.xml: Tomcat的主配置文件,Service, Connector, Engine, Realm, Valve,Hosts主组件的相关配置信息;

2.web.xml:遵循Servlet规范标准,用于配置servlet,并为所有的Web应用程序提供包括MIME映射等默认配置信息;

3.tomcat-user.xml:Realm认证时用到的相关角色、用户和密码等信息;Tomcat自带的manager默认情况下会用到此文件;在Tomcat中添加/删除用户,为用户指定角色等将通过编辑此文件实现;

4.catalina.policy:Java相关的安全策略配置文件,在系统资源级别上提供访问控制的能力;

5.catalina.properties:Tomcat内部package的定义及访问相关的控制,也包括对通过类装载器装载的内容的控制;Tomcat6在启动时会事先读取此文件的相关设置;

6.ogging.properties:Tomcat6通过自己内部实现的JAVA日志记录器来记录操作相关的日志,此文件即为日志记录器相关的配置信息,可以用来定义日志记录的组件级别以及日志文件的存在位置等;

7.context.xml:所有host的默认配置信息;

2.5.主配置文件 /usr/local/tomcat/conf/server.xml中常用的组件介绍:

Server组件:使tomcat服务器启动一个实例

Service组件:关联一个引擎和此引擎相关的连接器

Connector组件:为引擎设置相关的连接器以接受客户端的访问请求

Engine组件:servlet处理器的一个实例,即servlet引擎

Host组件:位于engine容器中用于接收请求并进行相应处理的主机或虚拟主机

Context组件:在某些意义上类似于apache中的路径别名,一个Context定义用于标识tomcat实例中的一个Web应用程序

其余组建和详细参数信息请参考官方文档,在这里我就不再叙述。

2.6.应用程序目录的结构:

/WEB-INF/web.xml:包含当前webapp的deploy描述符,如所有的servlets和JSP等动态文件的详细信息,会话超时时间和数据源等;因此,其也通常用于定义当前webapp特有的资源;

/WEB-INF/classes: 包含所有服务器端类及当前应用程序相关的其它第三方类等;

/WEB-INF/lib: 包含JSP所用到的JAR文件;

2.7.简单测试:

我们将上述connector的端口由默认的8080修改为80,重启tomcat服务器并进行简单的访问测试

Tomcat原理详解和各种集群的实现_第3张图片


3.通过apachemod_proxy模块代理并实现Tomcat负载均衡

3.1.实验拓扑环境

Tomcat原理详解和各种集群的实现_第4张图片

3.2.简单应用程序的部署

在这里我们使用默认的/usr/local/tomcat/webapps/目录直接部署虚拟目录实现,而不再使用单独的虚拟主机定义。配置简单实现如下:

TomcatA

1
2
3
[root@TomcatA ~]# cd /usr/local/tomcat/webapps/
[root@TomcatA webapps]# mkdir -pv test/WEB-INF/{classes,lib}
[root@TomcatA webapps]# vim test/index.jsp
<% session.setAttribute("abc","abc"); %>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%@ page language= "java"%>
TomcatA

"red">TomcatA

"centre"border="1">
Session ID <%= session.getId() %>
Created on <%= session.getCreationTime() %>