企业级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](http://www.jcl.org "www.jcl.org"); root /data/web/html; index index.html; location \~ \\.jsp$ { proxy_pass [http://tomcat](http://tomcat "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

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 \ \[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 \ \[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主机上

相关推荐
雨中飘荡的记忆1 分钟前
Java + Groovy计费引擎详解
java·groovy
嘟嘟w1 分钟前
JVM(Java 虚拟机):核心原理、内存模型与调优实践
java·开发语言·jvm
合作小小程序员小小店2 分钟前
web开发,在线%药店管理%系统,基于Idea,html,css,jQuery,java,ssm,mysql。
java·前端·mysql·jdk·html·intellij-idea
ZHE|张恒3 分钟前
设计模式(八)组合模式 — 以树结构统一管理对象层级
java·设计模式·组合模式
ClassOps3 分钟前
Chrome 插件记录
前端·chrome
TDengine (老段)5 分钟前
TDengine 转换函数 CAST 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ9 分钟前
java实现校验sql中,表字段在表里是否都存在,不存在的给删除掉
java·sql
编程火箭车17 分钟前
【Java SE 基础学习打卡】15 分隔符、标识符与关键字
java·java入门·标识符·关键字·编程基础·分隔符·语法规则
灰色人生qwer17 分钟前
idea teminal和 window cmd 输出java version不一致
java·ide·intellij-idea
笙年23 分钟前
Vue 作用域插槽
前端·javascript·vue.js