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.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;模…