云计算百科
云计算领域专业知识百科平台

企业级WEB应用服务器--tomcat

一 WEB技术

HTTP协议和B/S 结构

        操作系统通过多进程和多线程机制充分利用硬件资源,进程间可通过网络编程进行通信。常见的网络编程接口是Socket,客户端和服务端通常位于不同的物理主机,服务端通过Socket接收请求并提供计算或数据,构成Client/Server(C/S)编程模式。
        1990年,HTTP协议和浏览器的诞生促成了网页开发的兴起。网页存储在WEB服务器端,浏览器通过HTTP请求获取HTML文件,并渲染显示内容。最初,网页开发涉及HTML、CSS,目标是展示静态内容。
        随着动态网页需求的增加,JavaScript语言被引入使网页元素动态变化。随后,CGI(通用网关接口)技术实现了浏览器与服务器端脚本的交互,使得网页内容能够动态生成。此后,ASP、PHP、JSP等技术出现,推动了WEB后端编程的发展,而HTML、CSS、JavaScript仍用于前端编程,构成了Browser/Server(B/S)编程模式。

前端三大核心技术

HTML

        HTML(HyperText Markup Language)超文本标记语言,它不同于一般的编程语言。超文本即超出纯文本的范畴,例如:描述文本颜色、大小、字体等信息,或使用图片、音频、视频等非文本内容。
        HTML由一个个的标签(标记)组成,这些标签各司其职,有的提供网页信息,有的负责文字,有的负责图片,有的负责网页布局,所以一个HTML文件,是由格式标签和数据组成。

CSS(Cascading Style Sheets)层叠样式表

HTML本身为了格式化显示文本,但是当网页呈现大家面前的时候,需求HTML提供更多样式能力。这使 得HTML变得越来越臃肿。这促使了CSS的诞生。

1994年,W3C成立,CSS设计小组所有成员加入W3C,并努力研发CSS的标准,微软最终加入。

1996年12月发布CSS 1.0。

1998年5月发布CSS 2.0 CSS 3采用了模块化思想,每个模块都在CSS 2基础上分别增强功能。所以,这些模块是陆续发布的。

不同厂家的浏览器使用的引擎,对CSS的支持不一样,导致网页布局、样式在不同浏览器不一样。因此, 想要保证不同用户使用不同浏览器看到的网页效果一直非常困难。

JavaScript

        JavaScript(JS)是一种动态、弱类型的脚本语言,与HTML、CSS共同构成WEB核心技术,得到主流浏览器支持。1995年,网景公司发布了LiveScript,后更名为JavaScript,并与微软的JScript竞争。1997年,ECMA制定了JavaScript的标准ECMAScript。2008年,Chrome浏览器发布V8引擎,通过本地编译大幅提升了JavaScript的性能。2009年,Node.js基于V8引擎诞生,开启了服务器端JavaScript编程,成为前后端通用语言。

同步:在传统的交互式网页中,用户提交请求后,页面会刷新并重新渲染,返回新的页面内容,导致资源浪费和较差的用户体验。
异步:1996年,微软通过iframe实现局部异步加载。1999年推出ActiveX插件,支持异步数据传输。Ajax(异步JavaScript和XML)改变了网页更新方式,通过后台与服务器交换少量数据,无需重新加载整个页面。Ajax使用XMLHttpRequest实现异步更新,并推动了前后端分离的发展。AJAX是一种技术组合,深刻影响了WEB开发。

二 WEB框架

web资源和访问

从静态服务器请求HTML、CSS、JS等文件发送到浏览器端,浏览器端接收后渲染在浏览器上从图片服务 器请求图片资源显示 从业务服务器访问动态内容,动态内容是请求后有后台服务访问数据库后得到的,最终返回到浏览器端.

后台应用架构

单体架构

        传统架构(单机系统)将所有功能模块(如商品、订单、支付等)放入一个应用,统一部署在单台服务器上,采用“all in one”架构。通过水平复制和负载均衡扩展应用,使用Java的JSP和Servlet技术打包成jar或war文件部署。 
        这种架构易于开发、测试和部署,但随着系统规模增大,模块间耦合度高,功能升级或Bug修复可能导致全站停运,且管理难度增加,不适合快速迭代的互联网业务。对于大型应用,分工协作和维护管理变得复杂。常见的Web应用服务器有Tomcat、Jetty、Glassfish(开源)和WebLogic、WebSphere、JBoss(商用)。

微服务

        微服务架构是SOA(面向服务架构)的子集,其核心是将传统的一站式应用拆分为独立的服务,每个服务围绕特定业务功能构建,减少耦合并支持独立部署。每个微服务可以独立启动或销毁,通常采用轻量级通信机制,如基于HTTP的RESTful API。不同服务可使用独立数据库。
        微服务架构也影响了企业研发团队的组织结构,从传统的水平架构(前端、后端、DBA、测试)转向垂直架构(每个业务模块独立团队),但实际情况可能不完全按此划分。
        微服务的实现框架和部署方式多样,适应不同的应用需求。

单体架构和微服务比较

微服务的优点:

高内聚低耦合:每个服务专注于单一业务功能,代码易于理解和维护。
小团队开发:每个微服务可由2-5人的小团队开发,开发效率高。
独立性:微服务在开发和部署时独立,松耦合,易于管理。
技术灵活性:可使用不同编程语言开发每个服务。
易于集成:微服务易与第三方系统集成,支持自动化部署。
前后端分离:前后端独立,微服务专注于业务逻辑,界面部分可与之分离。
独立存储:每个服务有独立存储,或使用统一数据库。

微服务的缺点:

复杂度增加:拆分后增加开发、测试、运维和监控的复杂度。
数据一致性问题:分布式事务和异步补偿机制增加设计和开发难度。
技术要求高:开发和运维人员需具备较强的分布式系统技术能力。
不适合小型应用:对于小系统,盲目拆分可能增加维护成本。

常见的微服务框架:

Dubbo:高性能Java RPC框架,支持服务注册、发现与治理,常与Zookeeper配合使用。
Spring Cloud:基于HTTP协议的微服务框架,支持服务拆分和模块间通信,功能更为全面。

三 tomcat的功能介绍

        Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,Tomcat 具有处理HTML页面的功能,它还是一个Servlet和JSP容器起始于SUN 公司的一个Servlet的参考实现项目 Java Web Server,开发者是 James Duncan Davidson,
        在1999年,将项目贡献给了apache软件基金会(ASF),和ASF现有的项目 JServ 合并,并开源成为顶级项目
        Tomcat 仅仅实现了Java EE规范中与Servlet、JSP相关的类库,是JavaEE不完整实现。
        1999年发布初始版本是Tomcat 3.0,实现了Servlet 2.2 和 JSP 1.1规范。
        Tomcat 4.x发布时,内建了Catalina(Servlet容器)和 Jasper(JSP engine)等
        当前 Tomcat 的正式版本已经更新到 9.0.x 版本,但当前企业中主流版本为 8.x 和 7.x 

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

官网文档: https://tomcat.apache.org/tomcat-8.5-doc/index.html

帮助文档:

https://cwiki.apache.org/confluence/display/tomcat/ https://cwiki.apache.org/confluence/display/tomcat/FAQ

环境配置

主机名 IP
tomcata 172.25.254.10
tomcatb 172.25.254.20
nginx 172.25.254.100

安装 Tomcat

推荐从Apache官网下载源码包直接安装启动

安装java环境(以tomcata为例子)

#安装java环境

[root@tomcata ~]# yum install java-1.8.0-openjdk.x86_64 -y

#查看java版本
[root@tomcata ~]# java -version
openjdk version "1.8.0_362"
OpenJDK Runtime Environment (build 1.8.0_362-b09)
OpenJDK 64-Bit Server VM (build 25.362-b09, mixed mode)

#查看java的环境目录
[root@tomcata ~]# which java
/usr/bin/java
[root@tomcata ~]# ll /usr/bin/java
lrwxrwxrwx 1 root root 22 8月 11 06:29 /usr/bin/java -> /etc/alternatives/java

#java的运行环境
[root@tomcata ~]# cd /etc/alternatives/jre
[root@tomcata jre]# ls
ASSEMBLY_EXCEPTION bin lib LICENSE THIRD_PARTY_README

.安装并启动tomcat

#解压并生成tomcat的程序目录
[root@tomcata ~]# tar zxf apache-tomcat-9.0.107.tar.gz -C /usr/local/
[root@tomcata ~]# cd /usr/local/
[root@tomcata local]# ls
apache-tomcat-9.0.107 etc include lib64 sbin src
bin games lib libexec share
[root@tomcata local]# mv apache-tomcat-9.0.107/ tomcat
[root@tomcata local]# ls
bin etc games include lib lib64 libexec sbin share src tomcat

#启动tomcat
[root@tomcata local]# cd tomcat/
[root@tomcata tomcat]# cd bin/
[root@tomcata bin]# ls
bootstrap.jar configtest.sh shutdown.sh
catalina.bat daemon.sh startup.bat
catalina.sh digest.bat startup.sh
catalina-tasks.xml digest.sh tomcat-juli.jar
ciphers.bat makebase.bat tomcat-native.tar.gz
ciphers.sh makebase.sh tool-wrapper.bat
commons-daemon.jar setclasspath.bat tool-wrapper.sh
commons-daemon-native.tar.gz setclasspath.sh version.bat
configtest.bat shutdown.bat version.sh
[root@tomcata bin]# ./startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.

#查看端口
[root@tomcata bin]# netstat -antlupe | grep java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 0 36535 3755/java
tcp6 0 0 :::8080 :::* LISTEN 0 37089 3755/java

访问tomcat

tomcat的文件结构和组成

目录结构

目录   说明
——————————————————-
bin 服务启动、停止等相关程序和文件
conf 配置文件
lib   库目录
logs 日志目录
webapps 应用程序,应用部署目录,相当于nginx的默认发布目录
work jsp 编译后的结果文件,建议提前预热访问

查看tomcat相关目录和文件

[root@tomcata local]# ls /usr/local/tomcat/
bin CONTRIBUTING.md logs RELEASE-NOTES webapps
BUILDING.txt lib NOTICE RUNNING.txt work
conf LICENSE README.md temp

生成tomcat的启动文件(以tomcata为例子)

生成tomcat的主配置文件

[root@tomcata ~]# vim /usr/local/tomcat/conf/tomcat.conf
JAVA_HOME=/etc/alternatives/jre

生成启动文件

[Unit]
Description=Tomcat
After=syslog.target network.target

[Service]
Type=forking
EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
PrivateTmp=true
User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target

生成tomcat用户并设定软件安装目录权限

[root@tomcata ~]# useradd -s /sbin/nologin -M tomcat
[root@tomcata ~]# chown tomcat.tomcat /usr/local/tomcat/ -R

用启动脚本开启服务

[root@tomcata ~]# systemctl enable –now tomcat
Created symlink /etc/systemd/system/multi-user.target.wants/tomcat.service → /usr/lib/systemd/system/tomcat.service.

四 结合反向代理实现tomcat部署

利用 nginx 反向代理实现

利用nginx反向代理功能,实现图中的代理功能,将用户请求全部转发至指定的同一个tomcat主机 利用nginx指令proxy_pass 可以向后端服务器转发请求报文,并且在转发时会保留客户端的请求报文中的 host首部

[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
   location ~ \\.jsp$ {
       proxy_pass http://172.25.254.10:8080;
   }

[root@nginx nginx]# vim /etc/nginx/conf.d/vhosts.conf

server {
listen 80;
server_name www.timinglee.org;

location ~ \\.jsp$ {
proxy_pass http://172.25.254.10:8080;
}
}

[root@nginx nginx]# systemctl restart nginx
#在本机把域名写上 172.25.254.100 www.timinglee.org

#在172.25.254.10上准备一个test.jsp文件放到[root@tomcata ~]# cp test.jsp /usr/local/tomcat/webapps/ROOT/

[root@tomcata ~]# cp test.jsp /usr/local/tomcat/webapps/ROOT/

#在浏览器上测试
http://www.timinglee.org/test.jsp

测试:在浏览器中访问信息

tomcat负载均衡实现

[root@nginx nginx]# vim /etc/nginx/conf.d/vhosts.conf
upstream tomcat {
ip_hash;
hash $cookie_JSESSIONID;
server 172.25.254.10:8080;
server 172.25.254.20:8080;
}

server {
listen 80;
server_name www.timinglee.org;

location ~ \\.jsp$ {
proxy_pass http://tomcat;
}
}
[root@nginx nginx]# systemctl restart nginx

测试

不同浏览器里测试http://www.timinglee.org/test.jsp

五 Memcached

Memcached 是一种基于 Key-Value 的内存缓存系统,支持高效的数据存取,但不具备持久化功能。尽管没有像 Redis 那样的 RDB 和 AOF 数据持久化,Memcached 可通过集群同步保证数据一致性,即使某个节点发生故障,只要集群中有可用节点,数据也不会丢失。当故障节点恢复时,它会自动从其他节点获取数据。
Memcached 使用操作系统的 libevent 库来优化读写性能,支持在 Linux、BSD、Solaris 等操作系统上高效运行。它限制最大存储对象为 1MB,超过此大小的数据可通过客户端压缩或拆分存储。Memcached 适合用于存储用户会话数据,以实现会话共享。
数据存储时,Memcached 会将内存划分为 1MB 的块(称为 slab 或 page)。此外,Memcached 支持多种开发语言,如 Java、C、Python、PHP、C#、Ruby、Perl 等。

Memcached 官网:http://memcached.org/

memcached的安装与启动

[root@tomcata ~]# vim /etc/sysconfig/memcached
[root@tomcata ~]# cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1"

[root@tomcata ~]# systemctl enable –now memcached
Created symlink /etc/systemd/system/multi-user.target.wants/memcached.service → /usr/lib/systemd/system/memcached.service.
[root@tomcata ~]# netstat -antlupe | grep memcache

memcached 操作命令

五种基本 memcached 命令执行最简单的操作。这些命令和操作包括:

set

add

replace

get

delete

#前三个命令是用于操作存储在 memcached 中的键值对的标准修改命令,都使用如下所示的语法:
command <key> <flags> <expiration time> <bytes>
<value>

#参数说明如下:
command set/add/replace
key     key 用于查找缓存值
flags     可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
expiration time     在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
bytes     在缓存中存储的字节数
value     存储的值(始终位于第二行)
#增加key,过期时间为秒,bytes为存储数据的字节数
add key flags exptime bytes  

[root@tomcat ~]# telnet localhost 11211
Trying ::1…
Connected to localhost.
Escape character is '^]'.
#增加
add leekey 0 60 4 #0 是否压缩 60 过期时间 4 字长
test
STORED
add leekey1 0 60 3
lee
STORED
#查看
get leekey
VALUE leekey 0 4
test
get leekey1
VALUE leekey1 0 3
lee

#改
set leekey 0 60 5
test1
STORED
get leekey
VALUE leekey 0 5
test1
END
add leekey1 0 60 4
test
#删除
delete leekey
DELETED
get leekey
END
get leekey1
VALUE leekey1 0 3
lee
#清空
flush_all
OK
get leekey1
END

六.session 共享服务器

msm 介绍

msm(memcached session manager)提供将Tomcat的session保持到memcached可以实现高可用。

项目早期托管在google code,目前在Github github网站链接:

https://github.com/magro/memcached-session-manager

安装

参考链接: https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration
将spymemcached.jar、memcached-session-manage、kyro相关的jar文件都放到Tomcat的lib目录
中,这个目录是 $CATALINA_HOME/lib/ ,对应本次安装就是/usr/local/tomcat/lib。

kryo-3.0.3.jar
asm-5.2.jar
objenesis-2.6.jar
reflectasm-1.11.9.jar
minlog-1.3.1.jar
kryo-serializers-0.45.jar
msm-kryo-serializer-2.3.2.jar
memcached-session-manager-tc9-2.3.2.jar
spymemcached-2.12.3.jar
memcached-session-manager-2.3.2.jar

t1和m1部署可以在一台主机上,t2和m2部署也可以在同一台。
当新用户发请求到Tomcat1时, Tomcat1生成session返回给用户的同时,也会同时发给memcached2备份。即Tomcat1 session为主session,memcached2 session为备用session,使用memcached相当于备份了一份Session如果Tomcat1发现memcached2 失败,无法备份Session到memcached2,则将Sessoin备份存放在memcached1中

配置过程

下载相关jar包
下载相关jar包,参考下面官方说明的下载链接
https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration

[root@tomcata ~]# cd /usr/local/tomcat/lib/
[root@tomcata lib]# ls
annotations-api.jar servlet-api.jar
asm-5.2.jar spymemcached-2.12.3.jar
catalina-ant.jar tomcat-api.jar
catalina-ha.jar tomcat-coyote-ffm.jar
catalina.jar tomcat-coyote.jar
catalina-ssi.jar tomcat-dbcp.jar
catalina-storeconfig.jar tomcat-i18n-cs.jar
catalina-tribes.jar tomcat-i18n-de.jar
ecj-4.20.jar tomcat-i18n-es.jar
el-api.jar tomcat-i18n-fr.jar
jasper-el.jar tomcat-i18n-ja.jar
jasper.jar tomcat-i18n-ko.jar
jaspic-api.jar tomcat-i18n-pt-BR.jar
jsp-api.jar tomcat-i18n-ru.jar
kryo-3.0.3.jar tomcat-i18n-zh-CN.jar
kryo-serializers-0.45.jar tomcat-jdbc.jar
memcached-session-manager-2.3.2.jar tomcat-jni.jar
memcached-session-manager-tc9-2.3.2.jar tomcat-util.jar
minlog-1.3.1.jar tomcat-util-scan.jar
msm-kryo-serializer-2.3.2.jar tomcat-websocket.jar
objenesis-2.6.jar websocket-api.jar
reflectasm-1.11.9.jar
#给172.25.254.20传过去
[root@tomcata lib]# scp /usr/local/tomcat/lib/* root@172.25.254.20:/usr/local/tomcat/lib

修改tomcat配置

upstream tomcat {
hash $cookie_JSESSIONID;
server 172.25.254.10:8080;
server 172.25.254.20:8080;
}

server {
listen 80;
server_name www.timinglee.org;

location ~ \\.jsp$ {
proxy_pass http://tomcat;
}
}

测试:
1.在两台tomcat都开启的情况下:
http://www.timinglee.org/test.jsp

2.在n1被停止后继续提交信息看是否可以读取到之前的会话信息

[root@tomcata lib]# systemctl stop tomcat

赞(0)
未经允许不得转载:网硕互联帮助中心 » 企业级WEB应用服务器--tomcat
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!