当前位置: 首页 > news >正文

TOMCAT笔记

一、前置知识: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.lryc.cn/news/615167.html

    相关文章:

  1. 七、《Serverless架构:按毫秒计费的成本革命》--从新浪AI推理平台50%效能提升看无服务器本质
  2. 前端如何安全存储 API 密钥 —— 两种实用方案
  3. CosyVoice 语音合成模型性能优化实战:从 CPU 瓶颈到 GPU 加速的完整解决方案
  4. electron多进程设计
  5. K8s-pod控制器
  6. Baumer高防护相机如何通过YoloV8深度学习模型实现输电线路塔电缆检测分割(C#代码UI界面版)
  7. DAY 37 作业(补)
  8. 99-基于Python的京东手机数据分析及预测系统
  9. 【工具变量】全国省级农业保险保费收入与赔付支出数据更新(2001-2023年)
  10. 爬虫攻防战:反爬与反反爬全解析
  11. react-window
  12. 【Datawhale AI夏令营】基于多模态RAG的企业财报问答系统
  13. Arduino系列教程:点亮一个LED灯
  14. 【工具】Python多环境管理
  15. Red Hat Enterprise Linux 7.9安装Oracle 11.2.0.4单实例数据库-图文详解
  16. Python训练营打卡Day27-类的定义和方法
  17. 线程池多反应堆服务器webserver(c++)
  18. 算法篇----模拟
  19. Linux的软件防火墙iptables
  20. QML 鼠标穿透
  21. 从免费到盈利:Coze智能体1小时封装变现全流程指南——井云科技
  22. 云服务器--阿里云OSS(2)【Springboot使用阿里云OSS】
  23. 81 keil仿真调试记录
  24. C++11中的移动语义
  25. 优化器:SGD、Adam、RMSprop等优化算法对比与机器翻译应用
  26. day 16 stm32 IIC
  27. 【Java EE初阶 --- 网络原理】JVM
  28. 堆----3.数据流的中位数
  29. 【Redis】Redis-plus-plus的安装与使用
  30. 自定义通知组件跟随右侧边栏移动