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;
   }
}
相关推荐
【D'accumulation】35 分钟前
典型的MVC设计模式:使用JSP和JavaBean相结合的方式来动态生成网页内容典型的MVC设计模式
java·设计模式·mvc
试行1 小时前
Android实现自定义下拉列表绑定数据
android·java
茜茜西西CeCe1 小时前
移动技术开发:简单计算器界面
java·gitee·安卓·android-studio·移动技术开发·原生安卓开发
救救孩子把1 小时前
Java基础之IO流
java·开发语言
小菜yh1 小时前
关于Redis
java·数据库·spring boot·redis·spring·缓存
宇卿.1 小时前
Java键盘输入语句
java·开发语言
浅念同学1 小时前
算法.图论-并查集上
java·算法·图论
立志成为coding大牛的菜鸟.1 小时前
力扣1143-最长公共子序列(Java详细题解)
java·算法·leetcode
鱼跃鹰飞1 小时前
Leetcode面试经典150题-130.被围绕的区域
java·算法·leetcode·面试·职场和发展·深度优先
爱上语文3 小时前
Springboot的三层架构
java·开发语言·spring boot·后端·spring