一 WEB技術
1.1 HTTP協議和B/S 結構
1.2 前端三大核心技術
1.2.1 HTML
- 超文本需要顯示,就得有軟件能夠呈現超文本定義的排版格式,例如顯示:圖片、表格,顯示字體的大小、顏色,這個軟件就是瀏覽器。
- HTML由一個個的標簽(標記)組成,這些標簽各司其職,有的提供網頁信息,有的負責文字,有的負責圖片,有的負責網頁布局,所以一個HTML文件,是由格式標簽和數據組成。
- HTML(HyperText Markup Language)超文本標記語言,它不同于一般的編程語言。超文本即超出純文本的范疇,例如:描述文本顏色、大小、字體等信息,或使用圖片、音頻、視頻等非文本內容。
- 超文本的誕生是為了解決純文本不能格式顯示的問題,是為了好看,但是只有通過網絡才能分享超文本的內容,所以制定了HTTP協議。
1.2.2 CSS(Cascading Style Sheets)層疊樣式表
- HTML本身為了格式化顯示文本,但是當網頁呈現大家面前的時候,需求HTML提供更多樣式能力。這使得HTML變得越來越臃腫。這促使了CSS的誕生。
- CSS 3采用了模塊化思想,每個模塊都在CSS 2基礎上分別增強功能。所以,這些模塊是陸續發布的。
- 不同廠家的瀏覽器使用的引擎,對CSS的支持不一樣,導致網頁布局、樣式在不同瀏覽器不一樣。因此, 想要保證不同用戶使用不同瀏覽器看到的網頁效果一直非常困難。
1.2.3 JavaScript
二 WEB框架
2.1 web資源和訪問
2.2 后臺應用架構
2.2.1 單體架構
- 傳統架構(單機系統),一個項目一個工程:比如商品、訂單、支付、庫存、登錄、注冊等等,統一部署,一個進程
- all in one的架構方式,把所有的功能單元放在一個應用里。然后把整個應用部署到一臺服務器上。
- 如果負載能力不行,將整個應用進行水平復制,進行擴展,然后通過負載均衡實現訪問。
- Java實現:JSP、Servlet,打包成一個jar、war部署易于開發和測試:也十分方便部署;當需要擴展時,只需要將war復制多份,然后放到多個服務器上,再做個負載均衡就可以了。
- 如果某個功能模塊出問題,有可能全站不可訪問,修改Bug后、某模塊功能修改或升級后,需要停掉整個服務,重新整體重新打包、部署這個應用war包,功能模塊相互之間耦合度高,相互影響,不適合當今互聯網業務功能的快速迭代。
- 特別是對于一個大型應用,我們不可能吧所有內容都放在一個應用里面,我們如何維護、如何分工合作都是問題。如果項目龐大,管理難度大
- web應用服務器:開源的tomcat、jetty、glassfish。商用的有weblogic、websphere、Jboss
2.2.2 微服務
- 屬于SOA(Service Oriented Architecture)的子集
- 微服務化的核心就是將傳統的一站式應用,根據業務拆分成一個一個的服務,徹底去掉耦合,每一個微服務提供單個業務功能,一個服務只做一件事。每個服務都圍繞著具體業務進行構建,并且能夠被獨立地部署到生產環境、類生產環境等
- 從技術角度講就是一種小而獨立的處理過程,類似與進程的概念,能夠自行單獨啟動或銷毀
- 微服務架構(分布式系統),各個模塊/服務,各自獨立出來,"讓專業的人干專業的事",獨立部署。分布式系統中,不同的服務可以使用各自獨立的數據庫。
- 服務之間采用輕量級的通信機制(通常是基于HTTP的RESTful API)。
- 微服務設計的思想改變了原有的企業研發團隊組織架構。傳統的研發組織架構是水平架構,前端、后端、DBA、測試分別有自己對應的團隊,屬于水平團隊組織架構。而微服務的設計思想對團隊的劃分有著一定的影響,使得團隊組織架構的劃分更傾向于垂直架構,比如用戶業務是一個團隊來負責,支付業務是一個團隊來負責。但實際上在企業中并不會把團隊組織架構拆分得這么絕對,垂直架構只是一種理想的架構
- 微服務的實現框架有多種,不同的應用架構,部署方式也有不同
2.2.3 單體架構和微服務比較

- 每個服務足夠內聚,足夠小,代碼容易理解。這樣能聚焦一個只當的業務功能或業務需求。
- 開發簡單、開發效率提高,一個服務可能就是專業的只干一件事,微服務能夠被小團隊單獨開發,這個小團隊可以是2到5人的開發人員組成
- 微服務是松耦合的,是有功能意義的服務,無論是在開發階段或部署階段都是獨立的。
- 微服務能使用不同的語言開發
- 易于和第三方集成,微服務運行容易且靈活的方式集成自動部署,通過持續集成工具,如:
- Jenkins、Hudson、Bamboo
- 微服務易于被一個開發人員理解、修改和維護,這樣小團隊能夠更關注自己的工作成果,無需通過合作才能體現價值
- 微服務允許你利用融合最新技術。微服務只是業務邏輯的代碼,不會和HTML/CSS或其他界面組件混合,即前后端分離
- 每個微服務都有自己的存儲能力,可以有自己的數據庫,也可以有統一數據庫
- 微服務把原有的一個項目拆分成多個獨立工程,增加了開發、測試、運維、監控等的復雜度
- 微服務架構需要保證不同服務之間的數據一致性,引入了分布式事務和異步補償機制,為設計和開發帶來一定挑戰
- 開發人員和運維需要處理分布式系統的復雜性,需要更強的技術能力
- 微服務適用于復雜的大系統,對于小型應用使用微服務,進行盲目的拆分只會增加其維護和開發成本
- 阿里開源貢獻給了ASF,目前已經是Apache的頂級項目
- 一款高性能的Java RPC服務框架,微服務生態體系中的一個重要組件
- 將單體程序分解成多個功能服務模塊,模塊間使用Dubbo框架提供的高性能RPC通信
- 內部協調使用Zookeeper,實現服務注冊、服務發現和服務治理
- 一個完整的微服務解決方案,相當于Dubbo的超集
- 微服務框架,將單體應用拆分為粒度更小的單一功能服務
- 基于HTTP協議的REST(Representational State Transfer 表述性狀態轉移)風格實現模塊間通信
三 tomcat的功能介紹
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
- LAMT:Linux + Apache(Httpd)+ MySQL + Tomcat
- 前置一臺Nginx,給多臺Tomcat實例做反向代理和負載均衡調度,Tomcat上部署的純動態頁面更適合
- LNMT:Linux + Nginx + MySQL + Tomcat
- 多級代理
- LNNMT:Linux + Nginx + Nginx + MySQL + Tomcat
4.2 利用 nginx 反向代理實現
利用nginx反向代理功能,實現圖中的代理功能,將用戶請求全部轉發至指定的同一個tomcat主機
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
location ~ \.jsp$ {
proxy_pass http://172.25.254.10:8080;
}
4.3 實現tomcat中的負載均衡
4.3.1 HTTP的無狀態,有連接和短連接
- 無狀態:指的是服務器端無法知道2次請求之間的聯系,即使是前后2次請求來自同一個瀏覽器,也沒有任何數據能夠判斷出是同一個瀏覽器的請求。后來可以通過cookie、session機制來判斷。
- 瀏覽器端第一次HTTP請求服務器端時,在服務器端使用session這種技術,就可以在服務器端
- 產生一個隨機值即SessionID發給瀏覽器端,瀏覽器端收到后會保持這個SessionID在Cookie當中,這個Cookie值一般不能持久存儲,瀏覽器關閉就消失。瀏覽器在每一次提交HTTP請求的時候會把這個SessionID傳給服務器端,服務器端就可以通過比對知道是誰了
- Session通常會保存在服務器端內存中,如果沒有持久化,則易丟失
- Session會定時過期。過期后瀏覽器如果再訪問,服務端發現沒有此ID,將給瀏覽器端重新發新的SessionID
- 有連接:是因為它基于TCP協議,是面向連接的,需要3次握手、4次斷開
- 短連接:Http 1.1之前,都是一個請求一個連接,而Tcp的連接創建銷毀成本高,對服務器有很大的影響。所以,自Http 1.1開始,支持keep-alive,默認也開啟,一個連接打開后,會保持一段時間 (可設置),瀏覽器再訪問該服務器就使用這個Tcp連接,減輕了服務器壓力,提高了效率。
服務器端如果故障,即使Session被持久化了,但是服務沒有恢復前都不能使用這些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所具備的數據持久化功能,比如RDB和AOF都沒有,但是可以通過做集群同步的方式,讓各memcached服務器的數據進行同步,從而實現數據的一致性,即保證各memcached的數據是一樣的,即使有任何一臺 memcached 發生故障,只要集群中有一臺 memcached 可用就不會出現數據丟失,當其他memcached 重新加入到集群的時候,可以自動從有數據的memcached 當中自動獲取數據并提供服務。
- Memcached 借助了操作系統的 libevent 工具做高效的讀寫。libevent是個程序庫,它將Linux的epoll、BSD類操作系統的kqueue等事件處理功能封裝成統一的接口。即使對服務器的連接數增加,也能發揮高性能。memcached使用這個libevent庫,因此能在Linux、BSD、Solaris等操作系統上發揮其高性能
- 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 操作命令
- set
- add
- replace
- get
- delete
六 session 共享服務器
6.1 msm 介紹
支持Tomcat的 6.x、7.x、8.x、9.x
- Tomcat的Session管理類,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 安裝
kryo-3.0.3.jarasm-5.2.jarobjenesis-2.6.jarreflectasm-1.11.9.jarminlog-1.3.1.jarkryo-serializers-0.45.jarmsm-kryo-serializer-2.3.2.jarmemcached-session-manager-tc9-2.3.2.jarspymemcached-2.12.3.jarmemcached-session-manager-2.3.2.jar
t1和m1部署可以在一臺主機上,t2和m2部署也可以在同一臺。
6.3 配置過程
修改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