《Java EE網際網路輕量級框架整合開發》讀書筆記

hipilee發表於2017-12-13

2017年12月13日

前言

其實一直在IT相關領域幹了這麼久,讀了這本書的前言才明白網際網路系統和傳統的管理系統的區別:


移動網際網路的新要求:

----高併發

----高響應

----資料一致性

----技術複雜化:在網際網路中流行許多新技術,比如常見的NoSQL(Redis、MongoDB),又如MQ、RPC框架、ZooKeeper、大資料,分散式等技術。

Spring的核心是IoC(控制反轉),他是一個大容器,方便組裝和管理各類系統內外部的資源,同時支援AOP(面向切面程式設計),這是對物件導向的補充,目前廣泛用於日誌和資料庫事務控制減少了大量的重複程式碼,使得程式更為清晰。

NoSQL的成功在於,首先它是基於記憶體的,也就是資料存放在記憶體中,而不是像資料庫那樣把資料放在磁碟上,而記憶體的讀取速度是磁碟速度的幾十倍到上百倍,所以NoSQL工具的速度遠比資料庫讀取速度要快得多,滿足了高響應的要求。即使NoSQL將資料放到磁碟中,它也是一種半結構化的資料格式,讀取到解析的複雜度遠比資料庫要簡單,這是因為資料庫儲存是經過結構化、多正規化等有複雜規則的資料,還原為記憶體結構的速度較慢。NoSQL在很大程度上滿足了高併發、快速讀寫響應。


章 認識SSM框架和Redis

它的成功來源於理念,而不是技術本身,它的理念包括IoC(Inversion of Control)和AOP(Aspect Oriented Programming)。


章 Spring IoC的概念

        它的成功來源於理念,而不是技術本身,它的理念包括IoC(Inversion of Control)和AOP(Aspect Oriented Programming)。

實現IoC的方式有依賴查詢依賴注入(構造器注入、setter注入、介面注入(其實一直沒有明白什麼是介面注入JNDI)依賴拖拽;實現AOP的攔截功能的方式:使用ProxyFactoryBean和對應的介面實現AOP使用XML配置AOP使用@AspectJ註解驅動切面使用AspectJ注入切面

       Spring從2004年第一個版本至今已經十多年了。

裝配Bean的方式:在XML中顯示配置在Java的介面和類中實現配置隱式Bean的發現機制和自動裝配原則


十一章 

      Spring對AOP的支援,在Spring中有四種方式去實現AOP的攔截功能。使用ProxyFactoryBean和對應的介面實現AOP使用XML配置AOP使用@AspectJ註解驅動切面使用AspectJ注入切面


第十二章

       Spring最重要的功能毫無疑問就是運算元據。資料庫的程式設計是網際網路程式設計的基礎,Spring為開發者提供了JDBC模板模式,那就是它自身的JdbcTemplate,它可以簡化許多程式碼的程式設計,但是在實際工作中JdbcTemplate並不常用。

       Spring還提供了TransactionTemplate支援事務的模板,只是這些都不是常用技術,對於持久層,工作中更多的時候用的是Hibernate框架和MyBatis框架。Spring並不去代替已有框架的功能,而是以提供模板的形式給予支援。(這裡說得很好,Spring是讓已有的好的元件都能很好的接入到Spring框架)

      Spring最重要的功能毫無疑問就是運算元據。JDBC程式碼有太多的try……catch……finally……語句,導致程式碼可讀性和可維護性。如果你用得好JDBC,其效能最好的,但是太多的try……catch……finally……語句需要處理,資料庫資源的開啟、關閉都是定性的,甚至大部分情況下,只要發生一場資料庫的事物就會回滾,否則就提交,二者都是比較固定的模式。在Spring沒有出現之前,許多開發者在JDBC中濫用著try……catch……finally……語句導致程式碼可讀性和可維護性幾句下降,從而引發信任問題。為了解決這些問題,Spring提供了自己的方案,那就是JdbcTemplate模板。


      在Spring中大部分都會配置成資料庫連線池,既可以使用Spring內部提供的類,也可以使用第三方資料庫連線池或者從WEB伺服器中通過JDNI獲取資料來源。

資料庫連線池

配置簡單的資料庫連線池(Spring自帶的資料庫資源)

配置第三方的資料庫連線池(C3P0 DBCP DRUID)

jndi資料庫連線池


MapperFactoryBean的配置,

MyBatis的執行只需要提供類似於RoleMapper.java的介面,而無需提供一個實現類。通過學習MyBatis執行原理,可以知道它是由MyBatis體系建立的動態代理物件執行的,所以Spring也沒有辦法為其生成實現類,所以MyBatis-Spring就提供了MapperFactoryBean

當使用一個Mapper介面的方法,它就會產生一個新的SqlSession,執行完成後就會自動關閉。


第十三章

       本章先討論Spring資料庫的事務應用,然後討論Spring中最著名的註解之一-----@Transactional。搞清楚註解@Transactional概念不是那麼容易的事情,因為這會涉及到資料庫的各種概念,為此有必要先從資料庫談起,這樣有利於理解它的配置內容。它的隔離級別和傳播行為等抽象概念。

       大部分情況下,我們會認為資料庫事務要麼同時成功,要麼同時失敗,但是存在著不同的要求。比如銀行的信用卡還款,有個跑批量的事務,而這個批量事務又包含了對各個信用卡的還款業務的處理,我們不能因為其中一張卡的事務的失敗了,而把所有卡的事務也回滾,這樣就會導致因為一個客戶的一場,造成多個客戶的還款失敗,即正常還款的使用者,也被認為是不正常還款的,這樣會引發嚴重的金融信譽問題,Spring事務的傳播行為帶來了比較方便的解決方案。


第十七章 Redia概述

第二十二章 高併發業務

       網際網路存在的一些高併發的例項:瘋狂搶手機 春運買火車票 搶紅包。

       網際網路的開發包括Java後臺、NoSQL、資料庫、限流、CDN、負載均衡等內容,甚至可以說目前並沒有權威性的技術和設計,有的只是長期的經驗的總結,使用這些技術經驗可以有效優化系統,提高系統的併發能力。

       其實請求來到伺服器前需要先通過防火牆(firewall),這裡的防火牆的準確定義其實沒有很好的理解?

       正如沒有完美的程式一樣,也不會有完美的架構。

負載均衡:

       對業務請求做初步的分析,決定分不分發請求到Web伺服器,這就好比一個把控的關卡,常見的分發軟體比如NginxApache等反向代理伺服器,它們在關卡處可以通過配置禁止一些無效的請求,比如封禁經常作弊的IP地址,也可以使用Lua、C語言聯合NoSQL快取技術進行業務分析,這樣就可以初步分析業務,決定是否需要分發到伺服器。

      提供路由演算法,它可以提供一些負載均衡演算法,根據各個伺服器的負載能力進行合理分發,每一個Web伺服器得到比較均衡的請求,從而降低單個伺服器的壓力,提高系統的相應能力。

      限流,對於一些高併發時刻,如雙十一,新產品上線,需要通過限流來處理,因為可能某個時刻通過上述的演算法讓有效請求過多到達伺服器,使得一些Web伺服器或者資料庫伺服器產生當機。持續的當機會造成連續的伺服器雪崩。負載均衡器有限流演算法,對於請求過多的時刻,可以告知使用者系統繁忙,請稍後再試,從而保證系統持續可用。

      系統完成可以在負載均衡器中進行初步鑑別業務請求,使得一些不合理的業務請求在進入Web伺服器之前就排除掉,而為了應付複雜的業務,可以把業務儲存在NoSQL(往往是Redis)上,通過C語言或者Lua語言進行邏輯判斷,它們的效能比Web伺服器判斷的效能要快速得多,通過這些簡單的判斷就能夠快速發現無效請求,並把它們拍的虎在Web伺服器之外,從而降低Web伺服器的壓力,提高網際網路系統的相應速度。

       資料庫設計:對於資料庫的設計而言,為了得到高效能,可以使用分表分庫技術,從而提高系統的響應能力。

高併發系統的分析和設計

      任何系統都不是獨立於業務進行的,真正的系統是為了實現業務而開發的,所以開發高併發網站搶購時,都應該先分析業務需求和實際的場景,在完善這些需求之後才能進入系統開發階段。沒有對業務進行分析就貿然開發系統是開發者大忌。

      對於業務分析,首先分析有效請求無效請求

系統設計

水平分發(個模組通過RPC相互訪問:DubboThrift Hessian

垂直分發

水平和垂直結合分發

資料庫設計

分表分庫 -> 優化SQL語句 ->讀寫分離技術,進行進一步的優化,這樣就可以有一臺主機負責寫業務,一臺或者多臺備機負責讀業務,有助於效能的提高->對於分散式資料庫而言,還會有另外一個麻煩,就是事務的一致性,事務的一致性比較複雜,目前流行的有兩段提交協議,即XA協議、Paxos協議。

動靜分離技術

鎖和高併發

相關文章