-
編程語言:
- 硬件級:微碼編程,匯編語言
- 系統級:C,C++,…
- 應用級:Java, PHP, Python, Ruby, Perl, C#, …
-
程序:指令+數據
- 過程式編程:以指令為中心,數據服務于代碼;
- 對象式編程:以數據為中心,指令服務于數據;
java
-
Java代碼的運行:
*.java(source code) –> javac –> *.class(bytecode)
jvm:class loader,加載程序的類文件,及程序的類文件依賴到的其它的類文件而后運行; 整個運行表現為一個jvm進程; -
java技術體系
- Java編程語言
- Java Class文件格式
- Java API
-
Java VM
- class loader
- 執行引擎
-
JVM運行時區域:
- 方法區:線程共享; 用于存儲被JVM加載的class信息、常量、靜態變量、方法等;
- 堆:是jvm所管理的內存中占用空間最大的一部分;也是GC管理的主要區域;存儲對象;
- Java棧:線程私有,存儲 線程自己的局部變量;
- PC寄存器:線程私有的內存空間,程序的指令指針;
- 本地方法棧
-
安裝JDK
-
了解當前的java環境:
~]# java -version -
OpenJDK:
-
java-VERSION-openjdk:
The OpenJDK runtime environment. -
java-VERSION-openjdk-headless:
The OpenJDK runtime environment without audio and video support. -
java-VERSION-openjdk-devel:
The OpenJDK development tools.注意:多版本并存時,可使用 alternatives命令設定默認使用的版本;
-
java-VERSION-openjdk:
-
Oracle JDK:
-
安裝相應版本的rpm包;jdk-VERSION-OS-ARCH.rpm
示例:jdk-1.8.0_25-linux-x64.rpm
注意:安裝完成后,要配置JAVA_HOME環境變量,指向java的安裝路徑;
OpenJDK: JAVA_HOME=/usr Oracle JDK: JAVA_HOME=/usr/java/jdk_VERSION 示例: /etc/profile.d/java.sh export JAVA_HOME=/usr/java/latest export PATH=$JAVA_HOME/bin:$PATH
-
-
-
Java 2 EE:
-
Servlet:
- 類庫;web app;
- Servlet container, Servlet Engine
-
JSP: Java Server Page
<html> <title>TITLE</title> <body> <h1>...</h1> <% ... java code... %> </body> </html>
-
jsp文件的實現過程:index.jsp –> (jasper) –> index.java –> (javac) –> index.class –> jvm(engine)
注意:基于jasper將靜態輸出的數據轉為java代碼進行輸出,結果為servlet規范的代碼;
-
JSP Container:JSP + Servlet Container
-
商業實現:
WebSphere, WebLogic, Oc4j, Glassfish, Geronimo, JOnAS, JBoss, … -
開源實現:
Tomcat, Jetty, Resin, …
Tomcat: Java 2 EE技術體系的不完整實現;
-
商業實現:
-
Servlet:
Tomcat
-
安裝Tomcat:
-
Base Repo:
tomcat, tomcat-lib, tomcat-admin-webapps, tomcat-webapps, tomcat-docs-webapp
-
Tomcat binary release
# tar xf apache-tomcat-VERSION.tar.gz -C /usr/local/ # cd /usr/local # ln -sv apache-tomcat-VERSION tomcat /etc/profile.d/tomcat.sh export CATALINA_BASE=/usr/local/tomcat export PATH=$CATALINA_BASE/bin:$PATH . /etc/profile.d/tomcat.sh
-
Base Repo:
-
tomcat程序環境:
-
解壓安裝tomcat
tomcat的目錄結構 bin:腳本,及啟動時用到的類; conf:配置文件目錄; lib:庫文件,Java類庫,jar; logs:日志文件目錄; temp:臨時文件目錄; webapps:webapp的默認目錄; work:工作目錄;
-
/tomcat/bin/catalina.sh
~]# catalina.sh --help debug Start Catalina in a debugger debug -security Debug Catalina with a security manager jpda start Start Catalina under JPDA debugger run Start Catalina in the current window run -security Start in the current window with security manager start Start Catalina in a separate window start -security Start in a separate window with security manager stop Stop Catalina, waiting up to 5 seconds for the process to end stop n Stop Catalina, waiting up to n seconds for the process to end stop -force Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running stop n -force Stop Catalina, wait up to n seconds and then use kill -KILL if still running configtest Run a basic syntax check on server.xml - check exit code for result version What version of tomcat are you running?
-
/tomcat/bin/catalina.sh
-
rpm包安裝的程序環境:
-
配置文件目錄:/etc/tomcat
- 主配置文件:server.xml
-
webapps存放位置:/var/lib/tomcat/webapps/
examples manager host-manager docs
- Unit File:tomcat.service
- 環境配置文件:/etc/sysconfig/tomcat
-
配置文件目錄:/etc/tomcat
-
tomcat的配置文件構成:
- server.xml:主配置文件;
- web.xml:每個webapp只有“部署”后才能被訪問,它的部署方式通常由web.xml進行定義,其存放位置為WEB-INF/目錄中;此文件為所有的webapps提供默認部署相關的配置;
- context.xml:每個webapp都可以專用的配置文件,它通常由專用的配置文件context.xml來定義,其存放位置為WEB-INF/目錄中;此文件為所有的webapps提供默認配置;
- tomcat-users.xml:用戶認證的賬號和密碼文件;
- catalina.policy:當使用-security選項啟動tomcat時,用于為tomcat設置安全策略;
- catalina.properties:Java屬性的定義文件,用于設定類加載器路徑,以及一些與JVM調優相關參數;
- logging.properties:日志系統相關的配置;
-
Tomcat的核心組件:server.xml
<Server> ... </Server> ... <Server> <Service> ... </Service> ... <Service> <connector/> <connector/> ... <Engine> <Host> <Context/> <Context/> ... </Host> <Host> ... </Host> ... </Engine> </Service> </Server>
-
每一個組件都由一個Java“類”實現,這些組件大體可分為以下幾個類型:
頂級組件:Server
服務類組件:Service
連接器組件:http, https, ajp(apache jserv protocol)
容器類:Engine, Host, Context
被嵌套類:valve, logger, realm, loader, manager, …
集群類組件:listener, cluster, …
-
每一個組件都由一個Java“類”實現,這些組件大體可分為以下幾個類型:
-
JSP WebAPP的組織結構
/: webapps的根目錄 index.jsp:主頁; WEB-INF/:當前webapp的私有資源路徑;通常用于存儲當前webapp的web.xml和context.xml配置文件; META-INF/:類似于WEB-INF/; classes/:類文件,當前webapp所提供的類; lib/:類文件,當前webapp所提供的類,被打包為jar格式;
-
webapp歸檔格式:
-
.war:webapp
.jar:EJB的類打包文件;
.rar:資源適配器類打包文件;
.ear:企業級webapp;
-
.war:webapp
-
-
部署(deploy)webapp的相關操作:
-
deploy:將webapp的源文件放置于目標目錄(網頁程序文件存放目錄),配置tomcat服務器能夠基于web.xml和context.xml文件中定義的路徑來訪問此webapp;將其特有的類和依賴的類通過class loader裝載至JVM;
-
自動部署:auto deploy
手動部署:- 冷部署:把webapp復制到指定的位置,而后才啟動tomcat;
-
熱部署:在不停止tomcat的前提下進行部署;
部署工具:manager、ant腳本、tcd(tomcat client deployer)等;
-
自動部署:auto deploy
- undeploy:反部署,停止webapp,并從tomcat實例上卸載webapp;
- start:啟動處于停止狀態的webapp;
- stop:停止webapp,不再向用戶提供服務;其類依然在jvm上;
- redeploy:重新部署;
-
deploy:將webapp的源文件放置于目標目錄(網頁程序文件存放目錄),配置tomcat服務器能夠基于web.xml和context.xml文件中定義的路徑來訪問此webapp;將其特有的類和依賴的類通過class loader裝載至JVM;
-
手動提供一測試類應用,并冷部署:
~]# mkidr -pv /usr/local/tomcat/webapps/test/{classes,lib,WEB-INF}
創建文件/usr/local/tomcat/webapps/test/index.jsp<%@ page language="java" %> <%@ page import="java.util.*" %> <html> <head> <title>Test Page</title> </head> <body> <% out.println("hello world"); %> </body> </html>
-
tomcat的兩個管理應用:
-
manager
host-manager
-
manager
-
tomcat的常用組件配置:
-
Server:代表tomcat instance,即表現出的一個java進程;監聽在8005端口,只接收“SHUTDOWN”。各server監聽的端口不能相同,因此,在同一物理主機啟動多個實例時,需要修改其監聽端口為不同的端口;
-
Service:用于實現將一個或多個connector組件關聯至一個engine組件;
-
Connector組件:
-
負責接收請求,常見的有三類http/https/ajp;
-
進入tomcat的請求可分為兩類:
- standalone : 請求來自于客戶端瀏覽器;
-
由其它的web server反代:來自前端的反代服務器;
nginx --> http connector --> tomcat httpd(proxy_http_module) --> http connector --> tomcat httpd(proxy_ajp_module) --> ajp connector --> tomcat httpd(mod_jk) --> ajp connector --> tomcat
-
屬性:
port="8080" protocol="HTTP/1.1" connectionTimeout="20000" address:監聽的IP地址;默認為本機所有可用地址; maxThreads:最大并發連接數,默認為200; enableLookups:是否啟用DNS查詢功能; acceptCount:等待隊列的最大長度; secure: sslProtocol:
-
-
Engine組件:Servlet實例,即servlet引擎,其內部可以一個或多個host組件來定義站點; 通常需要通過defaultHost來定義默認的虛擬主機;
-
屬性:
name= defaultHost="localhost" jvmRoute=
-
屬性:
-
Host組件:位于engine內部用于接收請求并進行相應處理的主機或虛擬主機,
示例:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> </Host>
-
常用屬性說明:
- appBase:此Host的webapps的默認存放目錄,指存放非歸檔的web應用程序的目錄或歸檔的WAR文件目錄路徑;可以使用基于$CATALINA_BASE變量所定義的路徑的相對路徑;
- autoDeploy:在Tomcat處于運行狀態時,將某webapp放置于appBase所定義的目錄中時,是否自動將其部署至tomcat;
-
示例:
<Host name="tc1.magedu.com" appBase="/appdata/webapps" unpackWARs="true" autoDeploy="true"> </Host> ~]# mkdir -pv /appdata/webapps ~]# mkdir -pv /appdata/webapps/ROOT/{lib,classes,WEB-INF} 提供一個測試頁即可;
-
-
Context組件:
-
示例:
<Context path=”/PATH” docBase=”/PATH/TO/SOMEDIR” reloadable=””/>
-
示例:
-
Valve組件:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %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″/>
-
-
綜合示例:
<Host name="node1.magedu.com" appBase="/web/apps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="node1_access" suffix=".log" pattern="%h %l %u %t "%r" %s %b" /> <Context path="/test" docBase="test" reloadable=""> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="node1_test_access_" suffix=".log" pattern="%h %l %u %t "%r" %s %b" /> </Context> </Host>
-
會話保持:
-
session sticky
-
source_ip
-
nginx: ip_hash
haproxy: source
lvs: sh
-
nginx: ip_hash
-
cookie:
-
nginx:hash
haproxy: cookie
-
nginx:hash
-
source_ip
- session cluster:delta session manager
-
session server:redis(store), memcached(cache)
-
Tomcat Cluster(session)
- session sticky
-
session cluster
tomcat delta manager -
session server
memcached -
Tomcat Cluster
-
httpd + tomcat cluster
httpd: mod_proxy, mod_proxy_http, mod_proxy_balancer
tomcat cluster:http connector -
httpd + tomcat cluster
httpd: mod_proxy, mod_proxy_ajp, mod_proxy_balancer
tomcat cluster:ajp connector -
httpd + tomcat cluster
httpd: mod_jk
tomcat cluster:ajp connector - nginx + tomcat cluster
-
httpd + tomcat cluster
-
BalancerMember:
BalancerMember [balancerurl] url [key=value [key=value …]]-
status:
D: Worker is disabled and will not accept any requests. S: Worker is administratively stopped. I: Worker is in ignore-errors mode and will always be considered available. H: Worker is in hot-standby mode and will only be used if no other viable workers are available. E: Worker is in an error state. N: Worker is in drain mode and will only accept existing sticky sessions destined for itself and ignore all other requests.
- loadfactor:負載因子,即權重;
-
lbmethod
Balancer load-balance method. Select the load-balancing scheduler method to use. Either byrequests, to perform weighted request counting; bytraffic, to perform weighted traffic byte count balancing; or bybusyness, to perform pending request balancing. The default is byrequests.
-
stickysession
Balancer sticky session name. The value is usually set to something like JSESSIONID or PHPSESSIONID, and it depends on the backend application server that support sessions. If the backend application server uses different name for cookies and url encoded id (like servlet containers) use | to separate them. The first part is for the cookie the second for the path. Available in Apache HTTP Server 2.4.4 and later.
-
status:
-
httpd使用第三方模塊:以mod_jk為例進行說明,(mod_jk沒有rpm包得編譯安裝)
-
安裝httpd-devel和gcc(可安裝development tools)
-
編譯安裝模塊:
關鍵指明httpd的apxs文件的位置,apxs是為httpd安裝第三方模塊提供的一個對接接口.
–with-apxs示例:
~]# which apxs /usr/bin/apxs ~]# ./configure --with-apxs=/usr/bin/apxs make & make install
-
使用模塊:(編輯配置文件)
示例:
vi /etc/httpd/conf.modules.d/mod_jk.conf loadModule jk_module /usr/lib64/httpd/modules/mod_jk.so
-
-
Tomcat Session Server (memcached)
-
支持的session server類型:
-
memcached
couchbase
redis
-
memcached
-
memcached:
memcached is a high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load.-
緩存服務器:
- 緩存:cache,無持久存儲功能;
- bypass緩存
- k/v cache,僅支持存儲流式化數據;
- 旁掛式緩存;
-
特性:
- k/v cache:僅可存儲可序列化數據;value:最大不能超過1兆;存儲項:k/v;
- 智能性一半依賴于客戶端(調用memcached的API開發程序),一半依賴于服務端;
-
分布式緩存:互不通信的分布式集群;
分布式系統請求路由方法:取模法,一致性哈希算法; - 算法復雜度:O(1)
-
清理過期緩存項:
- 緩存耗盡:LRU
- 緩存項過期:惰性清理機制
-
安裝配置:
-
監聽的端口:
11211/tcp, 11211/udp -
主程序:/usr/bin/memcached
- 配置文件:/etc/sysconfig/memcached
-
Unit File:/usr/lib/systemd/system/memcached.service
-
協議格式:memcached協議
- 文本格式
- 二進制格式
-
命令:
- 統計類:stats, stats items, stats slabs, stats sizes
-
存儲類:set, add, replace, append, prepend
- 命令格式:<command name> <key> <flags> <exptime> <bytes> <cas unique>
- 檢索類:get, delete, incr/decr
-
清空:flush_all
-
示例
telnet> add KEY <flags> <expiretime> <bytes> \r telnet> VALUE
-
memcached程序的常用選項:
-m <num>:Use <num> MB memory max to use for object storage; the default is 64 megabytes. -c <num>:Use <num> max simultaneous connections; the default is 1024. -u <username>:以指定的用戶身份來運行進程; -l <ip_addr>:監聽的IP地址,默認為本機所有地址; -p <num>:監聽的TCP端口, the default is port 11211. -U <num>:Listen on UDP port <num>, the default is port 11211, 0 is off. -M:內存耗盡時,不執行LRU清理緩存,而是拒絕存入新的緩存項,直到有多余的空間可用時為止; -f <factor>:增長因子;默認是1.25; -t <threads>:啟動的用于響應用戶請求的線程數;
-
memcached默認沒有認證機制,可借用于SASL進行認證;
- SASL:Simple Authentication Secure Layer
-
API:
php-pecl-memcache php-pecl-memcached python-memcached libmemcached libmemcached-devel
-
命令行工具:
memcached-tool SERVER:PORT COMMAND
-
-
-
-
Tomcat的常用優化配置:
-
內存空間:
/etc/sysconfig/tomcat JAVA_OPTS="-server -Xms32g -Xmx32g -XX:NewSize= -XX:MaxNewSize= -XX:PermSize= -XX:MaxPermSize=" -server:服務器模型 -Xms:堆內存初始化大??; -Xmx:堆內存空間上限; -XX:NewSize=:新生代空間初始化大小; -XX:MaxNewSize=:新生代空間最大值; -XX:PermSize=:持久代空間初始化大??; -XX:MaxPermSize=:持久代空間最大值;
-
線程池設置:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 常用屬性: maxThreads:最大線程數; minSpareThreads:最小空閑線程數; maxSpareThreads:最大空閑線程數; acceptCount:等待隊列的最大長度; URIEncoding:URI地址編碼格式,建議使用UTF-8; enableLookups:是否啟用dns解析,建議禁用; compression:是否啟用傳輸壓縮機制,建議“on"; compressionMinSize:啟用壓縮傳輸的數據流最小值,單位是字節; compressableMimeType:定義啟用壓縮功能的MIME類型; text/html, text/xml, text/css, text/javascript
-
禁用8005端口;
<Server port=”-1″ shutdown=”SHUTDOWN”> -
隱藏版本信息:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> Server="SOME STRING"
-
內存空間:
-
JVM常用的分析工具:
jps:用來查看運行的所有jvm進程; jinfo:查看進程的運行環境參數,主要是jvm命令行參數; jstat:對jvm應用程序的資源和性能進行實時監控; jstack:查看所有線程的運行狀態; jmap:查看jvm占用物理內存的狀態; jconsole jvisualvm
-
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 -sysprops:to print Java system properties -flag <name>:to print the value of the named VM flag
-
jstack:查看指定的java進程的線程棧的相關信息;
jstack [-l] <pid> jstack -F [-m] [-l] <pid> -l:long listings,會顯示額外的鎖信息,因此,發生死鎖時常用此選項; -m:混合模式,既輸出java堆棧信息,也輸出C/C++堆棧信息; -F:當使用“jstack -l PID"無響應,可以使用-F強制輸出信息;
-
jstat:輸出指定的java進程的統計信息
jstat -help|-options
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]-
~]# jstat -options
-class:class loader -compiler:JIT -gc:gc -gccapacity:統計堆中各代的容量 -gccause: -gcmetacapacity -gcnew:新生代 -gcnewcapacity -gcold:老年代 -gcoldcapacity -gcutil -printcompilation
-
[<interval> [<count>]]
-
interval:時間間隔,單位是毫秒;
count:顯示的次數;
-
interval:時間間隔,單位是毫秒;
-
-gc:
-
YGC:新生代的垃圾回收次數;
YGCT:新生代垃圾回收消耗的時長;
FGC:Full GC的次數;
FGCT:Full GC消耗的時長;
GCT:GC消耗的總時長;
-
YGC:新生代的垃圾回收次數;
-
~]# jstat -options
-
jmap:Memory Map, 用于查看堆內存的使用狀態;
-
jhat:Java Heap Analysis Tool
jmap [option] <pid>-
查看堆空間的詳細信息:
jmap -heap <pid> -
查看堆內存中的對象的數目:
jmap -histo[:live] <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>
-
-
jps:Java virutal machine Process Status tool,
原創文章,作者:s,如若轉載,請注明出處:http://www.www58058.com/79380