----------------第一部分--------------------
一.后台应用架构
1.1.单体架构
传统架构(单机系统),一个项目一个工程:比如商品、订单、支付、库存、登录、注册等等,统 一部署,一个进程
如果某个功能模块出问题,有可能全站不可访问,修改Bug后、某模块功能修改或升级后,需要停 掉整个服务,重新整体重新打包、部署这个应用war包,功能模块相互之间耦合度高,相互影响,不适 合当今互联网业务功能的快速迭代
1.2.微服务
微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,每一 个微服务提供单个业务功能,一个服务只做一件事。每个服务都围绕着具体业务进行构建,并且能 够被独立地部署到生产环境、类生产环境等
微服务架构(分布式系统),各个模块/服务,各自独立出来,"让专业的人干专业的事",独立部 署。分布式系统中,不同的服务可以使用各自独立的数据库
举例说明:用户业务是一个团队来负 责,支付业务是一个团队来负责
二.tomcat,nginx,apache的使用场景及对比
如果你只需要提供静态内容(如网站),使用Nginx或Apache。
如果你需要提供动态内容(如PHP, Python应用),使用Apache或者Tomcat。
如果需要高性能和高并发,推荐使用Nginx。
如果需要提供负载均衡、反向代理等功能,推荐使用Nginx或者Apache。
如果你是Java开发者,并需要应用服务器,推荐使用Tomcat。
----------------第二部分--------------------
一.环境部署
后端两台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.实现
上传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中
配置过程
[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"
/>
[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;
}
}