tomcat

數據庫優化 javascript

1:能夠用數據庫緩存,常見的memcached css

2:數據庫自身有不少緩存機制,可以使用應對的緩存策略 html

3:對數據來講;儘量使用索引 java

4:對請求來講,能夠實現讀寫分離,對讀請求進行負載均衡 linux

5:對大數據或者表,可根據業務邏輯進行分庫分表 nginx

6:全部的優化,儘量往內存中存放; 緩存爲王 git

分庫分表: 程序員

1,水平拆分:將一個大數據表拆分紅若干個小表; 例如:一個表中有10億條記錄,將着10億條記錄分紅10萬條記錄爲一個表 github

2,垂直拆分:將一個字段或多個字段分紅一個表 web

數據庫優化:

1:緩存優化;能夠在程序中寫一個緩存服務器,實現緩存

2:數據層面;表儘量加索引; 讀寫分離

讀寫分離:

讀和寫放在不一樣的服務器裏

 

編程語言分類

硬件級:微碼編程,彙編語言

系統級:C, C++

應用級:Java PHP Python Ruby Perl C#,.....

 

面向對象:以數據爲中心,面向對象從另外一個角度解決這個問題,它拋棄了函數,把對象做爲程序的基本單元;對象就是對事物的一種抽象描述

面向過程:以指令爲中心;面向過程的設計思路就是首先分析問題的步驟

 

面向對象中

繼承:將上一個程序繼承下來,不須要再從新啓動一個

封裝:不須要知道對方怎麼工做,只須要調用就好了

多態:能有多種用途,能實現多種功能

 

PHP開發技術和Java開發技術應用區別

PHP:適合快速開發,中小型應用系統,開發成本低,可以對變更的需求作出快速的反應

Java:適合與開發大型的應用系統,應用的前景比較開闊,系統容易維護,可複用性較好。

 

Java包含三大分支:

1:J2SE----Java standard edition 標準版本,這個是下面兩個的基礎 ; 通常是位於客戶端的應用

2:J2ME----Java Micro edition 通常位於嵌入式應用,例如手機遊戲

3:J2EE-----Java Enterprise Edition 通常爲服務器端的應用:例如JSP站點

J2EE 規範包含Servlet,主要是爲了擴展java做爲web服務的功能,他的做用就是爲java程序提供 一個統一的web應用的規範,方便程序員統一的使用這種規範來編寫程序,應用容器可使用提供的規範來實現本身的特性。

靜態網站技術和動態網站技術區別

web服務器習慣處理靜態頁面,因此須要一個程序來幫忙處理動態請求(如

當前時間)。Web服務器程序會將動態請求轉發給幫助程序,幫助程序處理

後,返回處理後的靜態結果給web服務器程序。這樣就避免了web服務器

程序處理動態頁面。Servlet的本質是一個幫助程序。

 

servlet容器的做用

Web服務器接收到該請求後,並非將請求直接交給Servlet,而是交給Servlet容器。Servlet容器實例化Servlet,調用Servlet的一個特定方法對請求進行處理, 併產生一個響應。這個響應由Servlet容器返回給Web服務器,Web服務器包裝這個響應,以HTTP響應的形式發送給Web瀏覽

因爲Web服務提供的是靜態頁面,Web將動態頁面發送給Servlet,Servlet容器實例化Servlet,調用Servlet的一個特定方法對請求進行處理, 併產生一個響應

生成靜態頁面,返還給Web服務端,Web服務端,再將這個結果響應給客戶端既瀏覽器

Java Servlet(Java服務器小程序)是一個基於Java技術的Web組件,運行在服務器端,它由Servlet容器所管理,用於生成動態的內容。 Servlet是平臺獨立的Java類,編寫一個Servlet,實際上就是按照Servlet規範編寫一個Java類。Servlet被編譯爲平臺獨立 的字節碼,能夠被動態地加載到支持Java技術的Web服務器中運行。

Servlet容器也叫作Servlet引擎,是Web服務器或應用程序服務器的一部分,用於在發送的請求和響應之上提供網絡服務,解碼基於 MIME的請求,格式化基於MIME的響應。Servlet沒有main方法,不能獨立運行,它必須被部署到Servlet容器中,由容器來實例化和調用 Servlet的方法(doGet()doPost()),Servlet容器在Servlet的生命週期內包容和管理Servlet。在JSP術 推出後,管理和運行Servlet/JSP的容器也稱爲Web容器。

有了servlet以後,用戶經過單擊某個連接或者直接在瀏覽器的地址欄中輸入URL來訪問ServletWeb服務器接收到該請求後,並非將請求直接交給Servlet,而是交給Servlet容器。Servlet容器實例化Servlet,調用Servlet的一個特定方法對請求進行處理, 併產生一個響應。這個響應由Servlet容器返回給Web服務器,Web服務器包裝這個響應,以HTTP響應的形式發送給Web瀏覽

servlet容器能提供什麼?

通訊支持:利用容器提供的方法,你能輕鬆的讓servlet與web服務器對話,而不用本身創建serversocket、監聽某個端口、建立流等 等。容器知道本身與web服務器之間的協議,因此你的servlet不用擔憂web服務器(如Apache)和你本身的web代碼之間的API,只須要考 慮如何在servlet中實現業務邏輯(如處理一個訂單)。

生命週期管理:servlet容器控制着servlet的生與死,它負責加載類、實例化和初始化servlet,調用servlet方法,以及使servlet實例被垃圾回收,有了servlet容器,你不須要太多的考慮資源管理。

多線程支持:容器會自動爲它所接收的每一個servlet請求建立一個新的java線程。針對用戶的請求,若是servlet已經運行完相應的http服務方法,這個線程就會結束。這並非說你不須要考慮線程安全性,其實你還會遇到同步問題,不過這樣能使你少作不少工做。

聲明方式實現安全:利用servlet容器,你可使用xml部署描述文件來配置和修改安全性,而沒必要將其硬編碼寫到servlet類代碼中。

JSP支持:servlet容器負責將jsp代碼翻譯爲真正的java代碼

tomcat是什麼?

用Java語言寫的實現Servlet和JSP容器的服務器

Tomcat的核心分爲3個部分:

(1)Web容器---處理靜態頁面;

(2)catalina --- 一個servlet容器-----處理servlet;

(3)還有就是JSP容器,它就是把jsp頁面翻譯成一個Servlet。

 

JSP和Servlet的區別

JSP在本質上就是Servle,可是二者的建立方式不同。Servlet都是由Java程序代碼構成,用於流程控制和事務處理,經過Servlet來生成動態網頁很不直觀。而JSP由HTML代碼和JSP標籤構成,能夠方便的編寫動態網頁。

JSP和Servlet主要有兩方面的不一樣:

編譯:JSP修改後能夠當即看到結果,不須要編譯;而Servlet須要編譯

轉換:JSP是動態網頁開發技術,是運行在服務器端的腳本語言;而Servlet是Web服務器端編程技術。

因此JSP運行時就是轉換爲Servlet,也就是JAVA程序來執行。

通俗而言:jsp就是在html裏面寫java代碼,servlet就是在java裏面寫html代碼…其實jsp通過容器解釋以後就是servlet.

 

Tomcat服務器接受客戶請求並作出響應的過程以下:

1)客戶端(一般都是瀏覽器)訪問web服務器,發送HTTP請求

2)web服務器接受到請求後,傳遞給Servlet容器

3)Servlet容器加載Servlet,產生Servlet實例後,向其傳遞表示請求和相應的對象。

4) Servlet實例使用請求對象獲得客戶端的信息,而後進行相應的處理

5)Servlet實例將處理結果經過響應對象發送回客戶端,容器負責確保響應正確送出,同時將控制返回給Web服務器

JRE: Java Runtime Environment

JDK:Java Development Kit JRE

JRE:是Java運行環境,包含了Java虛擬機,Java基礎類庫。是使用Java語言編寫的程序運行所須要的軟件環境,是提供給想運行Java程序的用戶使用的。

JDK:是Java開發工具包,是程序員使用Java語言編寫Java程序所需的開發工具包,是提供給程序員使用的JDK包含了JRE,同時還包含了編譯Java源碼的編譯器Javac,還包含了不少Java程序調試和分析分工具::jconsole,jvisualvm等工具軟件,還包含了java程序編寫所需的文檔和demo例子程序。若是你須要運行Java程序,只須要安裝JRE就好了;若是你須要編寫Java程序,須要安裝JDK

JRE根據不一樣操做系統(如:windows,linux等)和不一樣JRE提供商(IBM,ORACLE等)有不少版本,最經常使用的是Oracle公司收購SUN公司的JRE版本。

JAVA虛擬機、tomcat、servlet關係

Tomcat做爲獨立的Web服務器來單獨運行,Servlet容器組件做爲Web服務器中的一部分而存在,這是Tomcat的默認工做模式。在這種工做模式下,Tomcat是一個獨立運行JAVA程序,須要啓動一個Java虛擬機進程來運行Tomcat.

在這種模式下,Tomcat分爲Web服務器插件和Serlvet容器組件兩部分。

Web服務器插件在其餘的web服務器進程外部地址空間啓動一個Java虛擬機,Swevlet容器組件在此java虛擬機中運行。。若有客戶端發出調用Serlvet

請求,Web服務器插件得到對此請求的控制並轉發給Servlet容器組件(採用IPC通信機制,即進程間通訊的一種機制)。

 

JDK安裝方式

安裝相應版本的rpm包;

jdk-VERSION-OS-ARCH.rpm

例如:jdk-1.8.0_25-linux-x64.rpm centos7系統自帶

yum -y install java-1.8.0-openjdk-devel

java -version 顯示java程序的版本信息

注意:安裝完成後,要配置JAVA_HOME環境變量,指向java的安裝路徑;

或者直接官網下載RPM包:

lftp 172.17.0.1

rpm -ivh jdk-8u144-linux-x64.rpm

vim /etc/profile.d/java.sh

JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64

JRE_HOME=$JAVA_HOME/jre

PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

 

tomcat安裝方式

一、從官網下載tomcat二進制安裝包(http://tomcat.apache.org/

#wget

http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-

8/v8.5.11/bin/apache-tomcat-8.5.11.tar.gz

#tar xvf apache-tomcat-8.5.11.tar.gz -C /usr/local/

查看解壓後的目錄;

#ll /usr/local/ | grep tomcat

二、爲方便管理,建立軟連接;

三、建立環境配置腳本;

#vim /etc/profile.d/tomcat.sh

賦予執行權限;

#chmod +x /etc/profile.d/tomcat.sh

加載環境配置;

#source /etc/profile.d/tomcat.sh

四、啓動tomcat

#/usr/local/tomcat/bin/catalina.sh start 或 #catalina.sh start

查看tomcat是否正常啓動

五、測試本地8080端口是否正常監聽

#curl -I 127.0.0.1:8080

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

另外一種安裝方式

tomcat安裝方式

yum install tomcat -y #安裝tomcat主程序

yum install -y tomcat-admin-webapps tomcat-docs-webapp tomcatwebapps

#安裝tomcat對應的頁面

mkdir /var/lib/tomcat/webapps/{ROOT,test}/{WEB-INF,METAINF,

classes,lib} -pv #建立頁面所須要的工做目錄

rpm包安裝的程序環境:

配置文件目錄:/etc/tomcat

主配置文件:server.xml

webapps存放位置:/var/lib/tomcat/webapps/

examples

manager

host-manager

docs

Unit File:tomcat.service

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

環境配置文件:/etc/sysconfig/tomcat #調整jdk內存使用大小等初始值

六、經過瀏覽器訪問測試(需指定8080端口),注意selinux與

iptables策略;

tomcat的組成

bin:腳本,及啓動時用到的類;

conf:配置文件目錄;

lib:庫文件,Java類庫,jar;

logs:日誌文件目錄;

temp:臨時文件目錄;

webapps:網站代碼 webapp的默認目錄;網站源文件

work:工做目錄,存放編譯後的字節碼文件;

 

tomcat的配置文件構成

server.xml:主配置文件;

web.xml:Web應用程序描述文件,能夠設置tomcat支持的文件類型,都是關因而

Web應用程序的配置文件

context.xml:能夠用來配置數據庫之類的信息

tomcat-users.xml:用戶認證的帳號和密碼文件;角色(role),用戶(User);

此文件在tomcat啓動時被裝入內存;

catalina.policy:當使用-security選項啓動tomcat時,用於爲tomcat設置安全策

略;

catalina.properties:Java屬性的定義文件,用於設定類加載器路徑,以及一些與

JVM調優相關參數;

logging.properties:日誌系統相關的配置;

 

server.xml 配置文件

Server:Server表示整個的Catalina Servlet容器。Tomcat提供了Server接口的一個默認實現,這一般不需

要用戶本身去實現。在Server容器中,能夠包含一個或多個Service組件。表明tomcat instance,即表現出

的一個java進程;監聽在8005端口,只接收"SHUTDOWN"。各server監聽的端口不能相同,所以,在同

一物理主機啓動多個實例時,須要修改其監聽端口爲不一樣的端口;

Service:Service是存活在Server內部的中間組件,它將一個或多個鏈接器(Connector)組件綁定到一個

單獨的引擎(Engine)上。用於實現將一個或多個connector組件關聯至一個engine組件;

Connector組件:鏈接器(Connector)處理與客戶端的通訊,它負責接收客戶請求,以及向客戶返回響應

結果。在Tomcat中,有多個鏈接器可使用。常見的有三類http/https/ajp;

Engine組件:在Tomcat中,每一個Service只能包含一個Servlet引擎(Engine)。引擎表示一個特定的

Service的請求處理流水線。做爲一個Service能夠有多個鏈接器,引擎從鏈接器接收和處理全部的請求,將

響應返回給適合的鏈接器,經過鏈接器傳輸給用戶。Servlet實例,即servlet引擎,其內部能夠一個或多個

host組件來定義站點;

Host組件:位於engine內部用於接收請求並進行相應處理的主機或虛擬主機 相似 nginx server

Context組件 一個Context表示了一個Web應用程序,運行在特定的虛擬主機中,一個Host能夠包含多個

Context(表明Web應用程序) 相似nginx location

每個組件都由一個Java"類"實現,這些組件大致可分爲如下幾個類型:

頂級組件:Server

服務類組件:Service

鏈接器組件:http, https, ajp(apache jserv protocol)

容器類:Engine, Host, Context 部署應用程序的組件

被嵌套類:valve, logger, realm, loader, manager, …

集羣類組件:listener, cluster, …

 

JSP WebAPP的組織結構:

/: webapps的根目錄

index.jsp:主頁;

...W EB-INF/:當前webapp的私有資源路徑;一般用於存儲當前webapp的web.xml和

context.xml配置文件;

META-INF/:相似於WEB-INF/;

classes/:類文件,當前webapp所提供的類;

lib/:類文件,當前webapp所提供的類,被打包爲jar格式;

webapp歸檔格式:

.war:Web應用程序歸檔,webapp;

.jar: Java應用程序歸檔,EJB的類打包文件(類庫);

.rar:資源適配器類打包文件;

.ear:企業應用程序歸檔包,企業級webapp;

 

tomcat的日誌類

%a - 遠程IP地址

%A - 本地IP地址

%b - 發送的字節數,不包括HTTP頭,或" - "若是沒有發送字節

%B - 發送的字節數,不包括HTTP頭

%h - 遠程主機名

%H - 請求協議

%l (小寫的L)- 遠程邏輯從identd的用戶名(老是返回' - ')

%m - 請求方法

%p - 本地端口

%q - 查詢字符串(在前面加上一個"?"若是它存在,不然是一個空字符串

%r - 第一行的要求

%s - 響應的HTTP狀態代碼

%S - 用戶會話ID

%t - 日期和時間,在通用日誌格式

%u - 遠程用戶身份驗證

%U - 請求的URL路徑

%v - 本地服務器名

%D - 處理請求的時間(以毫秒爲單位)

%T - 處理請求的時間(以秒爲單位)

%I (大寫的i) - 當前請求的線程名稱

 

tomcat的部署

部署(deploy)webapp的相關操做:

deploy:將webapp的源文件放置於目標目錄(網頁程序文件存放目錄),配置tomcat服務器能

夠基於web.xml和context.xml文件中定義的路徑來訪問此webapp;將其特有的類和依賴的

類經過class loader裝載至JVM;

部署有兩種方式:

自動部署:auto deploy

手動部署:

冷部署:把webapp複製到指定的位置,然後才啓動tomcat;

熱部署:在不中止tomcat的前提下進行部署;

部署工具:manager、ant腳本、tcd(tomcat client deployer)等;

undeploy:拆除(反部署),中止webapp,並從tomcat實例上卸載webapp;

start:啓動處於中止狀態的webapp;

stop:中止webapp,再也不向用戶提供服務;其類依然在jvm上;

redeploy:從新部署;

 

如下是Tomcat Manager 4種角色的大體介紹(下面URL中的*爲通配符):

manager-gui

容許訪問html接口(即URL路徑爲/manager/html/*)

manager-script

容許訪問純文本接口(即URL路徑爲/manager/text/*)

manager-jmx

容許訪問JMX代理接口(即URL路徑爲/manager/jmxproxy/*)

manager-status

容許訪問Tomcat只讀狀態頁面(即URL路徑爲/manager/status/*)

admin-gui(HTML UI接口)或admin-script(純文本接口)。即URL路徑爲/hostmanager

 

做業:

 

 

目前公司和企業使用的Web服務器還有WebSphere,WebLogic,Jetty,JBoss等

等,可是大多數是收費的,針對咱們平時開發的大多數項目,

Tomcat的性能已經可以知足咱們的要求,所以大多數企業中的開

發者或者小公司仍是經常使用Tomcat做爲應用服務器。這些也是servlet容器

 

tomcat經常使用組件和屬性

tomcat的經常使用組件配置

Server:表明tomcat instance,即表現出的一個java進程;監聽在8005端口,只接收"SHUTDOWN"。各server監聽的

端口不能相同,所以,在同一物理主機啓動多個實例時,須要修改其監聽端口爲不一樣的端口;

Service:用於實現將一個或多個connector組件關聯至一個engine組件;

Connector組件

負責接收請求,常見的有三類http/https/ajp;(AJP(Apache JServ Protocol)是定向包協議。由於性能緣由,使用二進

制格式來傳輸可讀性文本。WEB服務器經過 TCP鏈接 和 SERVLET容器鏈接。)

屬性:

port="8080"

protocol="HTTP/1.1"

connectionTimeout="20000"

address:監聽的IP地址;默認爲本機全部可用地址;

maxThreads:最大併發鏈接數,默認爲200;

enableLookups:是否啓用DNS查詢功能;

acceptCount:等待隊列的最大長度;

redirectPort="8443" 須要安全通訊的場合,將把客戶請求轉發至SSL的redirectPort端口

sslProtocol: 使用ssl協議的加密方式

 

tomcat的經常使用組件配置

Engine組件:Servlet實例,即servlet引擎,其內部能夠一個或多個host組件來定義站點; 一般須要經過defaultHost來定

義默認的虛擬主機;

屬性:name=

defaultHost="localhost"

Host組件:位於engine內部用於接收請求並進行相應處理的主機或虛擬主機,示例:

<Host name="localhost" appBase="webapps"

unpackWARs="true" autoDeploy="true">

</Host>

經常使用屬性說明

(1) appBase:此Host的webapps的默認存放目錄,指存放非歸檔的web應用程序的目錄或歸檔的WAR文件目錄路徑;能夠

使用基於$CATALINA_BASE變量所定義的路徑的相對路徑;

(2) autoDeploy:在Tomcat處於運行狀態時,將某webapp放置於appBase所定義的目錄中時,是否自動將其部署至

tomcat;

(3)unpackWARs="true" 則tomcat會自動將WAR文件解壓,不然不解壓,直接從WAR文件中運行應用程序

 

tomcat的經常使用組件配置

Context組件:

示例:

<Context path="/PATH" docBase="/PATH/TO/SOMEDIR" />

Valve組件

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

prefix="localhost_access_log" suffix=".txt"

pattern="%h %l %u %t &quot;%r&quot; %s %b" />

Valve存在多種類型

定義訪問日誌:org.apache.catalina.valves.AccessLogValve

定義訪問控制:org.apache.catalina.valves.RemoteAddrValve

<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="172\.16\.100\.67"/>

 

 

 

 

定義名稱 ;以及名稱匹配:

 

實現企業級常見架構LNMT

LNMP動態請求經過cgi(通用網關接口)交給PHP處理

LNMT動態請求經過 tomcat 中的servlet處理的

LNMT:Linux Nginx MySQL Tomcat

Client (http) --> nginx (reverse proxy)(http) --> tomcat (http connector)

location / {

proxy_pass http://tc1.magedu.com:8080;

} 轉交

location ~* \.(jsp|do)$ {

proxy_pass http://tc1.mage du.com:8080;

}

 

nginx反向代理tomcat:

反向代理:客戶端將請求發送給nginx,Nginx再將請求發送給tomcat

http段

location段:

也能夠經過動靜分離實現:

 

nginx -t :nginx配置文件的排錯命令

顯示配置文件中行號:

定義nginx集羣:經過upstream配集羣

hash:會話保持

實現LNMT的會話保持

會話保持:

(1) session sticky

基於source_ip nginx: ip_hash haproxy: source lvs: sh

基於cookie:nginx:sticky haproxy: cookie

(2) session cluster:delta session manager

(3) session server:redis(store), memcached(cache

DeltaManager會話管理器是tomcat默認的集羣會話管理器;它主要用於集羣中各個節點之間會話狀態的同步維護

全部的節點都是tomcat,當客戶端向其中一個節點發送請求時,tomcat會建立一個session,在tomcat中有一個session管理機制,經過組播,會向全部的節點發廣播,其餘節點收到廣播以後,會將這個session複製一份,存到本身的機器上。

 

 

 

基於tomcat集羣會話保持配置文件

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">

<Manager className="org.apache.catalina.ha.session.DeltaManager"

expireSessionsOnShutdown="false"

notifyListenersOnReplication="true"/>

<Channel className="org.apache.catalina.tribes.group.GroupChannel">

<MembershipclassName="org.apache.catalina.tribes.membership.McastService" address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/>

<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"

address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/>

<SenderclassName="org.apache.catalina.tribes.transport.ReplicationTransmitter">

<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>

</Sender>

<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>

<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>

</Channel>

<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter="/"/>

<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>

</Cluster>

 

基於tomcat集羣會話保持配置

一、Cluster配置:

Cluster(集羣,族) 節點,若是你要配置tomcat集羣,則須要使用此節點.

className 表示tomcat集羣時,之間相互傳遞信息使用那個類來實現信息

之間的傳遞.

channelSendOptions能夠設置爲二、四、八、10,每一個數字表明一種方式

2 = Channel.SEND_OPTIONS_USE_ACK(確認發送)

4 = Channel.SEND_OPTIONS_SYNCHRONIZED_ACK(同步發送)

8 = Channel.SEND_OPTIONS_ASYNCHRONOUS(異步發送)

在異步模式下,能夠經過加上確認發送(Acknowledge)來提升可靠性,此

時channelSendOptions設爲10

實現會話保持的代碼

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"

channelSendOptions="8">

2.Manager介紹

Manger對象用於實現HTTP會話管理的功能,Tomcat中有5種Manger的實現:

(1).StandardManager

Tomcat6的默認會話管理器,用於非集羣環境中對單個處於運行狀態的Tomcat實例會話

進行管理。當Tomcat關閉時,這些會話相關的數據會被寫入磁盤上的一個名叫

SESSION.ser的文件,並在Tomcat下次啓動時讀取此文件。

(2).PersistentManager

當一個會話長時間處於空閒狀態時會被寫入到swap會話對象,這對於內存資源比較吃緊

的應用環境來講比較有用。

 

(4).BackupManager

用於Tomcat集羣的會話管理器,與DeltaManager不一樣的是,某節點會話的改變只會同

步給集羣中的另外一個而非全部節點。

 

二、Manager配置

className-指定實現org.apache.catalina.ha.ClusterManager接口的類,信息之間的管

expireSessionsOnShutdown-設置爲true時,一個節點關閉,將致使集羣下的全部

Session失效

notifyListenersOnReplication-集羣下節點間的Session複製、刪除操做,是否通知

session listeners

<Manager className="org.apache.catalina.ha.session.DeltaManager"

expireSessionsOnShutdown="false"

notifyListenersOnReplication="true"/>

 

三、Channel介紹和配置

Channel是Tomcat節點之間進行通信的工具Channel包括4個組件:

Membership 集羣的可用節點列表

Receiver 接收器,負責接收消息

Sender 發送器,負責發送消息

Interceptor Cluster的攔截器

<Channel className="org.apache.catalina.tribes.group.GroupChannel">

 

Membership:維護集羣的可用節點列表,它能夠檢查到新增的節點,也能夠檢查到沒有心跳的節點

className-指定Membership使用的類

address-組播地址

port-組播端口

frequency-發送心跳(向組播地址發送UDP數據包)的時間間隔(單位:ms)。默認值爲500

dropTime-Membership在dropTime(單位:ms)內未收到某一節點的心跳,則將該節點從可用節點

列表刪除。默認值爲3000

注: 組播(Multicast):一個發送者和多個接收者之間實現一對多的網絡鏈接。

一個發送者同時給多個接收者傳輸相同的數據,只需複製一份相同的數據包。

它提升了數據傳送效率,減小了骨幹網絡出現擁塞的可能性

相同組播地址、端口的Tomcat節點,能夠組成集羣下的子集羣

<Membership className="org.apache.catalina.tribes.membership.McastService"

address="228.0.0.4"

port="45564"

frequency="500"

dropTime="3000"/>

 

Receiver : 接收器,負責接收消息

接收器分爲兩種:BioReceiver(阻塞式)、NioReceiver(非阻塞式)

className-指定Receiver使用的類

address-接收消息的地址

port-接收消息的端口

autoBind-端口的變化區間

若是port爲4000,autoBind爲100,接收器將在4000-4099間取一個端口,進行監聽

selectorTimeout-NioReceiver內輪詢的超時時間

maxThreads-線程池的最大線程數

<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"

address="auto"

port="4000"

autoBind="100"

selectorTimeout="5000"

maxThreads="6"/>

 

Sender : 發送器,負責發送消息

Sender內嵌了Transport組件,Transport真正負責發送消息

-->

<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">

<!--

Transport:定義傳輸方式

Transport分爲兩種:bio.PooledMultiSender(阻塞式)、nio.PooledParallelSender(非阻塞式)

<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>

</Sender>

 

Interceptor : Cluster的攔截器

TcpFailureDetector-網絡、系統比較繁忙時,Membership可能沒法及時更新可用節點列表,

此時TcpFailureDetector能夠攔截到某個節點關閉的信息,

並嘗試經過TCP鏈接到此節點,以確保此節點真正關閉,從而更新集羣能夠用節點列表

<Interceptor

className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>

MessageDispatch15Interceptor-查看Cluster組件發送消息的方式是否設置爲

Channel.SEND_OPTIONS_ASYNCHRONOUS(Cluster標籤下的channelSendOptions爲8時)。 設

置爲Channel.SEND_OPTIONS_ASYNCHRONOUS時,

MessageDispatch15Interceptor先將等待發送的消息進行排隊,而後將排好隊的消息轉給Sender

<Interceptor

className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>

ClusterListener : 監聽器,監聽Cluster組件接收的消息

使用DeltaManager時,Cluster接收的信息經過ClusterSessionListener傳遞給DeltaManager

-->

<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>

 

基於tomcat集羣會話保持測試頁面

<%@ page language="java" %>

<html>

<head><title>TomcatB</title></head>

<body>

<h1><font color="blue">TomcatB </h1>

<table align="centre" border="1">

<tr>

<td>Session ID</td>

<% session.setAttribute("abc","abc"); %>

<td><%= session.getId() %></td>

</tr>

<tr>

<td>Created on</td>

<td><%= session.getCreationTime() %></td>

</tr>

</table>

</body>

</html>

 

tomcat結合memcached實現seesion共享

Tomcat Session Server (memcached)

https://github.com/magro/memcached-session-manager

支持的session server類型:

memcached:

redis:

memcached-session-manager-2.1.1.jar

memcached-session-manager-tc7-2.1.1.jar(注意:要根據

tomcat版本下載相應的)

spymemcached-2.11.1.jar

msm-javolution-serializer-2.1.1.jar

javolution-5.4.3.1.jar

 

 

 

JVM虛擬機工做機制和優化

堆:(對象

引用類型的變量,其內存分配在堆上或者常量池(字符串常量、基本數據類型常量)

,須要經過new等方式來建立。

堆內存主要做用是存放運行時建立(new)的對象。

(主要用於存放對象,存取速度慢,能夠運行時動態分配內存,生存期不須要提早確

定)

棧:(基本數據類型變量、對象的引用變量){對象的定義內容}

基本數據類型的變量(int、short、long、byte、float、double、boolean、char等

)以及對象的引用變量 ,其內存分配在棧上,變量出了做用域就會自動釋放。

棧內存的主要做用是存放基本數據類型和引用變量。棧的內存管理是經過棧的"後進先

出"模式來實現的。

(主要用來執行程序,存取速度快,大小和生存期必須肯定,缺少靈活性)

 

Java垃圾回收器是Java虛擬機(JVM)的三個重要模塊(另外兩個是解釋器和多線程機制)

之一,爲應用程序提供內存的自動分配(Memory Allocation)、自動回收(Garbage

Collect)功能,這兩個操做都發生在Java堆上(一段內存快)。

某一個時點,一個對象若是有一個以上的引用(Rreference)指向它,那麼該對象就爲活

着的(Live),不然死亡(Dead),視爲垃圾,可被垃圾回收器回收再利用。

垃圾回收操做須要消耗CPU、線程、時間等資源,因此容易理解的是垃圾回收操做不

是實時的發生(對象死亡立刻釋放),當內存消耗完或者是達到某一個指標(Threshold,

使用內存佔總內存的比列,好比0.75)時,觸發垃圾回收操做。

有一個對象死亡的例外,java.lang.Thread類型的對象即便沒有引用,只要線程還在運

行,就不會被回收。

依據統計分析可知,Java(包括一些其它高級語言)裏面大多數對象生命週期都是短暫的

,因此把Java內存分代管理分代的目的無非就是爲不一樣代的內存塊運用不一樣的管理

策略(算法),從而最大化性能。相對於年老代,一般年輕代要小不少,回收的頻率高,

速度快年老代則回收頻率低,耗時長內存在年輕代裏面分配,年輕代裏面的對象

通過多個回收週期依然存活的會自動晉升到年老代。

 

垃圾回收的類型

全部的回收器類型都是基於分代技術。Java HotSpot虛擬機包含三代,年輕代(Young

Generation)、年老代(Old Generation)、永久代(Permanent Generation)。

永久代

存儲類、方法以及它們的描述信息。能夠經過-XX:PermSize=64m和-

XX:MaxPermSize=128m兩個可選項指定初始大小和最大值。一般 咱們不須要調節該

參數,默認的永久代大小足夠了,不過若是加載的類很是多,不夠用了,調節最大值

便可。

年老代

主要存儲年輕代中通過多個回收週期仍然存活從而升級的對象,固然對於一些大的內

存分配,可能也直接分配到永久代(一個極端的例子是年輕代根本就存不下)。

年輕代

絕大多數的內存分配回收動做都發生在年輕代。以下圖所示, 年輕代被劃分爲三個區域

原始區(Eden)和兩個小的存活區(Survivor),兩個存活區按功能分爲From和To。絕

大多數的對象都在原始區分配,超過一個垃圾回收操做仍然存活的對象放到存活區

JAVA虛擬機垃圾回收機制

Minor GC

從年輕代空間(包括 Eden 和 Survivor 區域)回收內存被稱爲 Minor GC。這必定義

既清晰又易於理解。可是,當發生Minor GC事件的時候,

當 JVM 沒法爲一個新的對象分配空間時會觸發 Minor GC,好比當 Eden 區滿了。所

以分配率越高,越頻繁執行 Minor GC。

全部的 Minor GC 都會觸發"全世界的暫停(stop-the-world)"即中止應用程序的線程。

 

Major GC vs Full GC

指發生在老年代的 GC,出現了 Major GC,常常

會伴隨至少一次的 Minor GC 。MajorGC 的速度通常會比 Minor GC 慢 10

倍以上。

當發生Full GC時,也會觸發"全世界的暫停(stop-the-world)"即中止應用程序的

線程。而且持續時間長。

 

大GC和小GC:

小GC一個JAVA程序,當一個請求須要NEW一個對象時,須要去新生代中的原始區申請空間,發現滿了,就會啓動垃圾回收機制,回收年輕代中的存活區,若是發現好幾回回收不上來,就會將其轉到老年代。

大GC:經過小GC垃圾回收機制,轉移到大老年代後,若是老年代滿了,就會啓動大GC

 

JVM經常使用的分析工具:

jps: jps主要用來輸出JVM中運行的進程狀態信息

jinfo:查看進程的運行環境參數,主要是jvm命令行參數; (能夠查看不少信息結構,主要是排查路徑,變量,操做系統,老年代,新生代大小等有什麼錯誤)

jstat:對jvm應用程序的資源和性能進行實時監控;

jstack:查看全部線程的運行狀態;

jmap:查看jvm佔用物理內存的狀態

jps:Java virutal machine Process Status tool,jps [-q] [-mlvV] [<hostid>]

-q:靜默模式;

-v:顯示傳遞給jvm的命令行參數;

-m:輸出傳入main方法的參數;

-l:輸出main類或jar徹底限定名稱;

-V:顯示經過flag文件傳遞給jvm的參數;

[<hostid>]:主機id,默認爲localhost;

 

jinfo:輸出給定的java進程的全部配置信息;主要查看環境變量

jinfo [option] <pid>

-flags:to print VM flags

 

Tomcat排錯三劍客工具:

jstack:查看指定的java進程的線程棧的相關信息;(重要的排錯工具)jmap:Memory Map, 用於查看堆內存的使用狀態;(重要的排錯工具)

jstat:輸出指定的java進程的統計信息(重要 的排錯工具)

主要查看:

jstack [-l] <pid>

jstack -F [-m] [-l] <pid>

-l:long listings,會顯示額外的鎖信息,所以,發生死鎖時經常使用此選項;好比block

-m:混合模式,既輸出java堆棧信息,也輸出C/C++堆棧信息;好比在什麼地理位置存了什麼東西

-F:當使用"jstack -l PID"無響應,可使用-F強制輸出信息

Htop:能夠抓一個JAVA線程來看系統使用狀況;能夠查看哪一個線程是否有異常

 

 

jstat:輸出指定的java進程的統計信息(重要 的排錯工具)

jstat -help|-options

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

# jstat -options

-class:class loader 類加載統計

-compiler:JIT 編譯統計

-gc:gc

-gcnew:新生代

-gcold:老年代

-printcompilation JVM編譯方法統計

[<interval> [<count>]]

interval:時間間隔,單位是毫秒;

count:顯示的次數;

 

設置1秒顯示1000次

 

 

jmap:Memory Map, 用於查看堆內存的使用狀態;(重要的排錯工具)

這個命令主要用於JAVA開發工做中發現程序很卡,會讓運維打印出來內存的使用狀況

這個命令從內存中查看打印對象內容的詳細信息很是消耗資源,在生產環境中不要隨便用

jmap [option] <pid>

查看堆空間的詳細信息:

jmap -heap <pid>

查看堆內存中的對象的數目:

jmap -histo <pid>

live:只統計活動對象;

保存堆內存數據至文件中,然後使用jvisualvm或jhat進行查看:

jmap -dump:<dump-options> <pid>

dump-options:

live dump only live objects; if not specified, all objects in the heap are

dumped.

format=b binary format

file=<file> dump heap to <file>

jmap -dump:format=b,file=dumpFileName

 

若是tomcat出現問題能夠從如下幾方面着手查看:

首先查看服務和如下幾點:

tomcat優化可從三方面着手:

一、架構層面

二、tomcat配置文件設置(併發)能夠去共享線程池調節數據大小,通常把最大線程數改爲平常峯值的2倍 最大空閒時間等

三、tomcat對業務場景的內存定製

 

Tomcat配置文件優化

tomcat優化

1、配置文件參數優化

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"

maxThreads="500" minSpareThreads="20" maxSpareThreads="50"

maxIdleTime="60000"/>

maxThreads :Tomcat 使用線程來處理接收的每一個請求,這個值表示 Tomcat 可建立的最大的線程

數,默認值是 200

minSpareThreads:最小空閒線程數,Tomcat 啓動時的初始化的線程數,表示即便沒有人使用也

開這麼多空線程等待,默認值是 10。

maxSpareThreads:最大備用線程數,一旦建立的線程超過這個值,Tomcat 就會關閉再也不須要

的 socket 線程。

maxIdleTime: 最大空閒時間

 

tomcat優化

1、配置文件參數優化

<Connector executor="tomcatThreadPool"

port="8080" protocol="HTTP/1.1"

URIEncoding="UTF-8"

connectionTimeout="30000" #鏈接超時時間

enableLookups="false" #是否啓用dns解析,建議禁用;

connectionUploadTimeout="150000" #上傳最大超時時間

acceptCount="300" #等待隊列的最大長度; 默認爲100個。

keepAliveTimeout="120000" #長鏈接保持時間

maxKeepAliveRequests="500" # 每一個TCP鏈接接受最大的Http請求數目,當處理一個

keep alive請求達到這個最大值,Tomcat關閉這個鏈接

compression="on" #是否啓用傳輸壓縮機制,建議"on";

compressionMinSize="2048" #啓用壓縮傳輸的數據流最小值,單位是字節

compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,i

mage/jpg,image/png" 定義啓用壓縮功能的MIME類型;

redirectPort="8443" />

 

2、tomcat啓動參數優化

Tomcat 啓動命令行中的優化參數,就是 JVM 的優化 。Tomcat 首先跑在 JVM 之上的,由於它

的啓動其實也只是一個 java 命令行,首先咱們須要對這個 JAVA 的啓動命令行進行調優。無論是

YGC 仍是 Full GC,GC 過程當中都會對致使程序運行中中斷,正確的選擇不一樣的 GC 策略,調整

JVM、GC 的參數,能夠極大的減小因爲 GC 工做,而致使的程序運行中斷方面的問題,進而適當

的提升 Java 程序的工做效率。可是調整 GC 是以個極爲複雜的過程,因爲各個程序具有不一樣的特

點,如:web 和 GUI 程序就有很大區別(Web能夠適當的停頓,但GUI停頓是客戶沒法接受的)

,並且因爲跑在各個機器上的配置不一樣(主要 cup 個數,內存不一樣),因此使用的 GC 種類也會

不一樣。

CATALINA_OPTS:用於當 Java 運行時選項"start"或"run"命令執行。

CATALINA_OPTS=" -server -verbose:gc -XX:+PrintGCTimeStamps -Xms1024m -

Xmx1024m -XX:NewSize=341m -XX:MaxNewSize=341m -XX:SurvivorRatio=2 -

XX:PermSize=128m -XX:MaxPermSize=128m -XX:ThreadStackSize=512"

 

2、tomcat啓動參數優化

CATALINA_OPTS=" -server -verbose:gc -Xms1024m -Xmx1024m -XX:NewSize=341m -

XX:MaxNewSize=341m -XX:NewRatio=2 -XX:PermSize=128m -XX:MaxPermSize=128m -

XX:ThreadStackSize=512" 將這串代碼加入到配置文件中,增長性能

-server 進入服務器模式,可提高運行時性能和內存管理效率很高

-verbose:gc - 輸出GC詳細信息,能夠了解這些垃圾收集發生的狀況 便於排錯

-Xms:表示 Java 初始化堆的大小,-Xms 與-Xmx 設成同樣的值,避免 JVM 反覆從新申請內存

-Xmx:表示最大 Java 堆大小,當應用程序須要的內存超出堆的最大值時虛擬機就會提示內存溢出

,而且致使應用服務崩潰,所以通常建議堆的最大值設置爲可用內存的最大值的80%。

OOM:內存泄漏;當內存用的過大時,會發生OOM內存泄漏狀況,會強行把這個進程殺死

-XX:NewSize:設置新生代內存大小。

-XX:MaxNewSize:設置最大新生代新生代內存大小

-XX:PermSize:設置持久代內存大小

-XX:MaxPermSize:設置最大值持久代內存大小

-XX:NewRatio=2:設置年輕代(包括1個Eden和2個Survivor區)與年老代的比值。表示年輕代

比年老代爲1:2。

 

tomcat企業常見面試題

一、tomcat是什麼?

servlet容器,三部分組成:web server ; servlet容器 ;jsp容器

工做原理:處理servlet容器動態請求,經過tomcat加載,把servlet容器動態請求進行編譯處理,而後交給JPM,翻譯成機器碼。

 

二、什麼是GC,工做機制是什麼?

三、tomcat如何實現session共享?

三種方式

四、如何進行tomcat優化?

五、jsp網站出了問題,該如何排錯?

學會看日誌

JAVA排錯工具三劍客

六、tomcat的server.xml配置文件結構是怎樣的?

server service connecter 引擎 host conseat

七、網站war包如何進行部署?

八、說說你經常使用的java排錯工具備哪些?

jstack:查看指定的java進程的線程棧的相關信息;(重要的排錯工具)jmap:Memory Map, 用於查看堆內存的使用狀態;(重要的排錯工具)

jstat:輸出指定的java進程的統計信息(重要 的排錯工具)