企业级web应用服务器tomcat

一、WEB技术

1.1HTTP协议和B/S 结构

我们的操作系统之所以可以让程序并行的执行,源于操作系统有进程子系统,每个进程可以有多个线程,每个线程可以被CPU调度执行

客户端和服务端分属于不同的进程,跨主机的进程之间需要通信就得需要使用网络编程,最常见的网络编程接口是Socket。

Socket称为套接字,网络通信需要服务和客户两端,被动接受另一端请求并提供数据和计算的称为服务端,另一端成为客户端,这种Client/Server编程模式简称为C/S编程,往往使用传输层协议(tcp/udp)

网页是存储在WEB服务器端的文本文件,浏览器发起HTTP请求后,到达WEB服务器程序后,服务程序根据URL读取对应的HTML文件,并封装成HTPP响应报文给浏览器端。

起初网页主要指的是HTML、CSS等文件制作属于静态网页,后来因需求出现了CGI通用网关接口将用户请求使用程序动态生成的技术,称为动态网页技术。先后出现了ASP、PHP、JSP等技术。

1.2 前端三大核心技术

1.2.1 HTML

超文本标记语言,不同于一般的编程语言,由一个个的标签组成,各个标签各司其职,提供网页信息、负责文字、负责图片、负责网页布局使用各不同的标签。

超文本需要显示就得有软件能够呈现超文本定义的排版格式,例如显示:图片、表格,显示字体的大小、颜色,这个软件就是浏览器。

1.2.2 CSS(Cascading Style Sheets)层叠样式表

采用了模块化思想,每个模块都在CSS 2基础上分别增强功能。不同厂家的浏览器使用的引擎,对CSS的支持不一样,导致网页布局、样式在不同浏览器不一样。因此, 想要保证不同用户使用不同浏览器看到的网页效果一直非常困难。

1.2.3 JavaScript

简称JS,是一种动态的弱类型脚本解释性语言,和HTML、CSS并称三大WEB核心技术,2008年后随着chrome浏览器的V8引擎发布。 V8 JS引擎不是解释执行,而是本地编译,在V8引擎做了很多优化,JS程序在其上运行堪比本地二进制程 序。V8引擎使用C++开发,可以嵌入到任何C++程序中。基于V8引擎,2009年基于服务器javascript的运 行环境Node.js诞生,创建了第一版npm (Node.js包管理器和开源库生态系统), 提供了大量的库供程序员 使用。从此,便可以在服务器端真正大规模使用JavaScript编程了。也就是说 JavaScript 也可以真正称为 服务器端编程语言了,成为目前唯一的前,后端通用的语言。

同步

交互式网页,用户提交了请求,整个网页都需要重新渲染

异步

可以在不重新加载整个网页的情况下,对网页的某部分进行更新。Javascript 通过调用浏览器内置的WEB API中的 XMLHttpRequest 对象实现Ajax 技术。早期Ajax结合数据格式XML,目前更多的使用JSON。利用AJAX可 实现前后端开发的彻底分离,改变了传统的开发模式。

二 、WEB框架

2.1 web资源和访问

PC端或移动端浏览器访问

从静态服务器请求HTML、CSS、JS等文件发送到浏览器端,浏览器端接收后渲染在浏览器上从图片服务 器请求图片资源显示

从业务服务器访问动态内容,动态内容是请求后有后台服务访问数据库后得到的,最终返回到浏览器端

手机 App 访问

内置了HTML和JS文件,不需要从静态WEB服务器下载JS或者HTML,为的就是减少文件的发送。

2.2 后台应用架构

2.2.1 单体架构

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

all in one的架构方式,把所有的功能单元放在一个应用里。然后把整个应用部署到一台服务器上。 如果负载能力不行,将整个应用进行水平复制,进行扩展,然后通过负载均衡实现访问。

易于开发和测试:也十分方便部署;当需要扩展时,只需要将war复制多份,然后放到多个服务器上, 再做个负载均衡就可以了

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

特别是对于一个大型应用,我们不可能吧所有内容都放在一个应用里面,我们如何维护、如何分工 合作都是问题。如果项目庞大,管理难度大

web应用服务器:开源的tomcat、jetty、glassfish。商用的有weblogic、websphere、Jboss

2.2.2 微服务

属于SOA(Service Oriented Architecture)的子集

核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底去掉耦合,每一 个微服务提供单个业务功能

技术角度讲就是一种小而独立的处理过程,类似与进程的概念,能够自行单独启动或销毁

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

服务之间采用轻量级的通信机制(通常是基于HTTP的RESTful API)

微服务设计的思想改变了原有的企业研发团队组织架构,使得团队组织架构的划分更倾向于垂直架构。

微服务的实现框架有多种,不同的应用架构,部署方式也有不同

2.2.3 单体架构和微服务比较

微服务的优点

每个服务足够内聚,足够小,代码容易理解

开发简单、开发效率提高

微服务是松耦合的

微服务能使用不同的语言开发

易于和第三方集成

微服务允许你利用融合最新技术

每个微服务都有自己的存储能力

微服务缺点

增加了开发、测试、运维、监控等的复杂度

引入了分布式事务和异步补偿机制,为设计和开 发带来一定挑战

开发人员和运维需要更强的技术能力处理分布式系统的复杂性

不适用于小型应用会增加其成本

常见的微服务框架

Dubbo:一款高性能的Java RPC服务框架,微服务生态体系中的一个重要组件,将单体程序分解成多个功能服务模块,模块间使用Dubbo框架提供的高性能RPC通信,内部协调使用Zookeeper,实现服务注册、服务发现和服务治理

Spring cloud:一个完整的微服务解决方案,相当于Dubbo的超集,微服务框架,将单体应用拆分为粒度更小的单一功能服务,基于HTTP协议的REST(Representational State Transfer 表述性状态转移)风格实现模块间通信

三 、tomcat的功能介绍

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和 并发访问用户不是很多的场合下被普遍使用,Tomcat 具有处理HTML页面的功能,它还是一个Servlet和 JSP容器

3.1 安装 Tomcat

node1上

首先是安装java环境

[root@node1 ~]# dnf install java-1.8.0-openjdk.x86_64 -y

[root@node1 ~]# tar zxf apache-tomcat-9.0.93.tar.gz -C /usr/local/

[root@node1 ~]# cd /usr/local/

创建一个软连接方便执行后续操作

[root@node1 local]# ln -s apache-tomcat-9.0.93 tomcat

[root@node1 local]# cd tomcat/

[root@node1 tomcat]# ls

bin conf lib logs README.md RUNNING.txt webapps

BUILDING.txt CONTRIBUTING.md LICENSE NOTICE RELEASE-NOTES temp work

[root@node1 tomcat]# cd bin/

[root@node1 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

执行java的启动脚本

[root@node1 bin]# ./startup.sh

再查看一下端口号

[root@node1 bin]# netstat -antlupe | grep java

tcp6 0 0 :::8080 :::* LISTEN 0 119613 20217/java

tcp6 0 0 127.0.0.1:8005 :::* LISTEN 0 119631 20217/java

浏览器访问172.25.254.10:80

3.2 tomcat的文件结构和组成

bin 服务启动、停止等相关程序和文件

conf 配置文件

lib 库目录

logs 日志目录

webapps 应用程序,应用部署目录,相当于nginx的默认发布目录

work jsp 编译后的结果文件,建议提前预热访问

3.3 生成tomcat的启动文件

生成配置文件

[root@node1 conf]# vim /usr/local/tomcat/conf/tomcat.conf

JAVA_HOME=/etc/alternatives/jre_openjdk

生启动文件

[root@node1 conf]# vim /lib/systemd/system/tomcat.service

[Unit]

Description=Tomcat

#After=syslog.target network.target remote-fs.target nss-lookup.target

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

创建用户和设置权限

[root@node1 conf]# useradd -s /sbin/nologin -M tomcat

[root@node1 conf]# cd

[root@node1 ~]# ls /usr/local/tomcat/ -ld

drwxr-xr-x 9 root root 220 Aug 21 11:47 /usr/local/tomcat/

[root@node1 ~]# chown -R tomcat.tomcat /usr/local/tomcat/

启动服务

[root@node1 ~]# systemctl daemon-reload

[root@node1 ~]# systemctl enable --now tomcat

Created symlink /etc/systemd/system/multi-user.target.wants/tomcat.service → /usr/lib/systemd/system/tomcat.service.

查看一下进程

[root@node1 ~]# ps aux | grep tomcat

root 30380 1.2 5.9 2560400 106864 pts/0 Sl 12:23 0:02 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start

root 31493 0.0 0.1 221664 2244 pts/0 S+ 12:26 0:00 grep --color=auto tomcat

再通过浏览器访问一下

将tomcat和启动文件同步到node2上

[root@node1 ~]# rsync -ar /usr/local/apache-tomcat-9.0.93 root@172.25.254.20://usr/local

[root@node1 ~]# rsync -ar /lib/systemd/system/tomcat.service root@172.25.254.20:/lib/systemd/system/tomcat.service

node2上

创建tomcat用户并设置权限

[root@node2 ~]# useradd -s /sbin/nologin -M tomcat

[root@node2 ~]# chown -R tomcat.tomcat /usr/local/tomcat/

[root@node2 ~]# cd /usr/local/

创建软连接

[root@node2 local]# ln -s apache-tomcat-9.0.93 tomcat

[root@node2 ~]# systemctl daemon-reload

[root@node2 ~]# systemctl enable --now tomcat

[root@node2 ~]# netstat -aultupe | grep java

[root@node2 ~]# netstat -aultupe | grep tomcat

[root@node2 ~]# ps aux | grep tomcat

再通过浏览器访问一下20主机

四、实现tomcat中的负载均衡

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

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

[root@nginx ~]# cd /usr/local/nginx/conf.d/

[root@nginx conf.d]# vim tomcat.conf

upstream tomcat {

hash $cookie_JSESSIONID;

server 172.25.254.10:8080;

server 172.25.254.20:8080;

}

server {

listen *:80;

server_name www.jcl.org;

root /data/web/html;

index index.html;

location ~ \.jsp$ {

proxy_pass http://tomcat;

}

}

[root@nginx conf.d]# nginx -s reload

在不同浏览器上访问测试www.jcl.org/test.jsp

五 、Memcached

5.1 Memcached简介

可以通过做集群同步的方式, 让各memcached服务器的数据进行同步,从而实现数据的一致性,即保证各memcached的数据是一样 的,即使有任何一台 memcached 发生故障,只要集群中有一台 memcached 可用就不会出现数据丢 失,当其他memcached 重新加入到集群的时候,可以自动从有数据的memcached 当中自动获取数据并 提供服务。

5.2 memcached的安装与启动

[root@node1 ~]# dnf install memcached -y

[root@node1 ~]# vim /etc/sysconfig/memcached

PORT="11211"

USER="memcached"

MAXCONN="1024"

CACHESIZE="64"

OPTIONS="-l 0.0.0.0,::1"

[root@node1 ~]# scp /etc/sysconfig/memcached root@172.25.254.20:/etc/sysconfig/memcached

[root@node1 ~]# systemctl start memcached.service

六、session 共享服务器

6.1 msm 介绍

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

Tomcat的Session管理类,Tomcat版本不同

memcached-session-manager-2.3.2.jar

memcached-session-manager-tc9-2.3.2.jar

Session数据的序列化、反序列化类

官方推荐kyro

在webapp中WEB-INF/lib/下

驱动类

memcached(spymemcached.jar)

Redis(jedis.jar)

6.2配置过程

[root@node1 jar]# ls
asm-5.2.jar minlog-1.3.1.jar
kryo-3.0.3.jar msm-kryo-serializer-2.3.2.jar
kryo-serializers-0.45.jar objenesis-2.6.jar
memcached-session-manager-2.3.2.jar reflectasm-1.11.9.jar
memcached-session-manager-tc9-2.3.2.jar spymemcached-2.12.3.jar

[root@node1 jar]# cp * /usr/local/tomcat/lib/

[root@node1 jar]# scp * root@172.25.254.20:/usr/local/tomcat/lib/

[root@node1 jar]# vim /usr/local/tomcat/conf/context.xml

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"

failoverNodes="n1"

requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>

[root@node1 jar]# scp /usr/local/tomcat/conf/context.xml root@172.25.254.20:/usr/local/tomcat/conf/context.xml

[root@node2 ~]# vim /usr/local/tomcat/conf/context.xml

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"

failoverNodes="n2"

requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>

[root@node1 jar]# systemctl restart tomcat

[root@node2 ~]# systemctl restart tomcat

访问测试www.jcl.org/test.jsp

添加两条内容

停掉20主机的tomcat

[root@node2 ~]# systemctl stop tomcat

再访问测试www.jcl.org/test.jsp

添加第三条内容的时候可以看到之前的两条信息还在,因为20主机挂掉了,所以通过memcache自动跳转到10主机上

相关推荐
光芒再现dev13 分钟前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理
为将者,自当识天晓地。16 分钟前
c++多线程
java·开发语言
小政爱学习!18 分钟前
封装axios、环境变量、api解耦、解决跨域、全局组件注入
开发语言·前端·javascript
魏大帅。23 分钟前
Axios 的 responseType 属性详解及 Blob 与 ArrayBuffer 解析
前端·javascript·ajax
daqinzl24 分钟前
java获取机器ip、mac
java·mac·ip
AndyFrank27 分钟前
mac crontab 不能使用问题简记
linux·运维·macos
花花鱼29 分钟前
vue3 基于element-plus进行的一个可拖动改变导航与内容区域大小的简单方法
前端·javascript·elementui
k093333 分钟前
sourceTree回滚版本到某次提交
开发语言·前端·javascript
激流丶40 分钟前
【Kafka 实战】如何解决Kafka Topic数量过多带来的性能问题?
java·大数据·kafka·topic
Themberfue43 分钟前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·