汤姆猫的原理及使用

介绍
java语言
java是一种面向对象编程语言,Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。

我们今天的关注的是可以编写Web应用程序和

可以编写Web应用程序
就是上面提到的applet和servlet这类东西咯
可移植性
Java和C、C++等语言不一样吗,其他语言不能跨平台?
Java确实是跨平台的,而C不是,其原因为Java并不直接编译为机器语言,而是先编译为中间语言.class。在各个平台上均有Java虚拟机(Java Virtual Mechinal,JAVA虚拟机),可以对此中间语言解释执行,所以说它是跨平台的。

下面两张图是我在网上找来的,c语言和java编译的示意图:
在这里插入图片描述
在这里插入图片描述
1.2 JVM
JVM(Java Virtual Mechinal,JAVA虚拟机)
它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟出各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆、栈、寄存器等,还具有相应的指令系统。

它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可 以在虚拟机上执行,也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。

JVM是干什么的呢?
JVM的主要工作职责是解释自己的指令集(字节码)并映射到本地的CPU的指令集或者OS的系统调用。说白了,就是个解释器,把.class字节码解释成运行代码。
为什么JVM 跟Java的跨平台特性息息相关?
因为不同的操作系统使用不同的JVM映射规则,让其与操作系统无关。
虽然java程序生成的字节码文件.class是相同的,但不同的平台的虚拟机不同,就是导致不同平台上的不同虚拟机的映射原则不一样。
可以说,JVM屏蔽了平台的差异。

1.2.2 JRE
JRE (Java Runtime Environment,Java运行环境)。
JRE是Sun公司发布的一个更大的系统,它里面就有一个JVM 。除此之外,JRE还包括核心类库和支持文件。所有的Java程序都要在JRE下运行。
如果你想运行一个java程序,光有JVM是不够的,因为在解释class的时候JVM需要调用解释所需要的类库lib。

解释所需要的类库是什么意思?
就好比我们如果要造汽车,就不需要重复发明轮子。java类库就是已经发明的轮子~直接拿来用即可。
Java的类库是Java语言提供的已经实现的标准类的集合,比如说:
1.2.3 JDK
JDk (Java Development ToolKit, Java 开发工具包)。
JDK是整个Java的核心,包括JVM(Java Runtime Environment),Java工具(javac、javac、jdb等)和Java基础的类库

1.2.4 JVM、JRE、JDK 的关系
JRE=JVM + java类库

JDK=JRE + 开发工具
在这里插入图片描述

2tomcat 的介绍
我们上面说过JDK、servlet、JSP三者之间的关系
servlet container = JDK + servlet
web container = JDK + servlet + JSP
而tomcat就是一个web container!!!

Tomcat是Apache软件基金会( + servlet + JSPn)的Jakarta 项目中的一个核心项目,由Apache、Su
n和部分公司和个人一起开发完善的轻量级Web应用服务器,是Servlet规范和JSP规范的开源实现。由于因Tomcat 技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web应用服务器。目前Tomcat最新的版本是9.0版本。

Tomcat就是一个Java EE的不完整实现,是一个web容器,也可以成为web服务器。它只使用了Java EE附带的两个类库-----Servlet与JSP,(关于这两个类库什么关系上边我们已经详述!),Tomcat服务器时Apache组织开发的一种JSP引擎,同时支持Servlet,本身就具有WEB服务器的功能,但是在WEB服务器方面Tomcat处理静态的HTML页面不如Apache迅速,也没有Apache健壮,所以我们一般将Tomcat与Apache配合使用,让Apache处理静态页面的请求,Tomcat作为专门的JSP引擎,提供JSP解析。
在这里插入图片描述

各常见组件:
1、服务器(server):Tomcat的一个实例,通常一个JVM只能包含一个Tomcat实例;因此,一台物理服务器上可以在启动多个JVM的情况下在每一个JVM中启动一个Tomcat实例,每个实例分属于一个独立的管理端口。这是一个顶级组件。
2、服务(service):一个服务组件通常包含一个引擎和与此引擎相关联的一个或多个连接器。给服务命名可以方便管理员在日志文件中识别不同服务产生的日志。一个server可以包含多个service组件,但通常情下只为一个service指派一个server。
连接器类组件:
3、连接器(connectors):负责连接客户端(可以是浏览器或Web服务器)请求至Servlet容器内的Web应用程序,通常指的是接收客户发来请求的位置及服务器端分配的端口。默认端口通常是HTTP协议的8080,管理员也可以根据自己的需要改变此端口。一个引擎可以配置多个连接器,但这些连接器必须使用不同的端口。默认的连接器是基于HTTP/1.1的Coyote。同时,Tomcat也支持AJP、JServ和JK2连接器。
容器类组件:
4、引擎(Engine):引擎通是指处理请求的Servlet引擎组件,即Catalina Servlet引擎,它检查每一个请求的HTTP首部信息以辨别此请求应该发往哪个host或context,并将请求处理后的结果返回的相应的客户端。严格意义上来说,容器不必非得通过引擎来实现,它也可以是只是一个容器。如果Tomcat被配置成为独立服务器,默认引擎就是已经定义好的引擎。而如果Tomcat被配置为Apache Web服务器的提供Servlet功能的后端,默认引擎将被忽略,因为Web服务器自身就能确定将用户请求发往何处。一个引擎可以包含多个host组件。
5、主机(Host):主机组件类似于Apache中的虚拟主机,但在Tomcat中只支持基于FQDN的“虚拟主机”。一个引擎至少要包含一个主机组件。
6、上下文(Context):Context组件是最内层次的组件,它表示Web应用程序本身。配置一个Context最主要的是指定Web应用程序的根目录,以便Servlet容器能够将用户请求发往正确的位置。Context组件也可包含自定义的错误页,以实现在用户访问发生错误时提供友好的提示信息。

注: 本文中所有实验和示例都需要关闭防火墙和selinux

3 实现汤姆猫的安装 yum
yum install tomcat -y
yum install tomcat-webapps tomcat-admin-webapps -y
iptables -F
测试访问

4
tomcat的配置信息:
端口号:
8080:主端口号
8005:本地管理端口号
8009:ajp的编辑器
tomcat的主页面:
/usr/share/tomcat/webapps/ROOT/
创建主页面index.jsp (必须是以jsp为结尾的文件)
如果是自己定义的主页面目录也必须是在大写的ROOT文件夹下
tomcat的目录结构 (对于自己安装的rpm包;/usr/local/tomcat/)
bin:脚本,及启动时用到的类;
conf:配置文件目录;
lib:库文件,Java类库,jar;
logs:日志文件目录;
temp:临时文件目录;
webapps:webapp的默认目录;
work:工作目录,存放编译后的字节码文件

5 管理接口

<Server port=”8005″ shutdown=”SHUTDOWN”>(8005默认监听在本机的IP地址;
SHUTDOWN:可以关闭tomcat)

yum install telnet(安装包)
telnet 127.0.0.1 8005 (连接本机的8005 端口)
输入 SHUTDOWN 就可以将本机的tomcat关闭了。为了安全可以将SHUTDOWN改为其他的字符。
连接器及协议:
<Connector port=”8080″ protocol=”HTTP/1.1″ (http的连接器及协议)
connectionTimeout=”20000″ (连接延时时间:单位是毫秒)

<Connector port=”8009″ protocol=”AJP/1.3″ redirectPort=”8443″ /> (Java的连接器及协议)
<Engine name=”Catalina” defaultHost=”localhost”> (默认tomcat的主机名称及默认的IP地址)
(如果创建了多个虚拟tomcat的主机;想要其中的某一个作为默认的主机,可以在此更改)

<Host name=”localhost” appBase=”webapps” (主机名和网页的根目录)
unpackWARs=”true” autoDeploy=”true”> (本机默认的主机及配置:unpackWARs:是否自动展开war文件;autoDeploy:是否自动部署新添加的应用程序)
6 部署(deploy)webapp的相关操作:
部署有两种方式:
自动部署:auto deploy
手动部署:
冷部署:把webapp复制到指定的位置,而后才启动tomcat;
热部署:在不停止tomcat的前提下进行部署;(支持热部署)
部署工具:manager、ant脚本、tcd(tomcat client deployer)等
undeploy:拆除(反部署),停止webapp,并从tomcat实例上卸载webapp;
start:启动处于停止状态的webapp;
stop:停止webapp,不再向用户提供服务;其类依然在jvm上;
redeploy:重新部署

示例:部署一个资源文件:
vim /usr/share/tomcat/webapps/test/index.jsp

 <%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>Test Page</title>
</head>
<body>
<% out.println("hello world");
%>
%</body>
%</html>

访问http://192.168.199.130:8080/test/就可以访问到刚才部署的新的资源文件了)

7
tomcat的两个管理应用:(图形化管理界面)
manager (管理tomcat主机上的应用资源程序的)
host-manager (管理多个tomcat虚拟主机)
vim /etc/tomcat/tomcat-users.xml



在这里插入图片描述

在浏览器上
http://192.168.199.130:8080/manager/
http://192.168.199.130:8080/host-manager/ (在浏览器上打开就可以了)
管理虚拟主机和应用程序

8 实现多个虚拟主机
编辑配置配置文件,添加虚拟主机:
vim /etc/tomcat/server.xml

<Host name="www.a.com"  appBase="/data/test"
            unpackWARs="true" autoDeploy="true"/>
<Host name="www.b.com"  appBase="/data/host"
            unpackWARs="true" autoDeploy="true"/>

在这里插入图片描述

(新添加的两个虚拟主机的主页面文件应该放在/data/test/ROOT/下和/data/host/ROOT/下;其他的子url路径放在/data/test/下和/data/host/下就可以了)
然后再/data/下新建两个文件夹test和host并在里面再新建ROOT目录:
mkdir /data/host/ROOT/
mkdir /data/test/ROOT/
然后在每个ROOT/下新建测试的实例程序:
vim /data/test/ROOT/index.jsp

<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA.magedu.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("magedu.com","magedu.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>

vim /data/host/ROOT/index.jsp

<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA.magedu.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("magedu.com","magedu.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html

最后测试:由于需要解析 主机名所以只能在centos的图形界面上去访问:在centos6上在/etc/hosts文件里将主机名添加进去,大开centos6的浏览器去访问就可以了。
vim /etc/hosts

192.168.199.130 www.a.com www. b.com

10
实验:实现用nginx将服务反代到后台的服务器上去
拓扑图如下
在这里插入图片描述

将所有服务都反代到后台服务器
1 . 在调度器上的配置:
yum install nginx
vim /etc/nginx/nginx.conf

upstream www {
server 192.168.199.130:8080;
server 192.168.199.128:8080;
}
server {
listen 80 default_server;
root /usr/share/nginx/html;
location / {
proxy_pass http://www;
}
}

systemctl start nginx

后端tomcat
yum install tomcat -y
yum install tomcat-webapps tomcat-admin-webapps -y
iptables -F
安装tomcat

tomcat 1
删除原有的index.jsp的文件
然后新建测试文件
cd /usr/share/tomcat/webapps/ROOT/
rm -f *.jsp
vim index.jsp

<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="green">TomcatA.magedu.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("magedu.com","magedu.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>

systemctl restart tomcat

tomcat 2
cd /usr/share/tomcat/webapps/ROOT/
rm -f *.jsp
vim index.jsp

<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
<body>
<h1><font color="yellow">TomcatA.magedu.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("magedu.com","magedu.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>

systemctl restart tomcat
在浏览器上访问nginx的IP地址http:192.168.100.244就可以实现对后台两台nginx的轮询调度访问了

11 在上述实验中 tomcat 服务器不变,关闭nginx
systemctl stop nginx
用apache 实现负载均衡向后面多台住机去调度。
1 在调度器上安装httpd
yum install httpd

需要的httpd的代理模块:
proxy_module
proxy_http_module:适配http协议客户端;
proxy_ajp_module:适配ajp协议客户端
httpd -M (可以查看所支持的模块列表)

在httpd 调度器上
vim /etc/httpd/conf.d/http-tomcat.conf

<proxy balancer://tcsrvs>
                                        BalancerMember http://192.168.199.128:8080
                                        BalancerMember http://192.168.199.130:8080
                                        ProxySet lbmethod=byrequests
                                </Proxy>

                                <VirtualHost *:80>
                                        ServerName www.a.com
                                        ProxyVia On
                                        ProxyRequests Off
                                        ProxyPreserveHost On
                                        <Proxy *>
                                                Require all granted
                                        </Proxy>
                                        ProxyPass / balancer://tcsrvs/
                                        ProxyPassReverse / balancer://tcsrvs/
                                        <Location />
                                                Require all granted
                                        </Location>
                                </VirtualHost>

如果使用ajp协议的话httpd 调度器上配置如下
vim /etc/httpd/conf.d/http-tomcat.conf

   <proxy balancer://tcsrvs>
                                        BalancerMember ajp://192.168.199.128:8009
                                        BalancerMember ajp://192.168.199.130:8009
                                        ProxySet lbmethod=byrequests
                                </Proxy>

                                <VirtualHost *:80>
                                        ServerName www.a.com
                                        ProxyVia On
                                        ProxyRequests Off
                                        ProxyPreserveHost On
                                        <Proxy *>
                                                Require all granted
                                        </Proxy>
                                        ProxyPass / balancer://tcsrvs/
                                        ProxyPassReverse / balancer://tcsrvs/
                                        <Location />
                                                Require all granted
                                        </Location>
                                </VirtualHost>

httpd调度的一些参数设置:
status:(状态)
D:禁用
S:orker is administratively stopped.
I: 由于系统默认就对后端服务器进行健康性检测,如果需要忽略检测,添加此选项就可以了。
H: 备用主机如果在某台主机上添加此选项,当所有主机都宕机时才开启此主机作为备用的。
E;标记为错误的模式
N:排干模式
示例:
BalancerMember ajp://192.168.199.130:8009 status=D
httpd的调度算法和权重:
loadfactor:
负载因子,即权重;
调度算法:
byrequests:轮询的调度算法 (默认的调度算法)
会话粘性的实现方法:
Header add Set-Cookie “ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/” env=BALANCER_ROUTE_CHANGED

ProxyPass / balancer://tcsrv/ stickysession=ROUTEID 添加这行在配置文件中

header那行用于自动生成cookie
ProxyPass那行 最后的stickysession=ROUTEID,表示从cookie中读取ROUTEID,并自动分配到相应的服务上去。

猜你喜欢

转载自blog.csdn.net/qq_42635996/article/details/82950770
今日推荐