ToB企服应用市场:ToB评测及商务社交产业平台

标题: WEB应用服务器 -- Tomcat详解及案例实现 [打印本页]

作者: 勿忘初心做自己    时间: 2024-9-16 05:53
标题: WEB应用服务器 -- Tomcat详解及案例实现
一、Web前端三大核心技术

1.1 HTML

HTML(HyperText Markup Language)超文本标记语言,它不同于一样平常的编程语言。超文本即超出纯文本的范畴,比方:描述文本颜色、大小、字体等信息,或利用图片、音频、视频等非文本内容。
HTML由一个个的标签(标记)组成,这些标签各司其职,有的提供网页信息,有的负责文字,有的负责图片,有的负责网页布局,以是一个HTML文件,是由格式标签和数据组成。
  1. <!DOCTYPE html>
  2. <html lang="en">
  3.         <head>
  4.                 <meta charset="UTF-8">
  5.                 <title>首页</title>
  6.         </head>
  7.         <body>
  8.                 <h1>嘻嘻哈哈</h1>
  9.         </body>
  10. </html>
复制代码
超文本需要表现,就得有软件能够出现超文本界说的排版格式,比方表现:图片、表格,表现字体的大小、颜色,这个软件就是浏览器。
超文本的诞生是为了解决纯文本不能格式表现的题目,是为了悦目,但是只有通过网络才能分享超文本的内容,以是订定了HTTP协议。
1.2 CSS(Cascading Style Sheets)层叠样式表

​ HTML本身为了格式化表现文本,但是当网页出现各人面前的时候,需求HTML提供更多样式能力。这使得HTML变得越来越臃肿。这促使了CSS的诞生。
​ **CSS(Cascading Style Sheets,层叠样式表)**是一种用于描述HTML或XML文档的表现情势的样式表语言。CSS告急用于控制网页的布局、样式和表面,使网页更加美观和用户友爱。
​ CSS 3接纳了模块化头脑,每个模块都在CSS 2底子上分别加强功能。以是,这些模块是连续发布的。
​ 不同厂家的浏览器利用的引擎,对CSS的支持不一样,导致网页布局、样式在不同浏览器不一样。因此,想要保证不同用户利用不同浏览器看到的网页效果一直非常困难。
CSS 的应用

1.3 JavaScript

JavaScript 是一种轻量级的、解释型或即时编译型的编程语言,广泛用于网页开发。它是一种高层次、动态、弱类型的语言,具有基于原型的面向对象编程能力。JavaScript 是 Web 技术的三大核心之一(另两项是 HTML 和 CSS),通常与 HTML 和 CSS 一起利用,为网页添加动态功能和互动效果。
JavaScript 的告急特点:
JavaScript 的告急用途:
同步
交互式网页,用户提交了哀求,就是想看到查询的结果。服务器响应到来后是一个全新的页面内容,哪怕URL不变,整个网页都需要重新渲染。比方,用户填写注册信息,只是2次暗码不一致,提交后,整个注册页面重新刷新,所有填写项目重新填写(当然有办法让用户减少重填)。这种交互非常不友爱。从代价的角度看,就是为了注册的一点点信息,结果返回了整个网页内容,不但浪费了网络带宽,还需要浏览器重新渲染网页,太浪费资源了,影响了用户体验和感受。上面这些哀求的过程,就是同步过程,用户发起哀求,页面整个刷新,直到服务器端响应的数据到来并重新渲染。
异步
1996年微软实现了iframe标签,可以在一个网页利用iframe标签局部异步加载内容。
1999年微软推出异步数据传输的ActiveX插件技术,太笨重了,但是也火了很多年。有一个组件XMLHttpRequest被大多数浏览器支持。
传统的网页假如需要更新内容,必需重载整个网页面。Ajax的出现,改变这统统,同时极大的促进了Javascript的发展。Ajax即"Asynchronous Javascript And XML"(异步 JavaScript 和 XML),是指一种创建交互式、快速动态网页应用的网页开发技术,最早起源于1998年微软的Outlook Web Access开发团队。Ajax 通过在背景与服务器进行少量数据交换, 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。Javascript 通过调用浏览器内置的WEB API中的XMLHttpRequest 对象实现Ajax 技术。早期Ajax联合数据格式XML,现在更多的利用JSON。利用AJAX可实现前后端开发的彻底分离,改变了传统的开发模式。
AJAX是一种技术的组合,技术的重新发现,而不是发明,但是它深远的影响了整个WEB开发。
二、WEB框架

2.1 web资源和访问


手机 App 访问
手机内置了HTML和JS文件,不需要从静态WEB服务器下载 JS 或 HTML。为的就是减少文件的发送,当代前端开发利用的JS文件太多或太大了有须要就从图片服务器哀求图片,从业务服务器哀求动态数据客户需求多样,更多的内容还是需要由业务服务器提供,业务服务器往往都是由一组服务器组成。
2.2 背景应用架构

经过衍生背景应用架构分为以下三种:

2.2.1 单体架构

单体架构(Monolithic Architecture)是一种传统的应用步伐架构模式,其中所有的功能模块都被打包成一个独立的可实行文件或部署单元。整个应用步伐作为一个团体运行,所有的业务逻辑、数据访问、用户接口、背景任务等都包罗在一个代码库和一个历程中。

Java实现:JSP、Servlet,打包成一个jar、war部署

web应用服务器:开源的tomcat、jetty、glassfish。商用的有weblogic、websphere、Jboss
2.2.2 SOA面向服务的架构

**SOA(Service-Oriented Architecture,面向服务的架构)**是一种通过服务的概念来组织和利用分布式资源的软件架构模式。SOA 的核心头脑是将应用步伐的功能单元设计为独立的服务,这些服务通过标准的协议进行通讯和协作。SOA 夸大服务的疏松耦合、可重用性和可组合性,使得系统在扩展和维护方面更加机动。


长处

缺点

2.2.3 微服务

微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底去掉耦合,每一个微服务提供单个业务功能,一个服务只做一件事。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等.
属于SOA(Service Oriented Architecture)的子集

从技术角度讲就是一种小而独立的处置惩罚过程,类似与历程的概念,能够自行单独启动或销毁微服务架构(分布式系统),各个模块/服务,各自独立出来,“让专业的人干专业的事”,独立部署。分布式系统中,不同的服务可以利用各自独立的数据库。
服务之间接纳轻量级的通讯机制(通常是基于HTTP的RESTful API)。
微服务设计的头脑改变了原有的企业研发团队组织架构。传统的研发组织架构是程度架构,前端、后端、DBA、测试分别有本身对应的团队,属于程度团队组织架构。而微服务的设计头脑对团队的划分有着一定的影响,使得团队组织架构的划分更倾向于垂直架构,比如用户业务是一个团队来负责,付出业务是一个团队来负责。但实际上在企业中并不会把团队组织架构拆分得这么绝对,垂直架构只是一种理想的架构。
微服务的实现框架有多种,不同的应用架构,部署方式也有不同
长处

缺点:

常见的微服务框架

三、Tomcat应用服务器


3.1 tomcat的功能介绍

Apache Tomcat(通常简称为 Tomcat)是一个由 Apache 软件基金会开发和维护的开源 Java 应用服务器。Tomcat 是用于运行 Java Servlets 和 JavaServer Pages (JSP) 的标准实现之一。它广泛用于开发和部署 Java Web 应用步伐,因为它轻量、易于利用且兼容主流的 Java EE(企业版)标准。
起始于SUN 公司的一个Servlet的参考实现项目 Java Web Server,开发者是 James Duncan Davidson,在1999年,将项目贡献给了apache软件基金会(ASF),和ASF现有的项目 JServ 合并,并开源成为顶级项目。
官网:
http://tomcat.apache.org/
官网文档:
https://tomcat.apache.org/tomcat-8.5-doc/index.html
资助文档:
https://cwiki.apache.org/confluence/display/tomcat/
https://cwiki.apache.org/confluence/display/tomcat/FAQ
Tomcat 仅仅实现了Java EE规范中与Servlet、JSP相关的类库,是JavaEE不完整实现。
1999年发布初始版本是Tomcat 3.0,实现了Servlet 2.2 和 JSP 1.1规范。
Tomcat 4.x发布时,内建了Catalina(Servlet容器)和 Jasper(JSP engine)等
当前 Tomcat 的正式版本已经更新到 10.0.x 版本,但当前企业中主流版本为 8.x 和 7.x
3.2 Tomcat的安装


主机名IP角色Nginx172.25.254.60Nginx服务器tomcat-node1172.25.254.11tomcat服务器toucat-node2172.25.254.22tomcat服务器   注意:以下所有案例的环境利用系统都为Rhel9.1
  
1.安装java环境
  1. [root@Tomcat-node1 ~]# yum install java-1.8.0-openjdk.x86_64 -y   # 下载java1.8版本
复制代码
2.安装并启动tomcat
  1. [root@Tomcat-node1 ~]# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.93/bin/apache-tomcat-9.0.93.tar.gz           # 从官方网站获取下载链接进行下载
  2. [root@Tomcat-node1 ~]# tar zxf apache-tomcat-9.0.91.tar.gz -C /usr/local/   # 解压文件到默认下载目录中
  3. [root@Tomcat-node1 ~]# ln -s /usr/local/apache-tomcat-9.0.93/ /usr/local/tomcat  # 设置软链接到解压文件中
  4. [root@Tomcat-node1 ~]# /usr/local/tomcat/bin/startup.sh     # 使用路径来启动tomcat
复制代码
3.查看端口
  1. [root@Tomcat-node1 ~]# netstat -antlupe | grep java
  2. tcp6       0      0 :::8080                 :::*                    LISTEN      1001       76090      41356/java   
复制代码
4.访问测试tomcat

   tomcat-node2的配置于tomcat-node1的配置一致
  3.3 tomcat的文件结构

  1. # 查看tomcat的目录
  2. [root@Tomcat-node1 ~]# ls /usr/local/tomcat/
  3. bin           conf             lib      logs    README.md      RUNNING.txt  webapps
  4. BUILDING.txt  CONTRIBUTING.md  LICENSE  NOTICE  RELEASE-NOTES  temp         work
复制代码
tomcat的目录结构
目录说明bin服务启动、制止等相关步伐和文件conf配置文件lib库目录logs日志目录webapps应用步伐,应用部署目录,相称于nginx的默认发布目录work jsp编译后的结果文件,建议提前预热访问 3.4 配置tomcat的启动文件

1.生成tomcat的主配置文件
  1. [root@Tomcat-node1 ~]# cat /usr/local/tomcat/conf/tomcat.conf
  2. JAVA_HOME=/etc/alternatives/jre_openjdk
复制代码
2.配置启动文件
  1. [root@Tomcat-node1 ~]# vim /lib/systemd/system/tomcat.service
  2. [Unit]
  3. Description=Tomcat
  4. #After=syslog.target network.target remote-fs.target nss-lookup.target
  5. After=syslog.target network.target
  6. [Service]
  7. Type=forking
  8. EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
  9. ExecStart=/usr/local/tomcat/bin/startup.sh
  10. ExecStop=/usr/local/tomcat/bin/shutdown.sh
  11. PrivateTmp=true
  12. User=tomcat
  13. Group=tomcat
  14. [Install]
  15. WantedBy=multi-user.target
复制代码
3.利用systemctl下令启动tomcat
  1. [root@Tomcat-node1 ~]# systemctl daemon-reload   # 重新加载参数配置
  2. [root@tomcat ~]# systemctl enable --now tomcat   # 开启tomcat
  3. [root@Tomcat-node1 ~]# systemctl status tomcat   # 查看tomcat的状况
复制代码
  以上在tomcat-node2中的配置一致
  四、Tomcat的反向代理部署

4.1 常见部署方式

4.1.1standalone模式


standalone模式,Tomcat单独运行,直接接受用户的哀求,不推荐。
4.1.2 单机反向代理


反向代理,单机运行,提供了一个Nginx作为反向代理,可以做到静态由nginx提供响应,动态jsp代理给Tomcat

4.1.3 反向代理多级


前置一台Nginx,给多台Tomcat实例做反向代理和负载均衡调理,Tomcat上部署的纯动态页面更得当

4.1.4 反向代理多级多机

多级代理

4.2 利用Nginx实现反向代理


利用nginx反向代理功能,实现图中的代理功能,将用户请叱责部转发至指定的同一个tomcat主机,利用nginx指令proxy_pass 可以向后端服务器转发哀求报文,并且在转发时会保存客户端的哀求报文中的host首部
4.2.1tomcat的反向代理

1.在tomcat端编写proxy_pass的jsp脚本,并将其放置tomcat的ROOT目录下,模拟仿真的Sessione会话界面
  1. [root@Tomcat-node1 ~]# cp test.jsp /usr/local/tomcat/webapps/ROOT/
复制代码
2.在Nginx端编写访问
  1. [root@nginx ~]# vim /usr/local/nginx/conf.d/tomcat.conf     # 在Nginx的子配置文件下编写新的子配置
  2. server {
  3.     listen 80;
  4.     server_name www.tomcat.org;   # 访问域名地址
  5.     root /data/web/html;
  6.     index index.html;
  7.         location ~ \.jsp$ {
  8.                 proxy_pass http://172.25.254.11:8080;    -- 编写访问IP及端口
  9.         }
  10. }
  11. [root@nginx ~]# nginx -s reload
复制代码
3.在windowns中做地点解析
C: /Windows/System32/drivers/etc/hosts
  1. 172.25.254.60 www.tomcat.org
复制代码
4.访问测试

4.3 实现Tomcat中的负载均衡

动态服务器的题目,往往就是并发能力太弱,往往需要多台动态服务器一起提供服务。如何把并发的压力分摊,这就需要调理,接纳一定的调理策略,将哀求分发给不同的服务器,这就是Load Balance负载均衡。
当单机Tomcat,演化出多机多级部署的时候,一个题目便凸显出来,这就是Session。而这个题目的由来,都是由于HTTP协议在设计之初没有想到未来的发展。
4.3.1HTTP的无状态,有毗连和短毗连


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

4.3.2.1 当地Hash的负载均衡

  1. [root@nginx ~]# vim /usr/local/nginx/conf.d/tomcat.conf
  2. upstream tomcat {
  3.         ip_hash;         # 添加本地哈希
  4.         server 172.25.254.11:8080;
  5.         server 172.25.254.22:8080;
  6. }
  7. server {
  8.     listen 80;
  9.     server_name www.tomcat.org;
  10.     root /data/web/html;
  11.     index index.html;
  12.         location ~ \.jsp$ {
  13.                 proxy_pass http://tomcat;
  14.         }
  15. }
  16. [root@nginx ~]# nginx -s reload
复制代码
访问测试:

   访问测试乐成后,可以看到,固然实现了负载均衡,但由于是当地哈希的方式,因此当利用另一个浏览器的进行访问的时候,依然会是访问到172.25.254.11的tomcat服务器上,因此需要再进一步优化
  4.3.2.2 cookie_JSESSIONID的负载均衡

  1. [root@nginx ~]# vim /usr/local/nginx/conf.d/tomcat.conf
  2. upstream tomcat {
  3.     hash $cookie_JSESSIONID;
  4.     server 172.25.254.11:8080;
  5.     server 172.25.254.22:8080;
  6. }
  7. server {
  8.     listen 80;
  9.     server_name www.tomcat.org;
  10.     root /data/web/html;
  11.     index index.html;
  12.     location ~ \.jsp$ {
  13.         proxy_pass http://tomcat;
  14.     }
  15. }
  16. [root@nginx ~]# nginx -s reload
复制代码
访问测试:

   利用cookie_JSESSIONID的负载均衡后,当浏览器1访问后,在浏览器2会自动毗连到tomcat2中
  但是,当模拟tomcat故障下线时,比方在tomcat1中提交了session会话,当重新提交时,tomcat服务器会自动毗连到tomcat2,但此时在tomcat1中的session会话会丢失
  1. # 模拟tomcat2出现故障
  2. [root@Tomcat-node1 ~]# systemctl stop tomcat
复制代码
测试:

因此可以通过Memcached来实现会话保持
五、Seesion的会话保持

5.1Memcached


Memcached 官网:http://memcached.org/
5.1.1 Memcached的安装与启动

  1. [root@Tomcat-node1 ~]# yum install memcached -y
  2. [root@Tomcat-node1 ~]#  vim /etc/sysconfig/memcached
  3. PORT="11211"
  4. USER="memcached"
  5. MAXCONN="1024"
  6. CACHESIZE="64"
  7. OPTIONS="-l 0.0.0.0,::1"
  8. [root@Tomcat-node1 ~]# systemctl enable --now memcached
  9. [root@Tomcat-node1 ~]# netstat -antlupe | grep memcache
  10. tcp    0   0 0.0.0.0:11211     0.0.0.0:*       LISTEN  975    122107     43014/memcached
  11. tcp6   0   0 ::1:11211         :::*            LISTEN  975    122108     43014/memcached
复制代码
  注意:该配置在tomcat服务器中进行编写,tomcat2的配置一致
  5.1.2 Memcached利用下令

五种根本 memcached 下令实行最简单的利用。这些下令和利用包括:
下令作用set将数据存储在缓存中,假如指定的键已经存在,set 会覆盖现有的数据。add仅在指定的键不存在时,将数据存储在缓存中。假如键已经存在,则利用失败。replace仅在指定的键已经存在时,替换该键下的数据。假如键不存在,则利用失败。get从缓存中检索指定键的数据。delete从缓存中删除指定的键及其数据。
  1. #前三个命令是用于操作存储在 memcached 中的键值对的标准修改命令,都使用如下所示的语法:
  2. command <key> <flags> <expiration time> <bytes>
  3. <value>
  4. #参数说明如下:
  5. command set/add/replace
  6. key key                         # 用于查找缓存值
  7. flags                                 # 可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
  8. expiration time         # 在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
  9. bytes                                 # 在缓存中存储的字节数
  10. value                                 # 存储的值(始终位于第二行)
  11. #增加key,过期时间为秒,bytes为存储数据的字节数
  12. add key flags exptime bytes
复制代码
示例:
  1. [root@tomcat ~]# telnet localhost 11211
  2. Trying ::1...
  3. Connected to localhost.
  4. Escape character is '^]'.
  5. #增加
  6. add leekey 0 60 4 #0 是否压缩 60 过期时间 4 字长
  7. test
  8. STORED
  9. add leekey1 0 60 3
  10. lee
  11. STORED
  12. #查看
  13. get leekey
  14. VALUE leekey 0 4
  15. test
  16. get leekey1
  17. VALUE leekey1 0 3
  18. lee
  19. #改
  20. set leekey 0 60 5
  21. test1
  22. STORED
  23. get leekey
  24. VALUE leekey 0 5
  25. test1
  26. END
  27. add leekey1 0 60 4
  28. test
  29. #删除
  30. delete leekey
  31. DELETED
  32. get leekey
  33. END
  34. get leekey1
  35. VALUE leekey1 0 3
  36. lee
  37. #清空
  38. flush_all
  39. OK
  40. get leekey1
  41. END
复制代码
测试:
   利用Memcached实现会话保持后,还需要利用MSM共享服务实现新用户发哀求到Tomcat1时, Tomcat1生成session返回给用户的同时,也会同时发给memcached2备份。
  5.2 session共享服务器

5.2.1 msm的简介


msm(memcached session manager)提供将Tomcat的session保持到memcached可以实现高可用。
github网站链接: https://github.com/magro/memcached-session-manager
支持Tomcat的 6.x、7.x、8.x、9.x

5.2.2 msm的安装

下载相关jar包
下载相关jar包,参考下面官方说明的下载链接
https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration
将spymemcached.jar、memcached-session-manage、kyro相关的jar文件都放到Tomcat的lib目录中,这个目录是 $CATALINA_HOME/lib/ ,对应本次安装就是/usr/local/tomcat/lib。
  1. kryo-3.0.3.jar
  2. asm-5.2.jar
  3. objenesis-2.6.jar
  4. reflectasm-1.11.9.jar
  5. minlog-1.3.1.jar
  6. kryo-serializers-0.45.jar
  7. msm-kryo-serializer-2.3.2.jar
  8. memcached-session-manager-tc9-2.3.2.jar
  9. spymemcached-2.12.3.jar
  10. memcached-session-manager-2.3.2.jar
复制代码
5.3 Seesion会话保持的实现

t1和m1部署可以在一台主机上,t2和m2部署也可以在同一台。当新用户发哀求到Tomcat1时, Tomcat1生成session返回给用户的同时,也会同时发给memcached2备份。即Tomcat1 session为主session,memcached2 session为备用session,利用memcached相称于备份了一份Session假如Tomcat1发现memcached2 失败,无法备份Session到memcached2,则将Sessoin备份存放在memcached1中
  1. # 以上在tomcat中安装好memcached后
  2. # 配置msm,修改tomcat配置
  3. [root@Tomcat-node1 ~]# vim /usr/local/tomcat/conf/context.xml
  4. <Context>
  5.     . . . . . .
  6.     <Manager pathname="" />
  7.     -->
  8.     <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
  9.         memcachedNodes="m1:172.25.254.11:11211,m2:172.25.254.22:11211"
  10.         failoverNodes="m1"
  11.         requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
  12.                 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
  13.     />
  14. </Context>
  15. [root@Tomcat-node1 ~]# systemctl restart memcached
复制代码
  在tomcat2中的配置一致
  测试:
  1. # 连接上tomcat2后,提交会话数据后,模拟当前tomcat服务器出现故障
  2. [root@Tomcat-node2 ~]# systemctl stop tomcat
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4