看透SpringMVC源代碼分析與實踐讀書筆記

寫在前面:
這本書陸陸續(xù)續(xù)讀了兩周的 還只讀了三分之一
也就300多頁的書 就是很久沒有學(xué)習過了
失去學(xué)習的能力了
所以現(xiàn)在試試新的方法
每本書寫個讀書筆記
然后限個時 效果好就推廣 效果不好就想辦法優(yōu)化
如果今天的derrick和昨天的derrcik一樣
那么今天還有什么意義
Life is too short, do not live the same day twice.

本書閱讀時間 20180527-痰驱?

網(wǎng)站基礎(chǔ)知識

網(wǎng)站的架構(gòu)及其演變過程
  • 其實TCP/IP參考的模型也可以看作一種協(xié)議。BA結(jié)構(gòu)中TCP/IP模型中的網(wǎng)絡(luò)接入層沒有相應(yīng)協(xié)議瞳浦,網(wǎng)際互聯(lián)層時IP協(xié)議担映,傳輸層是TCP協(xié)議,應(yīng)用層是HTTP協(xié)議
  • 緩存和頁面靜態(tài)化
    數(shù)據(jù)量大這個問題最直接的解決方案就是使用緩存叫潦,緩存就是將數(shù)據(jù)從數(shù)據(jù)庫中獲取的結(jié)果暫時保存起來蝇完,在下次使用的時候無需重新到數(shù)據(jù)庫中獲取,這樣可以大大降低數(shù)據(jù)庫的壓力
    緩存的使用方式可以分為通過程序直接保存到內(nèi)存中使用和使用緩存框架兩種方式矗蕊。程序直接操作主要是使用Map短蜕,尤其是ConcurrentHashMap,而常用的緩存框架有Ehcashe傻咖、Memcache和Redis等朋魔。緩存使用過程中最重要的問題什么時候創(chuàng)建緩存和緩存的失效機制。緩存可以在第一次獲取的時候創(chuàng)建也可以在程序啟動和緩存失效之后立即創(chuàng)建卿操,緩存的失效可以定期失效警检,也可以在數(shù)據(jù)發(fā)生變化的時候失效孙援,如果按數(shù)據(jù)發(fā)生變化讓緩存失效,還可以分粗粒度失效和細粒度失效扇雕。

緩存中空數(shù)據(jù)的管理方法
如果緩存是在第一次獲取的時候創(chuàng)建的赃磨,那么在使用緩存的時候最好將沒有數(shù)據(jù)的緩存使用特定的類型值來保存,因為這種方式下如果從緩存中獲取不到數(shù)據(jù)就會從數(shù)據(jù)庫中獲取洼裤,如果數(shù)據(jù)庫中本來就沒有相應(yīng)的數(shù)據(jù)就不會創(chuàng)建緩存,這樣將每次都會查詢數(shù)據(jù)庫溪王。比如有個專門保存文章評論的緩存腮鞍,不同的評論按照不同文章的ID來保存,如果有一篇文章本來就沒有評論莹菱,那么就沒有相應(yīng)的緩存或者緩存的值為null移国,這樣程序在每次調(diào)用這篇文章的評論時都會查詢數(shù)據(jù)庫道伟。這就沒起到緩存的作用蜜徽,我們可以創(chuàng)建一個專門的類(如NoComment)來保存沒有評論的緩存拘鞋,這樣程序從緩存中查詢后就可以知道是還沒有創(chuàng)建緩存還是本來就沒有評論內(nèi)容灰蛙。

  • 跟緩存相似的另外一種技術(shù)叫頁面靜態(tài)化摩梧,它在原理上跟緩存非常相似仅父,緩存是將從數(shù)據(jù)庫獲取到的數(shù)據(jù)(當然也可以是別的任何可以序列化的東西)保存起來驾霜,而頁面靜態(tài)化是將程序最后生成的頁面保存起來买置,使用頁面靜態(tài)化就不需要每次調(diào)用都重新生成頁面了蓉冈,這樣不但不要查詢數(shù)據(jù)庫寞酿,而且連應(yīng)用程序處理都省了拉馋,所以頁面靜態(tài)化同時對數(shù)據(jù)量大和并發(fā)量高兩大問題都有好處煌茴。(后續(xù)看看頁面靜態(tài)化怎么實現(xiàn) 相關(guān)的模板技術(shù) Freemarker Velocity 相關(guān)名詞了解一哈)
  • 分離活躍數(shù)據(jù)
    之前看到是緩存熱點數(shù)據(jù) 我們進一步想 就可以延伸出在數(shù)據(jù)庫層面分離活躍數(shù)據(jù)和非活躍數(shù)據(jù)(這種思路了解一哈)
  • 數(shù)據(jù)庫集群(讀寫分離)的作用是將多個請求分配到不同服務(wù)器處理,從而減輕單臺服務(wù)器的壓力,而分布式數(shù)據(jù)庫是解決單個請求本身就非常復(fù)雜的問題,它可以將單個請求分配到多個服務(wù)器處理,使用分布式后的每個節(jié)點還可以同時使用讀寫分離褐桌,從而組成多個節(jié)點群。(我“天真”地感覺又要集群又要分布式對架構(gòu)是一種考驗,后續(xù)了解一哈)
  • 集群和分布式處理都是使用多臺服務(wù)器處理的,集群是每臺服務(wù)器都具有相同的功能(就是gx的廊坊+馬駒橋機房嘛哈哈哈哈)浩蓉,處理請求時調(diào)用哪臺服務(wù)器都可以,主要起分流的作用宾袜,分布式時將不同的業(yè)務(wù)放到不同的服務(wù)器中捻艳,處理一個請求可能需要用到多臺服務(wù)器,這樣就可以提高一個請求的處理速度庆猫,而且集群和分布式也可以同時使用认轨。
  • 集群又分靜態(tài)資源集群和應(yīng)用程序集群。應(yīng)用程序集群因為需要用到一些緩存的數(shù)據(jù)月培,所以就存在同步的問題嘁字,其中最重要的就是Session恩急,Session同步也是應(yīng)用程序集群中非常核心的一個問題。Session同步有兩種處理方式:一種是在Session發(fā)生變化后自動同步到其他服務(wù)器(tomcat就是默認這種方式)纪蜒,另外一種方式是用一個程序統(tǒng)一管理Session(可以使用專門的服務(wù)器安裝Memecached等高效的緩存程序來統(tǒng)一管理Session衷恭,然后再應(yīng)用程序中通過重寫Request并覆蓋getSession方法來獲取指定服務(wù)器中Session)。

另外我也想到一種思路可以簡單地解決Session同步的問題纯续,Session需要同步的本質(zhì)原因就是要使用不同的服務(wù)器給同一個用戶提供服務(wù)随珠,如果均衡負載在分配請求時可以將同一個用戶(如按IP)分配到同一臺服務(wù)器進行處理就不需要Session同步了,二期這種方法一般也不會對負載均衡帶來太大的問題猬错,如果考慮到穩(wěn)定性牙丽,為了防止有服務(wù)器宕機后丟失數(shù)據(jù)還可以將集群的服務(wù)器分成多個組,然后在小范圍的組內(nèi)同步Session兔魂。
//一些后續(xù)的問題,如果用戶切換了IP登錄該怎么處理举娩,對頻繁切換ip的用戶有沒有什么策略析校,以及傳統(tǒng)方式和這種思路的優(yōu)劣,他們各自適合什么類型的應(yīng)用及用戶群

  • 反向代理
    反向代理指的是客戶端直接訪問的服務(wù)器并不真正提供服務(wù)铜涉,它從別的服務(wù)器獲取資源然后將結(jié)果返回該用戶的
    反向代理服務(wù)器主要有三個作用:1.作為前端服務(wù)器跟實際處理請求的服務(wù)器(如tomcat集成)2.可以用作負載均衡 3.轉(zhuǎn)發(fā)請求
  • CDN
    就是一種特殊的集群頁面緩存服務(wù)器智玻,和普通的多臺頁面緩存服務(wù)器比主要是它存放的位置是分步在全國各地的,當接受到用戶的請求后會將請求分配到最合適的CDN服務(wù)器節(jié)點獲取數(shù)據(jù)
  • 底層的優(yōu)化
    我們前面講到的所有的架構(gòu)都是建立在最前面介紹的基礎(chǔ)架構(gòu)之上的芙代,而且很多地方都需要通過網(wǎng)絡(luò)傳輸數(shù)據(jù)吊奢,如果可以加快網(wǎng)絡(luò)傳輸?shù)乃俣龋菍屨麄€系統(tǒng)從根本上得到改善纹烹。網(wǎng)絡(luò)傳輸數(shù)據(jù)都是按照各種協(xié)議進行的页滚,不過協(xié)議并不是不可以改變,Google就邁出了這一步铺呵,它制定了Quic裹驰、Spdy等協(xié)議來傳輸數(shù)據(jù),Quic比TCP效率高而且不UDP安全片挂,Spdy協(xié)議比現(xiàn)有HTTP協(xié)議的基礎(chǔ)上增加了很多新特性幻林,提高了傳輸?shù)男剩贿^有些特性已經(jīng)包含到了HTTP/2協(xié)議中音念,而且Google也已經(jīng)放棄了Spdy而使用HTTP/2了沪饺。
  • 小結(jié)
    網(wǎng)站架構(gòu)的整個演變過程主要是圍繞大數(shù)據(jù)和高并發(fā)兩個問題展開的,解決的方案主要分為使用緩存和使用多資源兩種類型闷愤。多資源主要指多存儲(包括多內(nèi)存)整葡、多CPU和多網(wǎng)絡(luò),對于多資源來說又可以分為單個資源處理一個完整請求和多個資源合作處理一個請求兩種類型肝谭,如多存儲和多CPU中的集群和分布式掘宪,多網(wǎng)絡(luò)中的CDN和靜態(tài)資源分離蛾扇。理解了整個思路之后就抓住了架構(gòu)演變的本質(zhì),二期自己可能還可以設(shè)計出更好的架構(gòu)魏滚。
常見的協(xié)議和標準
  • 三次握手和四次揮手
    理解這兩個過程需要理解TCP中的兩個序號和三個標志位的含義
    seq ack ACK SYN FIN(這個可以后續(xù)詳細分析)
  • DDOS攻擊中的SYN flood攻擊
    兩次握手成功后故意不握第三次镀首,這時服務(wù)端就會認為是第二次握手的數(shù)據(jù)在傳輸過程中丟失了,會重新發(fā)送第二次握手鼠次,默認情況會一直發(fā)五次更哄。
    對于這種攻擊的一種應(yīng)對方法是設(shè)置第二次請求的重發(fā)次數(shù)(tcp_synack_retries),不過重發(fā)的次數(shù)太小也可能導(dǎo)致正常的請求中因為網(wǎng)絡(luò)沒有收到第二次握手而連接失敗的情況腥寇,具體設(shè)置為多少合適成翩,還需要根據(jù)實際情況判斷,當然如果資金充足也可以使用硬防赦役。(什么是硬防)
  • TCP與UDP
    用于傳輸層的協(xié)議除了TCP還有UDP麻敌,它們的區(qū)別主要是TCP是有連接的,UPD是沒有連接的掂摔,也就是說TCP協(xié)議是在溝通好后才會傳數(shù)據(jù)术羔,而UDP協(xié)議是拿到地址后直接傳了,這樣產(chǎn)生的結(jié)果就是TCP協(xié)議的傳輸速度更快乙漓。TCP就像打電話级历,需要先撥通對方號碼才能通信,而UDP就像是使用對講機叭披,拿起來就可以直接講話寥殖。
  • HTTP協(xié)議
    HTTP協(xié)議是應(yīng)用層的協(xié)議,在TCP/IP協(xié)議接收到數(shù)據(jù)之后需要通過HTTP協(xié)議來解析才可以使用涩蜘。就像過去發(fā)電報一樣嚼贡,電報機就相當于Socket,負責選好發(fā)是送的目標并將內(nèi)容發(fā)過去同诫,但是直接發(fā)過去的數(shù)據(jù)“滴滴滴”并不能直接使用编曼,還需要解碼(在發(fā)送前需要編碼)后才能用,電報機中的編碼和解碼就相當于網(wǎng)絡(luò)傳輸協(xié)議中的HTTP協(xié)議剩辟。
    HTTP協(xié)議中的報文結(jié)構(gòu)非常重要掐场。HTTP報文中分為請求報文(request message)和響應(yīng)報文(response message)兩種類型,這兩種類型都包括三部分:首行贩猎、頭部和主體熊户。請求報文的首行是請求行,包括方法(請求類型)吭服、URL和HTTP版本三項內(nèi)容嚷堡,響應(yīng)請求的首行是狀態(tài)行,包括HTTP版本、狀態(tài)碼和簡短原因三項內(nèi)容蝌戒,其中原因可有可無串塑。(就想起了controller里面那些操作 還有什么“HTTP接口”)
    請求報文中的方法指GET、HEAD北苟、POST桩匪、PUT、DELETE等類型友鼻,響應(yīng)報文中的狀態(tài)碼就是Response中的status傻昙,一共可以分為5類:

1XX:信息性狀態(tài)碼
2XX:成功狀態(tài)碼,如200表示成功
3XX:重定向狀態(tài)碼彩扔,如301表示重定向
4XX:客戶端錯誤狀態(tài)碼妆档,如404表示沒找到請求的資源(有興趣的453了解一哈)
5XX:服務(wù)端錯誤狀態(tài)碼,如500表示內(nèi)部錯誤

  • Servlet
    Servlet是J2EE的標準之一(標準比協(xié)議多了強制性的意義)通過前面的TCP/IP協(xié)議虫碉、HTTP協(xié)議已經(jīng)可以得到數(shù)據(jù)了贾惦,Servlet的作用是對接收到的數(shù)據(jù)進行處理并生成要返回給客戶端的的結(jié)果,這就像電報中接收到電報并翻譯成明文后還需要有人來決策并作出回復(fù)內(nèi)容一樣敦捧。
    Servlet制定了Java中處理web請求的標準纤虽,我們只需要按照標準規(guī)定的去做就可以了。當然绞惦,規(guī)范和標準都不能干活,需要相應(yīng)的Servlet容器洋措,比如tomcat济蝉。
DNS的設(shè)置
  • qq能上網(wǎng) 瀏覽器不行
    這個問題經(jīng)常遇到 其實就是因為有些程序(如qq)是直接使用IP連接的,而瀏覽器需要DNS服務(wù)菠发,這種就是DNS服務(wù)出了問題王滤。
java中socket的用法
  • Java中的Socket
    分為普通Socket和NioSocket
  • 普通Socket的用法
    Socket分為ServerSocket和Socket兩大類,ServerSocket用于服務(wù)端滓鸠,可以通過accept方法監(jiān)聽請求雁乡,監(jiān)聽到請求后返回Socket,Socket用于完整的數(shù)據(jù)傳輸糜俗,客戶端直接使用Socket發(fā)起請求并傳輸數(shù)據(jù)踱稍。(后續(xù)可以單獨開個坑 寫一下這個的實現(xiàn))
  • NioSocket的用法
    主要是了解三個概念 Buffer Channel Selector
    Buffer中的四個重要屬性 capacity limit position mark(兩兩對應(yīng))
自己動手實現(xiàn)HTTP協(xié)議

這章后面單獨開個坑

詳解Servlet

http://www.reibang.com/p/90e460893e53

tomcat分析

俯視Spring MVC

Spring MVC初體驗
創(chuàng)建Spring MVC之器
Spring MVC之用

Spring MVC組件分析

總結(jié)與補充

r

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市悠抹,隨后出現(xiàn)的幾起案子珠月,更是在濱河造成了極大的恐慌,老刑警劉巖楔敌,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啤挎,死亡現(xiàn)場離奇詭異,居然都是意外死亡卵凑,警方通過查閱死者的電腦和手機庆聘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門胜臊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伙判,你說我怎么就攤上這事象对。” “怎么了澳腹?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵织盼,是天一觀的道長。 經(jīng)常有香客問我酱塔,道長沥邻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任羊娃,我火速辦了婚禮唐全,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蕊玷。我一直安慰自己邮利,他們只是感情好,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布垃帅。 她就那樣靜靜地躺著延届,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贸诚。 梳的紋絲不亂的頭發(fā)上方庭,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機與錄音酱固,去河邊找鬼械念。 笑死,一個胖子當著我的面吹牛运悲,可吹牛的內(nèi)容都是我干的龄减。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼班眯,長吁一口氣:“原來是場噩夢啊……” “哼希停!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起署隘,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤脖苏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后定踱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棍潘,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了亦歉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恤浪。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖肴楷,靈堂內(nèi)的尸體忽然破棺而出水由,到底是詐尸還是另有隱情,我是刑警寧澤赛蔫,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布砂客,位于F島的核電站,受9級特大地震影響呵恢,放射性物質(zhì)發(fā)生泄漏鞠值。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一渗钉、第九天 我趴在偏房一處隱蔽的房頂上張望彤恶。 院中可真熱鬧,春花似錦鳄橘、人聲如沸声离。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽术徊。三九已至,卻和暖如春鲸湃,著一層夾襖步出監(jiān)牢的瞬間赠涮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工唤锉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人别瞭。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓窿祥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蝙寨。 傳聞我的和親對象是個殘疾皇子晒衩,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)墙歪,斷路器听系,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong閱讀 22,414評論 1 92
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,826評論 6 342
  • 關(guān)于記錄!很多人都喜歡記錄孩子的點滴,為了他們長大了能夠找見自己的來時路浪漠! 每個人的路肯定是不一樣的陕习,但,不一樣的...
    縱情嬉戲天地間閱讀 254評論 0 0
  • 這是手機拍的址愿?單反拍的吧该镣! 這組照片發(fā)到網(wǎng)上的時候,因為我寫著是手機攝影而引起了很多質(zhì)疑响谓,很多人...
    倫小野閱讀 639評論 0 7