知識點總結
這段時間,對日常開發中用到的技術做了體系化的總結,包括Java基礎、併發、JVM、集合,常用的開發框架Spring、Spring MVC、Mybatis、Dubbo、MySql、ElasticSearch、Kafka、Redis、Netty、Zookeeper,也大概梳理了一些Spring Cloud,但由於Spring Cloud以及很久沒在實際項目中應用,所以只是對各個組件的作用和使用方式進行了梳理,下一步主要梳理做過的項目、數據結構和算法以及曾經在項目中用到的一些大數據處理框架。
在這一階段的梳理中,主要對日常用到的開發框架從使用和原理兩方面進行總結,一部分還再次閱讀了源碼,比如Spring、Mybatis、Dubbo,Netty的源碼也看了一些,對於面試的知識點,以往多數時候都是在面試前進行突擊,很多東西都沒有很好的理解,這一次,核心目標就是通過大量的練習來儘量洞見這些技術框架的本質,那種知其然不知其所以然的感覺實在是太糟糕了。
在Java基礎中,比較基礎的內容包括集合和IO,比較難的是Jvm和併發這兩塊的內容(jdk8的新特性也蠻重要的,但是一直沒有細看),jvm中主要包括了
- 類加載機制
- jvm內存區域的劃分
- 一些對象分配策略
- 垃圾收集算法
- 垃圾對象標記算法
- 常用的垃圾收集器及其特點
- 常見的jvm參數以及jvm監控與分析工具
- jvm常見的優化策略
在java併發這部分中,主要包含了
- 多線程帶來的好處和問題
- Java內存模型;
- synchronized原理;
- AQS 原理;
- AQS的阻塞模式、超時模式、共享模式的實現原理;
- 一些常見的JUC組件,如ReentrantLock,ReadWriteLock、CountdownLatch、CyclicBarrier、Semaphore等的實現原理;
- Fork/Join框架,Future、FutureTask等異步工機;
- 線程池原理;
對於集合主要是要掌握幾種常見的集合類型的原理和區別,以及使用場景,集合主要分爲三類,分別是Map、Set和List
常見的List實現,ArrayList、LinkedList、Vector;
常見的Set實現,HashSet、TreeSet、LinkedHashSet;
常見的Map實現,HashMap、LinkedHashMap、TreeMap;
ArrayList和LinkedList的區別及各自的使用場景;
ArrayList和Vector的區別;
各種Map和Set的原理;
HashMap中的初始容量、加載因子、存儲結構、擴容、併發造成死循環、jdk1.8以後的優化以及容量爲何爲2的整數次冪等等問題,都是面試互懟的點;
Spring這塊的知識主要涉及應用以及原理,在應用上,由於目前SpringBoot以及稱爲了主流,所以個人感覺並沒有那麼重要,但對於理解原理還是挺有幫助的,在原理層面主要了解IoC容器的幾個核心原理的實現就行:
- IoC容器的啓動流程;
- 默認的IoC容器;
- 依賴注入的過程;
- 如何用三級緩存解決循環依賴問題;
- Bean對象的生命週期;
- Aop的實現原理;
- 聲明式事務的實現原理;
掌握了上面這些內容,可以說spring的最核心原理也就算掌握了,至於其他的,我個人認爲等到用的時候再去看吧,因爲Java相關的知識點實在太多了,如果不抓住重點,很容易迷失,這階段我也一直在提醒自己把握好方向不要迷失。
Spring MVC是基於Spring 構建的一個web層框架,相比於傳統的Servlet,它提供了更豐富的功能,相比於struts,它更輕量級而且能夠與spring無縫整合,瞭解springmvc,我覺得可以從以下幾個方便去看:
- spring mvc中的核心組件及運轉流程;
- spring mvc如何與server進行整合的;
- spring 3.0的幾個新特性;
- 其他的就是一些使用上的問題了,比如攔截器、異常處理器、對靜態資源的處理、場景的註解的使用,父子容器等問題;
對於Mybatis,我個人覺得是一個非常好的用於學習設計模式的框架,Mybatis本身是一個非常輕量級的orm框架,比Spring要輕很多,但是它內部大量的應用了設計模式,例如工廠模式、建造者模式、責任鏈模式、裝飾模式、代理模式等等,同時,它的模塊與模式之間的耦合也很低,每個模塊都有各自的職責,分工明確,在瞭解mybatis的時候,可以從兩個方面入手,一個是他的基礎支持層,一個是sql的執行流程:
- 數據源模塊的實現原理;
- 事務管理模塊的實現原理;
- 緩存模塊的實現原理;
- 日誌模塊的實現原理;
- SqlSessionFactory/SqlSession/Configuration
- Executor/ParameterHandler/ResultHandler/TypeHandler/Interceptor/SqlBound等組件的作用
- 與Spring的集成原理;
瞭解了這些mybatis也就差不多了,下面再來說說netty,本人對netty並沒有開發經驗,瞭解netty的原因主要有兩個,一個是大家都說netty非常優秀,第二是因爲看到很多分佈式服務底層的通信模塊都使用了netty,比如dubbo、hadoop等,所以想看看netty到底好在哪裏,就目前我對netty的瞭解,可以從以下幾個方面來看:
- 常見的IO模型;
- Java NIO的一些基本概念和原理;
- epoll和零拷貝是啥東西;
- reactor模型及其與netty的關係;
- netty的特點,到底好在哪裏;
- 半包/粘包問題是如何產生的以及如何解決;
- 什麼是序列化以及場景的序列化框架有哪些;
- Netty中的核心組件以及核心運行原理;
如果不是做二次開發,瞭解其核心原理就足夠了吧。
對於Dubbo,由於近期在項目中使用的比較多,所以對於他的使用比較熟悉,另外對於核心模塊的原理也需要了解一下,一方面面試經常會問,另外就是了解了原理以後對於應用和排查問題都很用幫助,同時還能從中學習它的設計方式,我覺得dubbo主要需要了解以下內容:
- 系統架構的演進流程,單體架構、SOA架構、微服務架構等;
- dubbo的整體架構,橫向微內核架構,縱向封層架構;
- dubbo中設計到的覺得,consumer、producer、monitor和註冊中心;
- 關閉啓動時依賴檢車、服務分組、多版本控制;
- 聲明式緩存、隱式參數傳遞、繁華調用、異步調用的使用方式;
- mock服務降級機制的使用;
- Java SPI與Dubbo SPI的對比;
- Dubbo SPI中IoC和Aop的原理,以及dubbo SPI基於URL的自適應機制的實現原理;
- 服務導出和服務應用的原理;
- 關於優雅停機的原理;
- 遠程調用的過程;
- 與集羣容錯相關的比如容錯策略、負載均衡策略、重試策略、限流等等;
- dubbo中過濾器的作用,以及原理(dubbo的很多功能都是用過濾器實現的);
瞭解到這裏也就差不多了,沒必要把自己逼死,😝
下面再來說說mysql,對於我們開發同學來說,mysql是一定要懂的,而且要懂一些原理,因爲這對sql優化及排查問題都很有幫助,在瞭解mysql的時候,可以從以下幾個方面去了解:
- mysql的邏輯架構;
- sql語句的執行流程;
- mysql中涉及到的鎖;
- 常見的存儲引擎及特點;
- 索引的存儲結構;
- 主鍵索引和二級索引,回表,索引覆蓋;
- 索引的最左前綴匹配及索引下推;
- 事務的特性及併發下事務存在的問題;
- mysql中事務的隔離級別;
- MVCC機制與事務隔離級別的實現原理;
- 常見的sql優化方式;
- explain中設計的關鍵字段的含義及如何根據執行計劃優化sql語句;
- mysql中涉及到的log機器作用;
- 兩階段提交;
以上都是在單體應用架構下設計到的框架和服務,下面就來帶了分佈式模塊,分佈式,聽起來牛逼轟轟,但是所有的分佈式服務和分佈式服務開發框架的一個主線就是分而治之,再次基礎上衍生出了主從、分片、CAP/Base理論,細細想來,都是大同小異而已。
首先說redis,redis是目前最流程的分佈式nosql緩存數據庫,瞭解redis可以從以下幾個方面入手:
- redis的特點;
- redis提供的數據類型及這些數據類型的常見使用場景;
- redis的集羣策略;
- redis的持久化策略;
- redis在使用中需要注意的問題,這個可以參考阿里雲的redis開發規範。
- redis的一些高級特性,例如事務、pub/sub、整合lua腳本等等;
瞭解了這些,基本上就可以滿足日常的開發和排查任務了。
再來說kafka,首先kafka是消息隊列的一種,它天生的存在丟消息的特點和高吞吐了決定了它只能被用在一些對數據可靠性要求不高的場景,最常見大數據日誌處理中,在日常應用中,kafka集羣通常都是由運維同學管理,爲開發通信提供高可用服務,所以我覺得如果沒有深度定製的需求,那麼瞭解kafka的基本使用方式和原理就可以了,可以從以下幾個方面入手
- 消息隊列的作用;
- kafka中設計的核心概念;
- kafka的分區和副本機制;
- kafka的存儲原理;
- kafka的HW截斷機制(會導致丟消息);
- kafka的Java api的使用(其實到用的時候百度就行了,真心記不住);
瞭解了以上幾個方面也就差不多了,與kafka相比,RocketMQ也是一個經常被用到的消息隊列,它提供了事務支持和零消息丟失的保證,在對消息可靠性要求高的場景以及分佈式事務中被廣泛的應用。
最後來說說ElasticSearch,ES應該是目前在全文檢索領域應用最廣泛的搜索框架了,本人對ES也沒有過比較深入的使用經驗,主要以查詢數據爲主,從我的角度看,瞭解ES的話可以從以下幾個方面入手:
- es與其他搜索框架(lucen、solr)相比的優勢有哪些
- es的特點
- es中提供的數據類型
- setting和mapping的作用
- 分詞及倒排索引原理;
- 索引庫中索引的存儲結構;
- 分片和副本機制,主分片和副本分片的一些特點;
- es集羣中的節點類型及作用;
- es對於在集羣環境下的數據寫一致性問題的處理策略;
- 在部署es集羣時如何進行分片樹和副本數的設置
- 如何根據實際場景來評估鎖需要的es集羣的規模
在來看看zookeeper,對於一名業務開發來說,真的是沒有太多的時間去看zookeeper的源碼,對於zookeeper來說,日常開發都很少涉及,主要是在學習一些分佈式服務的時候回涉及到,對於zk,我個人的瞭解包含一下幾個方面:
- zookeeper的應用場景;
- paxos算法與zab原子廣播協議;
- zookeeper中的節點類型;
- zookeeper中的watcher機制;
- leader選舉的大致流程;
- znode的狀態和類型;
- 數據讀取流程;
- 數據寫入流程;
也就這這些了,我累了,我不想再繼續瞭解了,對我來說那沒什麼用。。。
還有設計模式,對設計模式的學習最好的方法就是閱讀源碼,因爲很多優秀的開源框架中都大量使用了設計模式來優化代碼結構:
- 面向對象設計的六大原則;
- 創建型設計模式有哪些,分別解決了什麼問題,實際應用場景有哪些
- 結構型設計模式有哪些,分別解決了什麼問題,實際應用場景有哪些
- 行爲型設計模式有哪些,分別解決了什麼問題,實際應用場景有哪些