一、前置知识:Web 技术演进
  1. C/S vs B/S
    – C/S:Socket 编程,QQ、迅雷等,通信层 TCP/UDP,协议私有。
    – B/S:浏览器 + HTTP,文本协议跨网络。

  2. 动态网页诞生
    早期静态 HTML → 1990 年 HTTP + 浏览器 → 1995 年 JavaScript → CGI → ASP/PHP/JSP,逻辑搬到服务器,Browser/Server 模式形成。


二、前端三剑客:HTML / CSS / JavaScript
  1. HTML:超文本标记语言,标签 + 数据。

  2. CSS:层叠样式表,解决 HTML 臃肿,1996 CSS1、1998 CSS2、CSS3 模块化。

  3. JavaScript:
    – 1995 LiveScript → JavaScript;1997 ECMAScript 标准。
    – 2008 Chrome V8 引擎本地编译,2009 Node.js 诞生 → JS 可以写后端。
    – Ajax(1999):XMLHttpRequest + JS 实现局部刷新,前后端彻底分离。


三、Web 框架与访问模式
  1. 资源划分
    PC/手机浏览器:
    – 静态文件 → 静态服务器
    – 图片 → 图片服务器
    – 动态内容 → 业务服务器(Tomcat 等)

    手机 App:
    – 静态资源内置包,必要时才访问图片/业务服务器。

  2. 典型调用链
    浏览器 → Nginx(80) → (静态)
    → (动态)Tomcat(8080) → DB


四、后台架构演进
  1. 单体架构
    – 所有功能打包成一个 war;横向扩展复制多份 + 负载均衡。
    – 缺点:一处修改全站重启,耦合高。

  2. 微服务
    – 把单体按业务拆成独立服务;独立数据库;HTTP/REST 通信。
    – 优点:小团队、独立部署、技术异构。
    – 缺点:分布式事务、运维复杂度、监控链路。
    – 框架:Dubbo(RPC + ZooKeeper)、Spring Cloud(HTTP REST + Eureka)。


五、Tomcat 全景速览
• 1999 年起源于 Sun JWS → 贡献 Apache → 合并 JServ → 顶级项目。
• 仅实现 Servlet/JSP 规范,不完整 JavaEE。
• 重要版本:3.0(Servlet2.2/JSP1.1) → 4.x(Catalina/Jasper) → 9.x。
• 官方:http://tomcat.apache.org

六、Tomcat 安装

  1. 安装 JDK
    [root]# yum install java-1.8.0-openjdk.x86_64 -y

  2. 解压并做软链
    [root]# tar zxf apache-tomcat-9.0.91.tar.gz -C /usr/local/
    [root]# ln -s /usr/local/apache-tomcat-9.0.91 /usr/local/tomcat

  3. 启动
    [root]# /usr/local/tomcat/bin/startup.sh

  4. 验证端口
    [root]# netstat -antlupe | grep java
    tcp6 0 0 :::8080 :::* LISTEN 32887/java

  5. 浏览器访问
    http://服务器IP:8080 → 出现 Tomcat 欢迎页。


七、目录结构逐目录说明

bin 启动/关闭脚本 (startup.sh shutdown.sh catalina.sh)
conf 配置文件 (server.xml context.xml web.xml tomcat-users.xml)
lib Tomcat 自身以及全局 jar
logs catalina.out、localhost.log、access_log 等
webapps 应用部署目录,/webapps/ROOT 默认首页
work JSP 编译后生成的 servlet 类文件
temp 运行期临时目录

八、systemd 启动脚本制作

  1. 新建环境变量文件
    cat > /usr/local/tomcat/conf/tomcat.conf <<EOF
    JAVA_HOME=/etc/alternatives/jre_openjdk
    EOF

  2. 新建 systemd unit
    cat > /lib/systemd/system/tomcat.service <<'EOF'
    [Unit]
    Description=Tomcat
    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
    EOF

  3. 加载并开机自启
    systemctl daemon-reload
    systemctl enable --now tomcat


九、结合反向代理部署(Nginx)

  1. 单机反向代理
    location ~ .jsp$ {
    proxy_pass http://127.0.0.1:8080;
    }

  2. 静态 + 动态分离
    server {
    root /webdata/nginx/html;
    location / { try_files uriuri/ =404; }
    location ~ .jsp$ { proxy_pass http://tomcat; }
    }


十、负载均衡与会话漂移

  1. HTTP 特点
    – 无状态:服务器默认记不住两次请求。
    – 有连接:基于 TCP,三次握手。
    – 短连接:HTTP/1.0 一次请求一次连接;HTTP/1.1 keep-alive 复用。

  2. 负载均衡配置(Nginx)
    upstream tomcat {
    ip_hash; # 或 hash $cookie_JSESSIONID;
    server 192.168.65.131:8080;
    server 192.168.65.132:8080;
    }

  3. 问题
    ip_hash 会导致:
    – 客户端出口 IP 变化 → 漂移;
    – 单节点故障 → 会话丢失。
    因此需要集中式 Session 存储。


十一、Memcached 缓存系统
  1. 特点
    内存 Key-Value,最大 1 MB/对象;
    – 支持多语言客户端;
    – 基于 libevent,高并发;
    – 无持久化,可通过集群同步实现高可用。

  2. 安装与启动
    yum install memcached -y
    vim /etc/sysconfig/memcached
    PORT="11211"
    USER="memcached"
    MAXCONN="1024"
    CACHESIZE="64"
    OPTIONS="-l 0.0.0.0,::1"
    systemctl enable --now memcached

  3. 常用命令示例(telnet localhost 11211)
    add leekey 0 60 4
    test
    get leekey
    set leekey 0 60 5
    test1
    delete leekey
    flush_all


十二、msm(memcached-session-manager)实现 Session 共享

    1. 原理
      – Tomcat 把 Session 序列化后写入 Memcached;
      – 多个 Tomcat 共用同一份 Session,故障无丢失;
      – 支持 Tomcat 6/7/8/9,官方推荐 Kryo 序列化。

    2. 所需 jar(全部放到 $CATALINA_HOME/lib)
      kryo-3.0.3.jar
      asm-5.2.jar
      objenesis-2.6.jar
      reflectasm-1.11.9.jar
      minlog-1.3.1.jar
      kryo-serializers-0.45.jar
      msm-kryo-serializer-2.3.2.jar
      memcached-session-manager-tc9-2.3.2.jar
      spymemcached-2.12.3.jar
      memcached-session-manager-2.3.2.jar

    3. context.xml 修改
      Tomcat-1:
      <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" />

      Tomcat-2:
      failoverNodes="n2" 其余同上。

    4. Nginx 调度器
      upstream tomcat {
      hash $cookie_JSESSIONID;
      server 172.25.254.10:8080;
      server 172.25.254.20:8080;
      }

    5. 验证步骤
      a) 两台 Tomcat + 两台 Memcached 全启动,浏览器登录。
      b) 关闭其中一台 Tomcat 或 Memcached,刷新页面 → 会话保持。

    模拟132tomcat故障

    正常情况下
    • 192.168.65.131 上的 Tomcat-A 把 Session 主本 写在对端 192.168.65.132 的 Memcached-n2;
    • 192.168.65.132 上的 Tomcat-B 把 Session 主本 写在 131 的 Memcached-n1。
    两台 Memcached 各自只保存「对方 Tomcat 的主 Session」,本地 Memcached 并没有这份数据。

    关闭 132 的 Tomcat-B(不是 Memcached)
    • 浏览器下次请求被 Nginx 调度到 仍在运行的 131 Tomcat-A;
    • 131 Tomcat-A 发现本地 Memcached-n1 没有 该 Session,于是根据 msm 机制,从 132 Memcached-n2 读取到原来的主本 Session;
    • 131 把这份 Session 重新写回本地 Memcached-n1 作为新的备份,并继续提供服务。

    结论(正确表述)
    “关闭 192.168.65.132 的 Tomcat 后,192.168.65.131 的 Tomcat 从 192.168.65.132 的 Memcached 成功拉回原 Session,并在本地 Memcached 重新备份,验证会话未丢失。”

    如果模拟132memcached故障

    1. 正常时
      192.168.65.131 这台 Tomcat 把 Session 主本保存在 192.168.65.132 的 Memcached(n2)中;
      131 本地的 Memcached(n1)并不存放该 Session。

    2. 关闭 132 的 Memcached 后
      131 的 Tomcat 检测到 n2 不可写,立即把同一 Session 改写到本机 n1;
      因此后续请求由 131 处理时,能够从本地 n1 读取到刚才新写入的备份 Session,验证数据未丢失。.

    结论:
    关闭 132 的 Memcached 后,131 的 Tomcat 将 Session 实时转存到本地 Memcached,随后从本地节点成功读取,验证无数据丢失。

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
    如若转载,请注明出处:http://www.pswp.cn/web/92707.shtml
    繁体地址,请注明出处:http://hk.pswp.cn/web/92707.shtml
    英文地址,请注明出处:http://en.pswp.cn/web/92707.shtml

    如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    上海一家机器人IPO核心零部件依赖外购, 募投计划频繁修改引疑

    作者&#xff1a;Eric来源&#xff1a;IPO魔女8月8日&#xff0c;节卡机器人股份有限公司&#xff08;简称“节卡股份”&#xff09;将接受上交所科创板IPO上会审核。公司保荐机构为国泰海通证券股份有限公司&#xff0c;拟募集资金为6.76亿元。报告期内&#xff0c;节卡股份营…

    Linux810 shell 条件判断 文件工具 ifelse

    变量 条件判断 -ne 不等 $(id -u) -eq [codesamba ~]$ [ $(id -u) -ne 0 ] && echo "the user is not admin" the user is not admin [codesamba ~]$ [ $(id -u) -eq 0] && echo "yes admin" || echo "no not " -bash: [: 缺少 …

    ChatGPT 5的编程能力宣传言过其实

    2025年的8月7日&#xff0c;OpenAI 正式向全球揭开了GPT-5的神秘面纱&#xff0c;瞬间在 AI 领域乃至整个科技圈引发了轩然大波。OpenAI对GPT-5的宣传可谓不遗余力&#xff0c;将其描绘成一款具有颠覆性变革的 AI 产品&#xff0c;尤其在编程能力方面&#xff0c;给出了诸多令人…

    从MySQL到大数据平台:基于Spark的离线分析实战指南

    引言在当今数据驱动的商业环境中&#xff0c;企业业务数据通常存储在MySQL等关系型数据库中&#xff0c;但当数据量增长到千万级甚至更高时&#xff0c;直接在MySQL中进行复杂分析会导致性能瓶颈。本文将详细介绍如何将MySQL业务数据迁移到大数据平台&#xff0c;并通过Spark等…

    Mysql笔记-存储过程与存储函数

    1. 存储过程(Stored Procedure) 1.1 概述 1.1.1 定义&#xff1a; 存储过程是一组预编译的 SQL 语句和控制流语句&#xff08;如条件判断、循环&#xff09;的集合&#xff0c;​无返回值​&#xff08;但可通过 OUT/INOUT 参数或结果集返回数据&#xff09;。它支持参数传递、…

    [论文阅读] 人工智能 + 软件工程 | LLM协作新突破:用多智能体强化学习实现高效协同——解析MAGRPO算法

    LLM协作新突破&#xff1a;用多智能体强化学习实现高效协同——解析MAGRPO算法 论文&#xff1a;LLM Collaboration With Multi-Agent Reinforcement LearningarXiv:2508.04652 (cross-list from cs.AI) LLM Collaboration With Multi-Agent Reinforcement Learning Shuo Liu, …

    使用OAK相机实现智能物料检测与ABB机械臂抓取

    大家好&#xff01;今天我们很高兴能与大家分享来自OAK的国外用户——Vention 的这段精彩视频&#xff0c;展示了他们的AI操作系统在现实中的应用——在演示中&#xff0c;进行实时的自动物料拣选。 OAK相机实时自动AI物料拣选视频中明显可以看到我们的OAK-D Pro PoE 3D边缘AI相…

    html5和vue区别

    HTML5 是网页开发的核心标准&#xff0c;而 Vue 是构建用户界面的JavaScript框架&#xff0c;两者在功能定位和开发模式上有显著差异&#xff1a; 核心定位 HTML5是 HTML标准 的第五次重大更新&#xff08;2014年发布&#xff09;&#xff0c;主要提供网页结构定义、多媒体嵌入…

    【前端八股文面试题】【JavaScript篇3】DOM常⻅的操作有哪些?

    文章目录&#x1f9ed; 一、查询/获取元素 (Selecting Elements)✏️ 二、修改元素内容与属性 (Modifying Content & Attributes)&#x1f9ec; 三、创建与插入元素 (Creating & Inserting Elements)&#x1f5d1;️ 四、删除与替换元素 (Removing & Replacing)&am…

    内存杀手机器:TensorFlow Lite + Spring Boot移动端模型服务深度优化方案

    内存杀手机器&#xff1a;TensorFlow Lite Spring Boot移动端模型服务深度优化方案一、系统架构设计1.1 端云协同架构1.2 组件职责矩阵二、TensorFlow Lite深度优化2.1 模型量化策略2.2 模型裁剪技术2.3 模型分片加载三、Spring Boot内存优化3.1 零拷贝内存管理3.2 堆外内存模…

    安全生产基础知识(一)

    本文档围绕安全生产基础知识展开&#xff1a; 一、安全用电相关知识 用电安全要点 禁止用湿手触摸灯头、开关、插头插座及用电器具。发现有人触电&#xff0c;切勿用手拉扯&#xff0c;应立即拉开电源开关或用干燥木棍、竹竿挑开电线。电器通电后出现冒烟、烧焦味或着火时&…

    Elasticsearch 搜索模板(Search Templates)把“可配置查询”装进 Mustache

    1. 什么是 Search Template&#xff1f;能解决什么问题&#xff1f; 搜索模板是存储在 ES 集群里的 Mustache 模板&#xff08;lang: mustache&#xff09;。你把一份标准 _search 请求体写成模板&#xff0c;变量交给 params&#xff0c;每次调用只需传参即可&#xff1a; 搜索…

    cocos Uncaught TypeError: Cannot read properties of null (reading ‘SetActive‘)

    报错&#xff1a;Uncaught TypeError: Cannot read properties of null (reading SetActive) at b2RigidBody2D.setActive (rigid-body.ts:231:21) at b2RigidBody2D.onEnable (rigid-body.ts:78:14) at RigidBody2D.onEnable (rigid-body-2d.ts:551:24) at OneOffInvoker.invo…

    Docker用户组介绍以及管理策略

    在Docker环境中&#xff0c;用户组&#xff08;尤其是默认的docker组&#xff09;是管理用户与Docker守护进程交互权限的核心机制。以下从概念介绍和具体管理操作两方面详细说明&#xff1a;一、Docker用户组的核心概念 Docker守护进程&#xff08;dockerd&#xff09;默认通过…

    【PyTorch】单目标检测项目部署

    【PyTorch】单目标检测项目 两种部署情况&#xff1a;部署在 PyTorch 数据集上&#xff0c;以及部署在本地存储的单个映像上。 目录 定义数据集 搭建模型 部署模型 定义数据集 详细参照前文【PyTorch】单目标检测项目 import torchvision import os import pandas as pd i…

    Baumer高防护相机如何通过YoloV8深度学习模型实现火星陨石坑的检测识别(C#代码UI界面版)

    《------往期经典推荐------》 AI应用软件开发实战专栏【链接】 序号 项目名称 项目名称 1 1.工业相机 + YOLOv8 实现人物检测识别:(C#代码,UI界面版) 2.工业相机 + YOLOv8 实现PCB的缺陷检测:(C#代码,UI界面版) 2 3.工业相机 + YOLOv8 实现动物分类识别:(C#代码,U…

    UniApp Vue3 TypeScript项目中使用xgplayer播放m3u8视频的显示问题

    问题背景 在UniApp Vue3 TypeScript项目中使用xgplayer播放m3u8视频时&#xff0c;遇到了一个棘手的问题&#xff1a;视频画面下移&#xff0c;只能听到声音&#xff0c;全屏后才能正常显示。经过排查&#xff0c;发现是<video>元素在DOM渲染时被异常定位&#xff0c;导…

    服务器硬件电路设计之 I2C 问答(三):I2C 总线上可以接多少个设备?如何保证数据的准确性?

    在服务器硬件电路设计中&#xff0c;I2C 总线作为常用的串行通信协议&#xff0c;其设备连接数量和数据准确性至关重要。​I2C 总线上可连接的设备数量并非无限制。从理论上讲&#xff0c;标准 I2C 设备采用 7 位地址&#xff0c;除去保留地址&#xff0c;最多可连接 112 个设备…

    用LaTeX优化FPGA开发:结合符号计算与Vivado工具链

    用 LaTeX 优化 FPGA 开发&#xff1a;结合符号计算与 Vivado 工具链&#xff08;一&#xff09; 系列文章目录 第一章&#xff1a;深入了解 LaTeX&#xff1a;科技文档排版的利器 第二章&#xff1a;LaTeX 下载安装保姆级教程 第三章&#xff1a;LaTeX 创建工程并生成完整文档…

    人工智能系列(6)如何开发有监督神经网络系统?

    一. 开发有监督神经网络系统的步骤1. 数据收集训练数据通常由输入–输出成对组成&#xff0c;根据任务需求可能涵盖不同情境&#xff08;如白天或夜晚的车辆识别&#xff09;&#xff0c;其类型可以是数值、图像、音频等多种形式&#xff1b;数据规模越大、越多样&#xff0c;模…