【linux】企業級WEB應用服務器tomcat

WEB技術

1.1 HTTP協議和B/S 結構

操作系統有進程子系統,使用多進程就可以充分利用硬件資源。進程中可以多個線程,每一個線程可以被CPU調度執行,這樣就可以讓程序并行的執行。這樣一臺主機就可以作為一個服務器為多個客戶端提供計算服務。
客戶端和服務端往往處在不同的物理主機上,它們分屬不同的進程,這些進程間需要通信。跨主機的進程間通信需要使用網絡編程。最常見的網絡編程接口是Socket
Socket稱為套接字,本意是插座。也就是說網絡通訊需要兩端,如果一端被動的接收另一端請求并提供計算和數據的稱為服務器端,另一端往往只是發起計算或數據請求,稱為客戶端。
這種編程模式稱為Client/Server編程模式,簡稱C/S編程。開發的程序也稱為C/S程序。C/S編程往往使用傳輸層協(TCP/UDP),較為底層,比如:QQ,迅雷, 云音樂, 云盤, foxmailxshell
起初網頁開發主要指的是HTMLCSS等文件制作,目的就是顯示文字或圖片,通過超級鏈接跳轉到另一個HTML并顯示其內容。
后來,網景公司意識到讓網頁動起來很重要,傍著SUNJava的名氣發布了JavaScript語言,可以在瀏覽器中使用JS引擎執行的腳本語言,可以讓網頁元素動態變化,網頁動起來了。
為了讓網頁動起來,微軟使用ActiveX技術、SUNApplet都可以在瀏覽器中執行代碼,但都有安全性問題。能不能直接把內容直接在WEB服務器端組織成HTML,然后把HTML返回給瀏覽器渲染呢?
最早出現了CGICommon Gateway Interface)通用網關接口,通過瀏覽器中輸入URL直接映射到一個服務器端的腳本程序執行,這個腳本可以查詢數據庫并返回結果給瀏覽器端。這種將用戶請求使用程序動態生成的技術,稱為動態網頁技術。先后出現了ASPPHPJSP等技術,這些技術的使用不同語言編寫的程序都運行在服務器端,所以稱為WEB后端編程。有一部分程序員還是要編寫HTMLCSS、JavaScript,這些代碼運行在瀏覽器端,稱為WEB前端編程。合起來稱為Browser/Server編程,即B/S編程。

1.2 前端三大核心技術

1.2.1 HTML

  • 超文本需要顯示,就得有軟件能夠呈現超文本定義的排版格式,例如顯示:圖片、表格,顯示字體的大小、顏色,這個軟件就是瀏覽器。
  • HTML由一個個的標簽(標記)組成,這些標簽各司其職,有的提供網頁信息,有的負責文字,有的負責圖片,有的負責網頁布局,所以一個HTML文件,是由格式標簽和數據組成。
  • HTMLHyperText Markup Language)超文本標記語言,它不同于一般的編程語言。超文本即超出純文本的范疇,例如:描述文本顏色、大小、字體等信息,或使用圖片、音頻、視頻等非文本內容。
  • 超文本的誕生是為了解決純文本不能格式顯示的問題,是為了好看,但是只有通過網絡才能分享超文本的內容,所以制定了HTTP協議。

1.2.2 CSSCascading Style Sheets)層疊樣式表

  • HTML本身為了格式化顯示文本,但是當網頁呈現大家面前的時候,需求HTML提供更多樣式能力。這使得HTML變得越來越臃腫。這促使了CSS的誕生。
  • CSS 3采用了模塊化思想,每個模塊都在CSS 2基礎上分別增強功能。所以,這些模塊是陸續發布的。
  • 不同廠家的瀏覽器使用的引擎,對CSS的支持不一樣,導致網頁布局、樣式在不同瀏覽器不一樣。因此, 想要保證不同用戶使用不同瀏覽器看到的網頁效果一直非常困難。

1.2.3 JavaScript

Javascript 簡稱JS,是一種動態的弱類型腳本解釋性語言,和HTMLCSS并稱三大WEB核心技術,得到了幾乎主流瀏覽器支持。
同步
交互式網頁,用戶提交了請求,就是想看到查詢的結果。服務器響應到來后是一個全新的頁面內容,哪怕URL不變,整個網頁都需要重新渲染。例如,用戶填寫注冊信息,只是2次密碼不一致,提交后,整個注冊頁面重新刷新,所有填寫項目重新填寫(當然有辦法讓用戶減少重填)。這種交互非常不友好。從代價的角度看,就是為了注冊的一點點信息,結果返回了整個網頁內容,不但浪費了網絡帶寬,還需要瀏覽器重新渲染網頁,太浪費資源了,影響了用戶體驗和感受。上面這些請求的過程,就是同步過程,用戶發起請求,頁面整個刷新,直到服務器端響應的數據到來并重新渲染。
異步
傳統的網頁如果需要更新內容,必需重載整個網頁面。Ajax的出現,改變這一切,同時極大的促進了Javascript的發展。Ajax"Asynchronous Javascript And XML"(異步 JavaScript XML),是指一種創建交互式、快速動態網頁應用的網頁開發技術,最早起源于1998年微軟的Outlook Web Access開發團隊。Ajax 通過在后臺與服務器進行少量數據交換, 可以使網頁實現異步更新。這意味著可以在不重新加載整個網頁的情況下,對網頁的某部分進行更新。Javascript 通過調用瀏覽器內置的WEB API中的XMLHttpRequest 對象實現Ajax 技術。早期Ajax結合數據格式XML,目前更多的使用JSON。利用AJAX可實現前后端開發的徹底分離,改變了傳統的開發模式。

WEB框架

2.1 web資源和訪問

PC 端或移動端瀏覽器訪問
從靜態服務器請求HTMLCSSJS等文件發送到瀏覽器端,瀏覽器端接收后渲染在瀏覽器上從圖片服務器請求圖片資源顯示
從業務服務器訪問動態內容,動態內容是請求后有后臺服務訪問數據庫后得到的,最終返回到瀏覽器端
手機 App 訪問
內置了HTMLJS文件,不需要從靜態WEB服務器下載 JS HTML。為的就是減少文件的發送,現代前端開發使用的JS文件太多或太大了
有必要就從圖片服務器請求圖片,從業務服務器請求動態數據
客戶需求多樣,更多的內容還是需要由業務服務器提供,業務服務器往往都是由一組服務器組成。

2.2 后臺應用架構

2.2.1 單體架構

  • 傳統架構(單機系統),一個項目一個工程:比如商品、訂單、支付、庫存、登錄、注冊等等,統一部署,一個進程
  • all in one的架構方式,把所有的功能單元放在一個應用里。然后把整個應用部署到一臺服務器上。
  • 如果負載能力不行,將整個應用進行水平復制,進行擴展,然后通過負載均衡實現訪問。
  • Java實現:JSPServlet,打包成一個jarwar部署易于開發和測試:也十分方便部署;當需要擴展時,只需要將war復制多份,然后放到多個服務器上,再做個負載均衡就可以了。
  • 如果某個功能模塊出問題,有可能全站不可訪問,修改Bug后、某模塊功能修改或升級后,需要停掉整個服務,重新整體重新打包、部署這個應用war包,功能模塊相互之間耦合度高,相互影響,不適合當今互聯網業務功能的快速迭代。
  • 特別是對于一個大型應用,我們不可能吧所有內容都放在一個應用里面,我們如何維護、如何分工合作都是問題。如果項目龐大,管理難度大
  • web應用服務器:開源的tomcatjettyglassfish。商用的有weblogicwebsphereJboss

2.2.2 微服務

  • 屬于SOAService Oriented Architecture)的子集
  • 微服務化的核心就是將傳統的一站式應用,根據業務拆分成一個一個的服務,徹底去掉耦合,每一個微服務提供單個業務功能,一個服務只做一件事。每個服務都圍繞著具體業務進行構建,并且能夠被獨立地部署到生產環境、類生產環境等
  • 從技術角度講就是一種小而獨立的處理過程,類似與進程的概念,能夠自行單獨啟動或銷毀
  • 微服務架構(分布式系統),各個模塊/服務,各自獨立出來,"讓專業的人干專業的事",獨立部署。分布式系統中,不同的服務可以使用各自獨立的數據庫。
  • 服務之間采用輕量級的通信機制(通常是基于HTTPRESTful API)。
  • 微服務設計的思想改變了原有的企業研發團隊組織架構。傳統的研發組織架構是水平架構,前端、后端、DBA、測試分別有自己對應的團隊,屬于水平團隊組織架構。而微服務的設計思想對團隊的劃分有著一定的影響,使得團隊組織架構的劃分更傾向于垂直架構,比如用戶業務是一個團隊來負責,支付業務是一個團隊來負責。但實際上在企業中并不會把團隊組織架構拆分得這么絕對,垂直架構只是一種理想的架構
  • 微服務的實現框架有多種,不同的應用架構,部署方式也有不同

2.2.3 單體架構和微服務比較

微服務的優點:
  • 每個服務足夠內聚,足夠小,代碼容易理解。這樣能聚焦一個只當的業務功能或業務需求。
  • 開發簡單、開發效率提高,一個服務可能就是專業的只干一件事,微服務能夠被小團隊單獨開發,這個小團隊可以是25人的開發人員組成
  • 微服務是松耦合的,是有功能意義的服務,無論是在開發階段或部署階段都是獨立的。
  • 微服務能使用不同的語言開發
  • 易于和第三方集成,微服務運行容易且靈活的方式集成自動部署,通過持續集成工具,如:
  • JenkinsHudsonBamboo
  • 微服務易于被一個開發人員理解、修改和維護,這樣小團隊能夠更關注自己的工作成果,無需通過合作才能體現價值
  • 微服務允許你利用融合最新技術。微服務只是業務邏輯的代碼,不會和HTML/CSS或其他界面組件混合,即前后端分離
  • 每個微服務都有自己的存儲能力,可以有自己的數據庫,也可以有統一數據庫
微服務缺點:
  • 微服務把原有的一個項目拆分成多個獨立工程,增加了開發、測試、運維、監控等的復雜度
  • 微服務架構需要保證不同服務之間的數據一致性,引入了分布式事務和異步補償機制,為設計和開發帶來一定挑戰
  • 開發人員和運維需要處理分布式系統的復雜性,需要更強的技術能力
  • 微服務適用于復雜的大系統,對于小型應用使用微服務,進行盲目的拆分只會增加其維護和開發成
常見的微服務框架
Dubbo
  • 阿里開源貢獻給了ASF,目前已經是Apache的頂級項目
  • 一款高性能的Java RPC服務框架,微服務生態體系中的一個重要組件
  • 將單體程序分解成多個功能服務模塊,模塊間使用Dubbo框架提供的高性能RPC通信
  • 內部協調使用Zookeeper,實現服務注冊、服務發現和服務治理
Spring cloud
  • 一個完整的微服務解決方案,相當于Dubbo的超集
  • 微服務框架,將單體應用拆分為粒度更小的單一功能服務
  • 基于HTTP協議的REST(Representational State Transfer 表述性狀態轉移)風格實現模塊間通信

tomcat的功能介紹

Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器,屬于輕量級應用服務器,在中小型系統和并發訪問用戶不是很多的場合下被普遍使用,Tomcat 具有處理HTML頁面的功能,它還是一個Servlet和JSP容器
當前 Tomcat 的正式版本已經更新到 9.0.x 版本,但當前企業中主流版本為 8.x 7.x

3.1 安裝 Tomcat

1.安裝java環境

#安裝java環境
[root@tomcat ~]# yum install java-1.8.0-openjdk.x86_64 -y#查看java版本
[root@tomcatA ~]# java -version
openjdk version "1.8.0_402"
OpenJDK Runtime Environment (build 1.8.0_402-b06)
OpenJDK 64-Bit Server VM (build 25.402-b06, mixed mode)#查看java的環境目錄
[root@tomcatA ~]# which java
/usr/bin/java
[root@tomcatA ~]# ll /usr/bin/java
lrwxrwxrwx 1 root root 22 Jul 30 10:41 /usr/bin/java -> /etc/alternatives/java#java的運行環境
[root@tomcatA ~]# cd /etc/alternatives/jre
[root@tomcatA jre]# ls
ASSEMBLY_EXCEPTION bin lib LICENSE THIRD_PARTY_README

2.安裝并啟動tomcat

#解壓并生成tomcat的程序目錄
[root@tomcatA ~]# tar zxf apache-tomcat-9.0.107.tar.gz -C /usr/local/
[root@tomcatA ~]# cd /usr/local/
[root@tomcatA local]# ls
apache-tomcat-9.0.107 bin etc games include lib lib64 libexec sbin share
src
[root@tomcatA local]# mv apache-tomcat-9.0.107/ tomcat
[root@tomcatA local]# ls
bin etc games include lib lib64 libexec sbin share src tomcat#啟動tomcat
[root@tomcatA local]# cd tomcat/
[root@tomcatA tomcat]# cd bin/
[root@tomcatA bin]# ./startup.sh

3.查看端口

[root@tomcat ~]# netstat -antlupe | grep java

4.訪問tomcat

3.2 tomcat的文件結構和組成

目錄結構

目錄 說明
-------------------------------------------------------
bin ??????????????????????????服務啟動、停止等相關程序和文件
conf? ? ? ? ? ? ? ? ? ? ? ? ?配置文件
lib ???????????????????????????庫目錄
logs ????????????????????????日志目錄
webapps? ? ? ? ? ? ? ? ?應用程序,應用部署目錄,相當于nginx的默認發布目錄
work jsp? ? ? ? ? ? ? ? ? 編譯后的結果文件,建議提前預熱訪問

查看tomcat相關目錄和文件

[root@tomcat ~]# ls /usr/local/tomcat/

3.3 生成tomcat的啟動文件

1.生成tomcat的主配置文件

[root@tomcat ~]# vim /usr/local/tomcat/conf/tomcat.conf
JAVA_HOME=/etc/alternatives/jre

2.生成啟動文件

[root@tomcat ~]# 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

3.生成tomcat用戶并設定軟件安裝目錄權限

[root@tomcatB bin]# useradd -s /sbin/nologin -M tomcat
[root@tomcatB bin]# chown tomcat.tomcat /usr/local/tomcat/ -R

4.用啟動腳本開啟服務

[root@tomcatB ~]# systemctl enable --now tomcat

四 結合反向代理實現tomcat部署

4.1 常見部署方式介紹

  • standalone模式,Tomcat單獨運行,直接接受用戶的請求,不推薦。
  • 反向代理,單機運行,提供了一個Nginx作為反向代理,可以做到靜態由nginx提供響應,動態jsp代理給Tomcat
    • LNMT:Linux + Nginx + MySQL + Tomcat
    • LAMTLinux + ApacheHttpd+ MySQL + Tomcat
  • 前置一臺Nginx,給多臺Tomcat實例做反向代理和負載均衡調度,Tomcat上部署的純動態頁面更適合
    • LNMTLinux + Nginx + MySQL + Tomcat
  • 多級代理
    • LNNMTLinux + Nginx + Nginx + MySQL + Tomcat

4.2 利用 nginx 反向代理實現

利用nginx反向代理功能,實現圖中的代理功能,將用戶請求全部轉發至指定的同一個tomcat主機

利用nginx指令proxy_pass 可以向后端服務器轉發請求報文,并且在轉發時會保留客戶端的請求報文中的host首部
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
location ~ \.jsp$ {
proxy_pass http://172.25.254.10:8080;
}

4.3 實現tomcat中的負載均衡

動態服務器的問題,往往就是并發能力太弱,往往需要多臺動態服務器一起提供服務。如何把并發的壓力分攤,這就需要調度,采用一定的調度策略,將請求分發給不同的服務器,這就是Load Balance負載均衡。
當單機Tomcat,演化出多機多級部署的時候,一個問題便凸顯出來,這就是Session。而這個問題的由來,都是由于HTTP協議在設計之初沒有想到未來的發展。

4.3.1 HTTP的無狀態,有連接和短連接

  • 無狀態:指的是服務器端無法知道2次請求之間的聯系,即使是前后2次請求來自同一個瀏覽器,也沒有任何數據能夠判斷出是同一個瀏覽器的請求。后來可以通過cookiesession機制來判斷。
    • 瀏覽器端第一次HTTP請求服務器端時,在服務器端使用session這種技術,就可以在服務器端
    • 產生一個隨機值即SessionID發給瀏覽器端,瀏覽器端收到后會保持這個SessionIDCookie當中,這個Cookie值一般不能持久存儲,瀏覽器關閉就消失。瀏覽器在每一次提交HTTP請求的時候會把這個SessionID傳給服務器端,服務器端就可以通過比對知道是誰了
    • Session通常會保存在服務器端內存中,如果沒有持久化,則易丟失
    • Session會定時過期。過期后瀏覽器如果再訪問,服務端發現沒有此ID,將給瀏覽器端重新發新的SessionID
  • 有連接:是因為它基于TCP協議,是面向連接的,需要3次握手、4次斷開
  • 短連接:Http 1.1之前,都是一個請求一個連接,而Tcp的連接創建銷毀成本高,對服務器有很大的影響。所以,自Http 1.1開始,支持keep-alive,默認也開啟,一個連接打開后,會保持一段時間 (可設置),瀏覽器再訪問該服務器就使用這個Tcp連接,減輕了服務器壓力,提高了效率。

服務器端如果故障,即使Session被持久化了,但是服務沒有恢復前都不能使用這些SessionID

如果使用HAProxy或者Nginx等做負載均衡器,調度到了不同的Tomcat上,那么也會出現找不到
SessionID的情況。

4.3.2 tomcat負載均衡實現

[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
upstream tomcat {
#ip_bash;
#hash $cookie_JSESSIONID;
server 172.25.254.10:8080;
server 172.25.254.20:8080;
}
server {
listen 80;
server_name lee.timinglee.org;
root /webdataw/nginx/timinglee.org/lee;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
try_files $uri $uri.html $uri/index.html /error/default.html;
location ~ \.jsp$ {
proxy_pass http://tomcat;
}
}

Memcached

5.1 Memcached簡介

  • Memcached 只支持能序列化的數據類型,不支持持久化,基于Key-Value的內存緩存系統memcached雖然沒有像redis所具備的數據持久化功能,比如RDBAOF都沒有,但是可以通過做集群同步的方式,讓各memcached服務器的數據進行同步,從而實現數據的一致性,即保證各memcached的數據是一樣的,即使有任何一臺 memcached 發生故障,只要集群中有一臺 memcached 可用就不會出現數據丟失,當其他memcached 重新加入到集群的時候,可以自動從有數據的memcached 當中自動獲取數據并提供服務。
  • Memcached 借助了操作系統的 libevent 工具做高效的讀寫。libevent是個程序庫,它將Linuxepoll、BSD類操作系統的kqueue等事件處理功能封裝成統一的接口。即使對服務器的連接數增加,也能發揮高性能。memcached使用這個libevent庫,因此能在LinuxBSDSolaris等操作系統上發揮其高性能
  • Memcached 支持最大的內存存儲對象為1M,超過1M的數據可以使用客戶端壓縮或拆分報包放到多個key中,比較大的數據在進行讀取的時候需要消耗的時間比較長,memcached 最適合保存用戶的session實現session共享
  • Memcached存儲數據時, Memcached會去申請1MB的內存, 把該塊內存稱為一個slab, 也稱為一個page
  • Memcached 支持多種開發語言,包括:JAVA,C,Python,PHP,C#,Ruby,Perl

5.2 memcached的安裝與啟動

[root@tomcat ~]# yum install memcached -y
[root@tomcat ~]# cat /etc/sysconfig/memcachedPORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1"[root@tomcat ~]# systemctl enable --now memcached
[root@tomcat ~]# netstat -antlupe | grep memcache
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 980 97815 34711/memcached

5.3 memcached 操作命令

五種基本 memcached 命令執行最簡單的操作。這些命令和操作包括:
  • set
  • add
  • replace
  • get
  • delete

session 共享服務器

6.1 msm 介紹

msmmemcached session manager)提供將Tomcatsession保持到memcached可以實現高可用。項目早期托管在google code,目前在Github

支持Tomcat 6.x7.x8.x9.x

  • TomcatSession管理類,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 安裝

spymemcached.jarmemcached-session-managekyro相關的jar文件都放到Tomcatlib目錄
中,這個目錄是 $CATALINA_HOME/lib/ ,對應本次安裝就是/usr/local/tomcat/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

t1m1部署可以在一臺主機上,t2m2部署也可以在同一臺。

當新用戶發請求到Tomcat1, Tomcat1生成session返回給用戶的同時,也會同時發給memcached2備份。即Tomcat1 session為主sessionmemcached2 session為備用session,使用memcached相當于備份了一份Session
如果Tomcat1發現memcached2 失敗,無法備份Sessionmemcached2,則將Sessoin備份存放在
memcached1

6.3 配置過程

下載相關jar
下載相關jar,參考下面官方說明的下載鏈接
https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration

修改tomcat

[root@tomcat-1 ~]# vim /usr/local/tomcat/conf/context.xml
@@@@內容省略@@@@
<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.KryoTranscoderFacto
ry"
/>
[root@tomcat-2 tomcat]# vim /usr/local/tomcat/conf/context.xml
@@@@內容省略@@@@
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
failoverNodes="n2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFacto
ry"
/>

修改nginx配置

[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
upstream tomcat {
hash $cookie_JSESSIONID;
server 172.25.254.10:8080;
server 172.25.254.20:8080;
}server {
listen 80;
server_name lee.timinglee.org;
root /webdataw/nginx/timinglee.org/lee;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
try_files $uri $uri.html $uri/index.html /error/default.html;
location ~ \.jsp$ {
proxy_pass http://tomcat;
}
}

實驗

  • 安裝tomcat

安裝java環境

安裝tomcat

啟動tomcat

默認8080端口

生成tomcat的主配置文件

生成啟動文件

生成tomcat用戶并設定軟件安裝目錄權限

  • 反向代理實現tomcat

寫一個默認jsp頁面

單機反向代理

多機負載代理

源地址hash,不合適

cookie值

cookie的hash效果

  • tomcat與memcached結合

安裝memcached

安裝telnet

允許所有用戶訪問

可以手動看緩存效果

memcached交叉存儲

將jar全部導入到tomcat的lib庫里面

修改tomcat配置,讓其支持memcache

修改配置tomcat1

修改配置tomcat2

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/92699.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92699.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92699.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Unity優化】Unity多場景加載優化與資源釋放完整指南:解決Additive加載卡頓、預熱、卸載與內存釋放問題

【Unity優化】Unity多場景加載優化與資源釋放完整指南&#xff1a;解決Additive加載卡頓、預熱、卸載與內存釋放問題 本文將完整梳理 Unity 中通過 SceneManager.LoadSceneAsync 使用 Additive 模式加載子場景時出現的卡頓問題&#xff0c;分析其本質&#xff0c;提出不同階段的…

B 樹與 B + 樹解析與實現

一、磁盤存儲優化的核心邏輯 在大規模數據處理場景中&#xff0c;磁盤 I/O 效率是性能瓶頸的核心。磁盤訪問具有以下特性&#xff1a; 隨機訪問成本高&#xff1a;磁頭尋道時間&#xff08;Seek Time&#xff09;可達毫秒級&#xff0c;相比內存訪問&#xff08;納秒級&#…

MySQL 查詢相同記錄并保留時間最晚的一條

要在 MySQL 中查詢相同記錄并僅保留時間最晚的那一條&#xff0c;你可以使用以下幾種方法&#xff1a;方法一&#xff1a;使用子查詢和 GROUP BY假設你的表名為 your_table&#xff0c;時間字段為 create_time&#xff0c;其他用于判斷記錄相同的字段為 field1, field2 等&…

在 .NET Core 5.0 中啟用 Gzip 壓縮 Response

在 .NET Core 5.0 中啟用 Gzip 壓縮 Response 在 .NET Core 5.0 (ASP.NET Core 5.0) 中啟用 Gzip 壓縮主要通過響應壓縮中間件實現。以下是詳細配置步驟&#xff1a; 1. 安裝必要的 NuGet 包 首先確保已安裝響應壓縮包&#xff1a; dotnet add package Microsoft.AspNetCore.Re…

[Oracle] TRUNC()函數

TRUNC() 是 Oracle 中一個多功能函數&#xff0c;主要用于對數值、日期進行截斷操作1.TRUNC()函數用于數值處理語法格式TRUNC(number, decimal_places)參數說明number&#xff1a;要截斷的數值 decimal_places&#xff1a;保留的小數位數(可選)&#xff0c;默認為0(截斷所有小數…

GPT-oss:OpenAI再次開源新模型,技術報告解讀

1.簡介OpenAI 發布了兩款開源權重推理模型 gpt-oss-120b 與 gpt-oss-20b&#xff0c;均采用 Apache 2.0 許可&#xff0c;主打在代理工作流中執行復雜推理、調用工具&#xff08;如搜索、Python 代碼執行&#xff09;并嚴格遵循指令。120b 為 36 層 MoE 結構&#xff0c;活躍參…

python tcp 框架

目錄 python tcp 框架 asyncio websockets python tcp 框架 asyncio import asyncio import json import timeclass TCPClient:def __init__(self, host, port, heartbeat_interval10):self.host hostself.port portself.heartbeat_interval heartbeat_intervalself.read…

HTML 與 CSS:從 “認識標簽” 到 “美化頁面” 的入門指南

個人主頁&#xff1a;?喜歡做夢 目錄 &#x1f3a0;HTML &#x1f3a1;一、什么是HTML&#xff1f; ??1.定義 ??2.核心特點 ??3.HTML的基本結構 ??4.標簽的層次結構關系 &#x1f3a1;二、HTML的常用標簽 &#x1f305;1.文本列表標簽 標題標簽&#xff1a;h…

【MATLAB 2025a】安裝離線幫助文檔

文章目錄一、在 MATLAB 設置中安裝二、從math works 網站下載ISO&#xff1a;適用于給無法聯網的電腦安裝或自定義路徑三、startup文件說明四、重要說明&#x1f9e9;&#x1f9e9;【Matlab】最新版2025a發布&#xff0c;深色模式、Copilot編程助手上線&#xff01; 版本&#…

Linux系統編程Day8 -- Git 教程(初階)

往期內容回顧 基于Linux系統知識的第一個程序 自動化構建工具-make/Makefile gcc/g編譯及鏈接 Vim工具的使用 Linux常用工具&#xff08;yum與vim&#xff09; ?????? Linux系統編程Day4-- Shell與權限 回顧進度條程序的編寫&#xff1a; //.h文件內容 #include<stdio…

React18 Transition特性詳解

Transition 核心概念&#xff1a;Transition是一種標記非緊急任務更新的機制&#xff0c;它允許React在用戶交互&#xff08;如輸入&#xff09;期間保持界面的響應&#xff0c;同時準備后臺更新 主要特點&#xff1a; 區分優先級&#xff1a;可以將更新分為緊急非緊急任務可中…

OpenHarmony概述與使用

1. OpenHarmony Hi3861 學習目標與任務 硬件基礎知識&#xff1a;涵蓋嵌入式硬件體系架構&#xff08;如 MCU 基礎、硬件接口原理 &#xff09;、硬件設計流程&#xff08;原理圖繪制、PCB Layout 規范 &#xff09;&#xff0c;了解常見硬件外設&#xff08;傳感器、通信模…

大模型提示詞工程實踐:大語言模型文本轉換實踐

大模型文本轉換 學習目標 在本課程中&#xff0c;我們將探究如何使用大語言模型來完成文本轉換任務&#xff0c;例如語言翻譯、拼寫和語法檢查、語氣調整以及格式轉換。 相關知識點 大模型文本轉換 學習內容 1. 大模型文本轉換 文本轉換的核心定義與范疇 文本轉換 是指通過技術…

力扣LCR024:反轉鏈表206.反轉鏈表雙解法(經典面試題)

LCR 024. 反轉鏈表 - 力扣&#xff08;LeetCode&#xff09;LCR 024. 反轉鏈表 - 給定單鏈表的頭節點 head &#xff0c;請反轉鏈表&#xff0c;并返回反轉后的鏈表的頭節點。 示例 1&#xff1a;[https://assets.leetcode.com/uploads/2021/02/19/rev1ex1.jpg]輸入&#xff1a…

Day 6: CNN卷積神經網絡 - 計算機視覺的核心引擎

Day 6: CNN卷積神經網絡 - 計算機視覺的核心引擎 ?? 核心概念(5分鐘理解) 什么是CNN卷積神經網絡? 核心概念解釋: CNN(Convolutional Neural Network): 專門處理具有網格狀拓撲結構數據的深度學習模型,特別擅長圖像識別 為什么需要: 傳統全連接神經網絡處理圖像時參數量…

MacBook 本地化部署 Dify 指南

Dify 安裝前的準備工作 確認系統滿足最低配置要求&#xff0c;包括操作系統版本、內存、CPU 和存儲空間。 檢查是否已安裝必要的依賴項&#xff0c;如 Python、Docker 確保網絡環境穩定&#xff0c;能夠訪問所需的軟件源或鏡像倉庫。 獲取 Dify 安裝包 https://docs.dify.ai…

疫情可視化:基孔肯雅熱風險地圖實戰解析

> 一只白紋伊蚊的飛行半徑是100米,而一套WebGIS系統能將疫情防控范圍精確到每平方米。 2025年夏季,基孔肯雅熱疫情在廣東佛山爆發,短短一個月內感染病例占全省95%以上。這種由伊蚊傳播的病毒性疾病,以**突發高熱、劇烈關節痛和全身皮疹**為特征,患者關節疼痛可能持續數…

【14-模型訓練細節】

訓練步驟 1、指定輸入和輸出&#xff0c;即模型定義&#xff1b; 2、指定損失函數和成本函數&#xff1b; 3、指定訓練算法&#xff0c;如梯度下降算法&#xff1b;訓練細節 損失函數和成本函數用梯度下降算法訓練模型 主要是求成本函數的偏導數&#xff0c;使用的是反向傳播算…

ConcurrentDictionary 詳解:.NET 中的線程安全字典

什么是 ConcurrentDictionary&#xff1f; ConcurrentDictionary<TKey, TValue> 是 .NET Framework 4.0 和 .NET Core/.NET 5 中引入的線程安全字典實現&#xff0c;位于 System.Collections.Concurrent 命名空間。它解決了多線程環境下操作字典時的同步問題&#xff0c…

集成電路學習:什么是URDF Parser統一機器人描述格式解析器

URDF Parser(URDF解析器)是ROS(Robot Operating System,機器人操作系統)中用于解析URDF(Unified Robot Description Format,統一機器人描述格式)文件的工具。URDF是一種基于XML(Extensible Markup Language,可擴展標記語言)規范的格式,用于描述機器人的結構、關節、…