Tomcat

----------------第一部分--------------------

一.后台应用架构

1.1.单体架构

传统架构(单机系统),一个项目一个工程:比如商品、订单、支付、库存、登录、注册等等,统 一部署,一个进程

如果某个功能模块出问题,有可能全站不可访问,修改Bug后、某模块功能修改或升级后,需要停 掉整个服务,重新整体重新打包、部署这个应用war包,功能模块相互之间耦合度高,相互影响,不适 合当今互联网业务功能的快速迭代

1.2.微服务

微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,每一 个微服务提供单个业务功能,一个服务只做一件事。每个服务都围绕着具体业务进行构建,并且能 够被独立地部署到生产环境、类生产环境等

微服务架构(分布式系统),各个模块/服务,各自独立出来,"让专业的人干专业的事",独立部 署。分布式系统中,不同的服务可以使用各自独立的数据库

举例说明:用户业务是一个团队来负 责,支付业务是一个团队来负责

二.tomcat,nginx,apache的使用场景及对比

Nginx与Apache、Tomcat区别_apache nginx tomcat-CSDN博客文章浏览阅读3.4k次,点赞49次,收藏42次。本文详细比较了Nginx与Apache在工作模式、性能、配置和功能等方面的差异,指出Nginx在高并发和静态内容处理上更优,但Apache在功能模块和动态处理上较为全面。推荐根据实际需求选择,如高性能要求优先Nginx,动态内容为主用Apache。https://blog.csdn.net/G_D0120/article/details/136270984

如果你只需要提供静态内容(如网站),使用Nginx或Apache。

如果你需要提供动态内容(如PHP, Python应用),使用Apache或者Tomcat。

如果需要高性能和高并发,推荐使用Nginx。

如果需要提供负载均衡、反向代理等功能,推荐使用Nginx或者Apache。

如果你是Java开发者,并需要应用服务器,推荐使用Tomcat。

----------------第二部分--------------------

一.环境部署

bash 复制代码
后端两台tomcat服务器
1.安装Java环境:
[root@tomcatnode2 ~]# yum search java*
[root@tomcatnode2 yum.repos.d]# yum install java-1.8.0-openjdk.x86_64
2.解压官网下载的tomcat安装包:
[root@tomcatnode2 ~]# tar xzf apache-tomcat-9.0.93.tar.gz -C /usr/local/
3.做软连接改名:
[root@tomcatnode2 ~]# ln -s /usr/local/apache-tomcat-9.0.93/ /usr/local/tomcat
4.进入bin目录执行启动命令:
[root@tomcatnode2 ~]# /usr/local/tomcat/bin/startup.sh
5.测试是否监听8080端口:
[root@tomcatnode2 ~]# netstat -antlupe | grep java
tcp6       0      0 :::8080                 :::*                    LISTEN      0          30141      2392/java
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      0          30150      2392/java
6.修改配置文件:
[root@tomcatnode2 ~]#  vim /usr/local/tomcat/conf/tomcat.conf
JAVA_HOME=/etc/alternatives/jre_openjdk
7.创建用户不创建家目录:
[root@tomcatnode2 ~]# useradd -s /sbin/nologin -M tomcat
8.给目录创建的用户的访问权限:
[root@tomcatnode2 ~]# chown -R tomcat.tomcat /usr/local/tomcat/
9.生成启动文件:
[root@tomcatnode2 ~]# vim /lib/systemd/system/tomcat.service
10.加载启动:
[root@tomcatnode2 ~]# systemctl daemon-reload
[root@tomcatnode2 ~]# systemctl enable --now tomcat
Created symlink /etc/systemd/system/multi-user.target.wants/tomcat.service → /usr/lib/systemd/system/tomcat.service.

测试:

二.反向代理

2.1.架构

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

2.2.实现

bash 复制代码
上传test.jsp到tomcat默认路径:/usr/local/tomcat/webapps/

2.3.测试

三.负载均衡

服务器端无法知道2次请求之间的联系,即使是前后2次请求来自同一个浏览器,也 没有任何数据能够判断出是同一个浏览器的请求。后来可以通过cookie、session机制来判断。

服务器端如果故障,即使Session被持久化了,但是服务没有恢复前都不能使用这些SessionID。 如果使用HAProxy或者Nginx等做负载均衡器,调度到了不同的Tomcat上,那么也会出现找不到 SessionID的情况。

3.1.实现

3.2.测试

3.3.参数测试

3.3.1.ip_hash

同一个ip地址去访问会使得流量分配到同一个浏览器,实现会话保持

往负载均衡的upstream模块增添ip_hash;即可

3.3.2.hash $cookie_JSESSIONID;

当有另一个浏览器重新打开时,按照负载均衡原则,流量应该在另一个主机上,但是ip_hash还是在同一个主机上,负载均衡就没有了意义,需要cookie解决,这样根据ID的不同就会实现负载均衡

测试:

3.4.session共享存储

要是有某一台主机故障,另一台主机是没有它的信息的,因此需要session实现会话保持

浏览器端第一次HTTP请求服务器端时,在服务器端使用session这种技术,就可以在服务器端 产生一个随机值即SessionID发给浏览器端,浏览器端收到后会保持这个SessionID在Cookie当 中,这个Cookie值一般不能持久存储,浏览器关闭就消失。浏览器在每一次提交HTTP请求的 时候会把这个SessionID传给服务器端,服务器端就可以通过比对知道是谁了

把需要的jar包全部放到/usr/local/tomcat/lib下,权限只要能读就行

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

配置过程

bash 复制代码
[root@tomcat ~]# yum install memcached -y
[root@tomcat ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1"
[root@tomcat ~]# systemctl enable --now memcached
[root@tomcat ~]# netstat -antlupe | grep memcache
tcp       0     0 0.0.0.0:11211           0.0.0.0:*               LISTEN     
980       97815     34711/memcached



[root@tomcat-1 ~]# vim /usr/local/tomcat/conf/context.xml
 @@@@内容省略@@@@
   <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
     memcachedNodes="n1:172.25.254.161:11211,n2:172.25.254.162:11211"
     failoverNodes="n1"
     requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
     
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFacto
ry"
   />
[root@tomcat-2 tomcat]# vim /usr/local/tomcat/conf/context.xml
 @@@@内容省略@@@@
   <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
     memcachedNodes="n1:172.25.254.161:11211,n2:172.25.254.162:11211"
     failoverNodes="n2"
     requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
     
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFacto
ry"
   />
bash 复制代码
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
upstream tomcat {
   hash $cookie_JSESSIONID;
   server 172.25.254.161:8080;
   server 172.25.254.162:8080;
}
server {
   listen 80;
   server_name www.timinglee.com;
   location ~ \.jsp$ {
       proxy_pass http://tomcat;
   }
}
相关推荐
儿时可乖了4 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
ruleslol5 分钟前
java基础概念37:正则表达式2-爬虫
java
xmh-sxh-131422 分钟前
jdk各个版本介绍
java
天天扭码41 分钟前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
程序猿进阶41 分钟前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺1 小时前
Spring Boot框架Starter组件整理
java·spring boot·后端
小曲程序1 小时前
vue3 封装request请求
java·前端·typescript·vue
陈王卜1 小时前
django+boostrap实现发布博客权限控制
java·前端·django
小码的头发丝、1 小时前
Spring Boot 注解
java·spring boot
java亮小白19971 小时前
Spring循环依赖如何解决的?
java·后端·spring