Java 全棧知識體系(2021 PDF 版本)

40000 +字長文總結,民工哥已將此文整理成PDF文檔了,需要的見文後下載獲取方式。

全棧知識體系總覽


Java入門與進階

面向對象與Java基礎

  • Java 基礎 - 面向對象

  • Java 基礎 - 知識點

  • Java 基礎 - 圖譜 & Q/A

基礎知識點複習完了以後,我們需要深入的理解Java中的一些基礎機制:

  • Java 基礎 - 泛型機制詳解

  • Java泛型這個特性是從JDK 1.5纔開始加入的,因此爲了兼容之前的版本,Java泛型的實現採取了“僞泛型”的策略,即Java在語法上支持泛型,但是在編譯階段會進行所謂的“類型擦除”(Type Erasure),將所有的泛型表示(尖括號中的內容)都替換爲具體的類型(其對應的原生態類型),就像完全沒有泛型一樣。

  • Java 基礎 - 註解機制詳解

  • 註解是JDK1.5版本開始引入的一個特性,用於對代碼進行說明,可以對包、類、接口、字段、方法參數、局部變量等進行註解。它是框架學習和設計者必須掌握的基礎。

  • Java 基礎 - 異常機制詳解

  • Java異常是Java提供的一種識別及響應錯誤的一致性機制,ava異常機制可以使程序中異常處理代碼和正常業務代碼分離,保證程序代碼更加優雅,並提高程序健壯性。

  • Java 基礎 - 反射機制詳解

  • JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制。Java反射機制在框架設計中極爲廣泛,需要深入理解。

  • Java常用機制 - SPI機制

  • SPI(Service Provider Interface),是JDK內置的一種 服務提供發現機制,可以用來啓用框架擴展和替換組件,主要是被框架的開發人員使用。

Java進階 - 集合框架

A. Java進階 - Java 集合框:Java 集合框架應用是極其廣泛的,對於其總體框架用法及源碼都必要深刻理解。

  • Collection 類關係圖

B. Java進階 - Java 集合框之 Collection源碼解讀:對核心的Collection類進行源碼解讀。

  • Collection - ArrayList 源碼解析

  • Collection - LinkedList源碼解析

  • Collection - Stack & Queue 源碼解析

  • Collection - PriorityQueue源碼解析

C. Java進階 - Java 集合框之 Map & Set 源碼解讀:對核心的Map & Set 類進行源碼解讀。

  • Map - HashSet & HashMap 源碼解析

  • Map - LinkedHashSet&Map源碼解析

  • Map - TreeSet & TreeMap 源碼解析

  • Map - WeakHashMap源碼解析

Java進階 - 併發框架

A. Java進階 - Java 併發之基礎:首先全局的瞭解併發的知識體系,同時瞭解併發理論基礎和線程基礎,併發關鍵字等,這些是你理解Java併發框架的基礎。

  • Java 併發 - 知識體系

  • Java 併發 - 理論基礎

  • Java 併發 - 線程基礎

  • 關鍵字: synchronized詳解

  • 關鍵字: volatile詳解

  • 關鍵字: final詳解

B. Java進階 - Java 併發之J.U.C框架:然後需要對J.U.C框架五大類詳細解讀,包括:Lock框架,併發集合, 原子類, 線程池和工具類。

  • JUC - 類彙總和學習指南

  • JUC框架包含幾個部分?

  • 每個部分有哪些核心的類?

  • 最最核心的類有哪些?

B.1 Java進階 - Java 併發之J.U.C框架【1/5】:CAS及原子類:從最核心的CAS, Unsafe和原子類開始分析。

  • JUC原子類: CAS, Unsafe和原子類詳解

  • 線程安全的實現方法有哪些?

  • 什麼是CAS?

  • CAS使用示例,結合AtomicInteger給出示例?

  • CAS會有哪些問題?

  • 針對這這些問題,Java提供了哪幾個解決的?

  • AtomicInteger底層實現? CAS+volatile

  • 請闡述你對Unsafe類的理解?

  • 說說你對Java原子類的理解? 包含13個,4組分類,說說作用和使用場景。

  • AtomicStampedReference是什麼?

  • AtomicStampedReference是怎麼解決ABA的? 內部使用Pair來存儲元素值及其版本號

  • java中還有哪些類可以解決ABA的問題? AtomicMarkableReference

B.2 Java進階 - Java 併發之J.U.C框架【2/5】:鎖:然後分析JUC中鎖。

  • JUC鎖: LockSupport詳解

  • JUC鎖: 鎖核心類AQS詳解

  • JUC鎖: ReentrantLock詳解

  • JUC鎖: ReentrantReadWriteLock詳解

B.3 Java進階 - Java 併發之J.U.C框架【3/5】:集合:再理解JUC中重要的支持併發的集合。

  • JUC集合: ConcurrentHashMap詳解

  • JUC集合: CopyOnWriteArrayList詳解

  • JUC集合: ConcurrentLinkedQueue詳解

  • JUC集合: BlockingQueue詳解

B.4 Java進階 - Java 併發之J.U.C框架【4/5】:線程池:再者分析JUC中非常常用的線程池等。

  • JUC線程池: FutureTask詳解

  • JUC線程池: ThreadPoolExecutor詳解

  • JUC線程池: ScheduledThreadPool詳解

  • JUC線程池: Fork/Join框架詳解

B.5 Java進階 - Java 併發之J.U.C框架【5/5】:工具類:最後來看下JUC中有哪些工具類,以及線程隔離術ThreadLocal。

  • JUC工具類: CountDownLatch詳解

  • JUC工具類: CyclicBarrier詳解

  • JUC工具類: Semaphore詳解

  • JUC工具類: Phaser詳解

  • JUC工具類: Exchanger詳解

  • Java 併發 - ThreadLocal詳解

C. Java進階 - Java 併發之 本質與模式:最後站在更高的角度看其本質(協作,分工和互斥),同時總結上述知識點所使用的模式。

  • TODO:Java 併發 - 併發的本質:協作,分工和互斥

  • TODO:Java 併發 - 併發的模式梳理

Java進階 - IO框架

A. Java進階 - IO框架之知識體系:首先了解下Java IO框架包含什麼,同時推薦下如何學習IO框架。
  • Java IO/NIO/AIO - Overview

  • 本文主要梳理Java IO/NIO/AIO的知識體系

B. Java進階 - IO框架之基礎IO:其次對Java基礎IO框架進行梳理,包括其分類,使用和源碼詳解。

  • Java IO - 分類(傳輸,操作)

  • 本文主要從傳輸方式數據操作兩個方面分析Java IO的分類

  • Java IO - 設計模式(裝飾者模式)

  • Java I/O 使用了裝飾者模式來實現

  • Java IO - 源碼: InputStream

  • 本文主要從JDK源碼角度分析InputStream

  • Java IO - 源碼: OutputStream

  • 本文主要從JDK源碼角度分析 OutputStream

  • Java IO - 常見類使用

  • 本文主要介紹Java IO常見類的使用,包括:磁盤操作,字節操作,字符操作,對象操作和網絡操作

C. Java進階 - IO框架之NIO/AIO等:然後再對Unix IO模型學習,引入到Java BIO/NIO/AIO相關知識詳解。

  • IO 模型 - Unix IO 模型

  • 本文主要簡要介紹 Unix I/O 5種模型,並對5大模型比較,並重點爲後續章節解釋IO多路複用做鋪墊

  • Java IO - BIO 詳解

  • BIO就是: blocking IO。最容易理解、最容易實現的IO工作方式,應用程序向操作系統請求網絡IO操作,這時應用程序會一直等待;另一方面,操作系統收到請求後,也會等待,直到網絡上有數據傳到監聽端口;操作系統在收集數據後,會把數據發送給應用程序;最後應用程序受到數據,並解除等待狀態

  • Java NIO - 基礎詳解

  • 新的輸入/輸出 (NIO) 庫是在 JDK 1.4 中引入的,彌補了原來的 I/O 的不足,提供了高速的、面向塊的 I/O

  • Java NIO - IO多路複用詳解

  • 本文主要對IO多路複用,Ractor模型以及Java NIO對其的支持

  • Java AIO - 異步IO詳解

  • 本文主要對異步IO和Java中對AIO的支持詳解。@pdai

D. Java進階 - IO框架之開源框架:最後再對常用的開源框架進行分析和詳解。

  • Java NIO - 零拷貝實現這裏轉一篇Java NIO 零拷貝的實現文章,在此之前建議先理解什麼是Linux中零拷貝,可以先看這篇文章。本文從源碼着手分析了 Java NIO 對零拷貝的實現,主要包括基於內存映射(mmap)方式的 MappedByteBuffer 以及基於 sendfile 方式的 FileChannel。最後在篇末簡單的闡述了一下 Netty 中的零拷貝機制,以及 RocketMQ 和 Kafka 兩種消息隊列在零拷貝實現方式上的區別。

  • Java N(A)IO - 框架: Netty

  • Netty是一個高性能、異步事件驅動的NIO框架,提供了對TCP、UDP和文件傳輸的支持。作爲當前最流行的NIO框架,Netty在互聯網領域、大數據分佈式計算領域、遊戲行業、通信行業等獲得了廣泛的應用,一些業界著名的開源組件也基於Netty構建,比如RPC框架、zookeeper等

Java進階 - JVM相關

學習思路

A. Java進階 - JVM相關 知識體系:首先按照上述學習思路,理解總體知識點在全局上與知識體系之間的對應關係。

  • JVM 相關知識體系

B. Java進階 - JVM相關 類加載:然後理解類字節碼和類的加載機制。

  • JVM基礎 - 類字節碼詳解

  • 源代碼通過編譯器編譯爲字節碼,再通過類加載子系統進行加載到JVM中運行

  • JVM基礎 - Java 類加載機制

  • 這篇文章將帶你深入理解Java 類加載機制

C. Java進階 - JVM相關 內存結構:因爲類字節碼是加載到JVM內存結構中的,所以緊接着理解JVM內存結構。

  • JVM基礎 - JVM內存結構

  • 本文主要對JVM 內存結構進行講解,注意不要和Java內存模型混淆了

D. Java進階 - JVM相關 JMM:然後通過理解JVM與硬件之間的聯繫,理解Java 通過其內存模型保證數據線程安全等,這是JVM在併發上底層的支持。

  • JVM基礎 - Java 內存模型引入

  • 很多人都Java內存模型和JVM內存結構,以及Java內存模型與物理內存之間的關係。本文從堆棧角度引入JMM,然後介紹JMM和物理內存之間的關係, 爲後面JMM詳解, JVM 內存結構詳解, Java 對象模型詳解等鋪墊。

  • JVM基礎 - Java 內存模型詳解

  • 本文主要轉載自 Info 上深入理解Java內存模型 (opens new window), 作者程曉明。這篇文章對JMM講的很清楚了,大致分三部分:重排序與順序一致性;三個同步原語(lock,volatile,final)的內存語義,重排序規則及在處理器中的實現;java 內存模型的設計,及其與處理器內存模型和順序一致性內存模型的關係

E. Java進階 - JVM相關 GC:再者理解下Java GC機制,如何回收內存等。

  • JVM基礎 - Java 垃圾收集

  • 垃圾收集主要是針對堆和方法區進行

F. Java進階 - JVM相關 排錯調優:最後圍繞着調試和排錯,分析理解JVM調優參數,動態字節碼技術及動態在線調試的原理;學會使用常用的調工具和在線動態調試工具等。

  • 調試排錯 - JVM 調優參數

  • 本文對JVM涉及的常見的調優參數和垃圾回收參數進行闡述

  • 調試排錯 - Java OOM 分析

  • 本文以兩個簡單的例子(堆內存溢出MetaSpace (元數據) 內存溢出)解釋Java 內存溢出的分析過程

  • 調試排錯 - Java問題排查:Linux命令

  • Java 在線問題排查主要分兩篇:本文是第一篇,通過linux常用命令排查

  • 調試排錯 - Java問題排查:工具單

  • Java 在線問題排查主要分兩篇:本文是第二篇,通過java調試/排查工具進行問題定位

  • 調試排錯 - 9種常見的CMS GC問題分析與解決

  • 本文整理自美團技術團隊 (opens new window), 這篇文章將可以幫助你構建CMS GC相關問題解決的知識體系,分享給你。

  • 調試排錯 - Java動態調試技術原理

  • 本文轉載自 美團技術團隊胡健的Java 動態調試技術原理及實踐 (opens new window), 通過學習java agent方式進行動態調試瞭解目前很多大廠開源的一些基於此的調試工具。

  • 調試排錯 - Java應用在線調試Arthas

  • 本文主要介紹Alibaba開源的Java診斷工具

  • 這個類從哪個 jar 包加載的? 爲什麼會報各種類相關的 Exception?

  • 我改的代碼爲什麼沒有執行到? 難道是我沒 commit? 分支搞錯了?

  • 遇到問題無法在線上 debug,難道只能通過加日誌再重新發布嗎?

  • 線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!

  • 是否有一個全局視角來查看系統的運行狀況?

  • 有什麼辦法可以監控到JVM的實時運行狀態?

  • 調試排錯 - 使用IDEA本地調試和遠程調試

  • Debug用來追蹤代碼的運行流程,通常在程序運行過程中出現異常,啓用Debug模式可以分析定位異常發生的位置,以及在運行過程中參數的變化;並且在實際的排錯過程中,還會用到Remote Debug。IDEA 相比 Eclipse/STS效率更高,本文主要介紹基於IDEA的Debug和Remote Debug的技巧。

G. Java進階 - JVM 企業面試題精選:重點介紹一些企業常見的面試及答案解析

更多關於Java技術棧的技術文章、技術資源(文檔、視頻)、以及各咱企業面試題,可以關注民工哥技術之路公衆號,回覆關鍵字 1024 獲取全部分享的技術資源。

數據結構與算法

數據結構基礎

學習思路

避免孤立的學習知識點,要關聯學習。比如實際應用當中,我們經常使用的是查找排序操作,這在我們的各種管理系統、數據庫系統、操作系統等當中,十分常用,我們通過這個線索將知識點串聯起來:

數組的下標尋址十分迅速,但計算機的內存是有限的,故數組的長度也是有限的,實際應用當中的數據往往十分龐大;而且無序數組的查找最壞情況需要遍歷整個數組;後來人們提出了二分查找,二分查找要求數組的構造一定有序,二分法查找解決了普通數組查找複雜度過高的問題。任和一種數組無法解決的問題就是插入、刪除操作比較複雜,因此,在一個增刪查改比較頻繁的數據結構中,數組不會被優先考慮

普通鏈表由於它的結構特點被證明根本不適合進行查找

哈希表是數組和鏈表的折中,同時它的設計依賴散列函數的設計,數組不能無限長、鏈表也不適合查找,所以也適合大規模的查找

二叉查找樹因爲可能退化成鏈表,同樣不適合進行查找

AVL樹是爲了解決可能退化成鏈表問題,但是AVL樹的旋轉過程非常麻煩,因此插入和刪除很慢,也就是構建AVL樹比較麻煩

紅黑樹是平衡二叉樹和AVL樹的折中,因此是比較合適的。集合類中的Map、關聯數組具有較高的查詢效率,它們的底層實現就是紅黑樹。

多路查找樹 是大規模數據存儲中,實現索引查詢這樣一個實際背景下,樹節點存儲的元素數量是有限的(如果元素數量非常多的話,查找就退化成節點內部的線性查找了),這樣導致二叉查找樹結構由於樹的深度過大而造成磁盤I/O讀寫過於頻繁,進而導致查詢效率低下。

B樹與自平衡二叉查找樹不同,B樹適用於讀寫相對大的數據塊的存儲系統,例如磁盤。它的應用是文件系統及部分非關係型數據庫索引。

B+樹在B樹基礎上,爲葉子結點增加鏈表指針(B樹+葉子有序鏈表),所有關鍵字都在葉子結點 中出現,非葉子結點作爲葉子結點的索引;B+樹總是到葉子結點才命中。通常用於關係型數據庫(如Mysql)和操作系統的文件系統中。

B*樹是B+樹的變體,在B+樹的非根和非葉子結點再增加指向兄弟的指針, 在B+樹基礎上,爲非葉子結點也增加鏈表指針,將結點的最低利用率從1/2提高到2/3。

R樹是用來做空間數據存儲的樹狀數據結構。例如給地理位置,矩形和多邊形這類多維數據建立索引。

Trie樹是自然語言處理中最常用的數據結構,很多字符串處理任務都會用到。Trie樹本身是一種有限狀態自動機,還有很多變體。什麼模式匹配、正則表達式,都與這有關。

A. 數據結構 知識點:數據結構是基礎中的基礎,任何進階都逃不開這些知識點。

  • 數據結構 - Overview

B. 數據結構之 線性結構:首先理解數據結構中線性結構及其延伸:數組和矩陣,鏈表,棧和隊列等。

  • 線性表 - 數組和矩陣

  • 數組是一種連續存儲線性結構,元素類型相同,大小相等,數組是多維的,通過使用整型索引值來訪問他們的元素,數組尺寸不能改變

  • 線性表 - 鏈表

  • n個節點離散分配,彼此通過指針相連,每個節點只有一個前驅節點,每個節點只有一個後續節點,首節點沒有前驅節點,尾節點沒有後續節點。確定一個鏈表我們只需要頭指針,通過頭指針就可以把整個鏈表都能推出來

  • 線性表(散列) - 哈希表

  • 散列表(Hash table,也叫哈希表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表。@pdai

  • 線性表 - 棧和隊列

  • 數組和鏈表都是線性存儲結構的基礎,棧和隊列都是線性存儲結構的應用

C. 數據結構之 邏輯結構:樹:然後理解數據結構中邏輯結構之樹:二叉搜索樹(BST),平衡二叉樹(AVL),紅黑樹(R-B Tree),哈夫曼樹,前綴樹(Trie)等。

  • 樹 - 基礎和Overview

  • 樹在數據結構中至關重要,這裏展示樹的整體知識體系結構和幾種常見樹類型

  • 樹 - 二叉搜索樹(BST)

  • 本文主要介紹 二叉樹中最基本的二叉查找樹(Binary Search Tree),(又:二叉搜索樹,二叉排序樹)它或者是一棵空樹,或者是具有下列性質的二叉樹:若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;它的左、右子樹也分別爲二叉排序樹。

  • 樹 - 平衡二叉樹(AVL)

  • 平衡二叉樹(Balanced Binary Tree)具有以下性質:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。平衡二叉樹的常用實現方法有紅黑樹、AVL、替罪羊樹、Treap、伸展樹等。最小二叉平衡樹的節點的公式如下 F(n)=F(n-1)+F(n-2)+1 這個類似於一個遞歸的數列,可以參考Fibonacci數列,1是根節點,F(n-1)是左子樹的節點數量,F(n-2)是右子樹的節點數量。

  • 樹 - 紅黑樹(R-B Tree)

  • 紅黑樹(Red Black Tree) 是一種自平衡二叉查找樹,是在計算機科學中用到的一種數據結構,典型的用途是實現關聯數組,是平衡二叉樹和AVL樹的折中。

  • 樹 - 哈夫曼樹

  • 哈夫曼又稱最優二叉樹, 是一種帶權路徑長度最短的二叉樹。

  • 樹 - 前綴樹(Trie)

  • Trie,又稱字典樹、單詞查找樹或鍵樹,是一種樹形結構,是一種哈希樹的變種。典型應用是用於統計,排序和保存大量的字符串(但不僅限於字符串),所以經常被搜索引擎系統用於文本詞頻統計。它的優點是:利用字符串的公共前綴來減少查詢時間,最大限度地減少無謂的字符串比較,查詢效率比哈希樹高。

D. 數據結構之 邏輯結構:圖:最後理解數據結構中邏輯結構之圖:圖基礎,圖的遍歷,最小生成樹(Prim & Kruskal),最短路徑(Dijkstra & Frolyd),拓撲排序(Topological sort),AOE & 關鍵路徑等。

  • 圖 - 基礎和Overview

  • 圖(Graph)是由頂點和連接頂點的邊構成的離散結構。在計算機科學中,圖是最靈活的數據結構之一,很多問題都可以使用圖模型進行建模求解。例如: 生態環境中不同物種的相互競爭、人與人之間的社交與關係網絡、化學上用圖區分結構不同但分子式相同的同分異構體、分析計算機網絡的拓撲結構確定兩臺計算機是否可以通信、找到兩個城市之間的最短路徑等等。

  • 圖 - 遍歷(BFS & DFS)

  • 圖的深度優先搜索(Depth First Search),和樹的先序遍歷比較類似; 廣度優先搜索算法(Breadth First Search),又稱爲"寬度優先搜索"或"橫向優先搜索"

  • 圖 - 最小生成樹(Prim & Kruskal)

  • Kruskal算法是從最小權重邊着手,將森林裏的樹逐漸合併;prim算法是從頂點出發,在根結點的基礎上建起一棵樹

  • 圖 - 最短路徑(Dijkstra & Frolyd)

  • 最短路徑有着廣泛的應用,比如地圖兩點間距離計算,公交查詢系統,路由選擇等

  • 圖 - 拓撲排序(Topological sort)

  • 拓撲排序主要用來解決有向圖中的依賴解析(dependency resolution)問題

  • 圖 - AOE & 關鍵路徑

  • 關鍵路徑在項目管理計算工期等方面有廣泛等應用,提升工期就是所見縮減所有關鍵路徑上的工期,並且在實現時需要應用到之前拓撲排序的算法(前提: 有向無環圖,有依賴關係)

排序算法詳解

A. 常見排序概要:重點理解幾個排序之間的對比,時間和空間複雜度,以及應用。PS:越簡單越要提高認知效率,做到戰略上藐視戰術上重視。

  • 排序 - Overview

B. 常見排序詳解:具體分析各種排序及其複雜度,查漏補缺;在綜合複雜度及穩定性情況下,通常希爾, 快排歸併需要重點掌握。

  • 排序 - 冒泡排序(Bubble Sort)

  • 它是一種較簡單的排序算法。它會遍歷若干次要排序的數列,每次遍歷時,它都會從前往後依次的比較相鄰兩個數的大小;如果前者比後者大,則交換它們的位置。這樣,一次遍歷之後,最大的元素就在數列的末尾!採用相同的方法再次遍歷時,第二大的元素就被排列在最大元素之前。重複此操作,直到整個數列都有序爲止

  • 排序 - 快速排序(Quick Sort)

  • 它的基本思想是: 選擇一個基準數,通過一趟排序將要排序的數據分割成獨立的兩部分;其中一部分的所有數據都比另外一部分的所有數據都要小。然後,再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。

  • 排序 - 插入排序(Insertion Sort)

  • 直接插入排序(Straight Insertion Sort)的基本思想是: 把n個待排序的元素看成爲一個有序表和一個無序表。開始時有序表中只包含1個元素,無序表中包含有n-1個元素,排序過程中每次從無序表中取出第一個元素,將它插入到有序表中的適當位置,使之成爲新的有序表,重複n-1次可完成排序過程。

  • 排序 - Shell排序(Shell Sort)

  • 希爾排序實質上是一種分組插入方法。它的基本思想是: 對於n個待排序的數列,取一個小於n的整數gap(gap被稱爲步長)將待排序元素分成若干個組子序列,所有距離爲gap的倍數的記錄放在同一個組中;然後,對各組內的元素進行直接插入排序。這一趟排序完成之後,每一個組的元素都是有序的。然後減小gap的值,並重復執行上述的分組和排序。重複這樣的操作,當gap=1時,整個數列就是有序的。

  • 排序 - 選擇排序(Selection sort)

  • 它的基本思想是: 首先在未排序的數列中找到最小(or最大)元素,然後將其存放到數列的起始位置;接着,再從剩餘未排序的元素中繼續尋找最小(or最大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

  • 排序 - 堆排序(Heap Sort)

  • 堆排序是指利用堆這種數據結構所設計的一種排序算法。堆是一個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。

  • 排序 - 歸併排序(Merge Sort)

  • 將兩個的有序數列合併成一個有序數列,我們稱之爲"歸併"。歸併排序(Merge Sort)就是利用歸併思想對數列進行排序。

  • 排序 - 桶排序(Bucket Sort)

  • 桶排序(Bucket Sort)的原理很簡單,將數組分到有限數量的桶子裏。每個桶子再個別排序(有可能再使用別的排序算法或是以遞歸方式繼續使用桶排序進行排序)

  • 排序 - 基數排序(Radix Sort)

  • 它的基本思想是: 將整數按位數切割成不同的數字,然後按每個位數分別比較。具體做法是: 將所有待比較數值統一爲同樣的數位長度,數位較短的數前面補零。然後,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以後, 數列就變成一個有序序列

算法思想詳解

A. 算法思想 詳解:緊接着我們通過理解算法背後常用的算法思想,進行歸納總結,並通過leetcode練習來輔助理解和提升。

  • 算法思想 - 分治算法

  • 分治算法的基本思想是將一個規模爲N的問題分解爲K個規模較小的子問題,這些子問題相互獨立且與原問題性質相同。求出子問題的解,就可得到原問題的解

  • 算法思想 - 動態規劃算法

  • 動態規劃算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每一個解都對應於一個值,我們希望找到具有最優值的解。動態規劃算法與分治法類似,其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然後從這些子問題的解得到原問題的解

  • 算法思想 - 貪心算法

  • 本文主要介紹算法中貪心算法的思想: 保證每次操作都是局部最優的,並且最後得到的結果是全局最優的

  • 算法思想 - 二分法

  • 本文主要介紹算法思想中分治算法重要的二分法,比如二分查找;二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。但是,折半查找要求線性表必須採用順序存儲結構,而且表中元素按關鍵字有序排列。

  • 算法思想 - 搜索算法

  • 本文主要介紹算法中搜索算法的思想,主要包含BFS,DFS

  • 算法思想 - 回溯算法

  • Backtracking(回溯)屬於 DFS, 本文主要介紹算法中Backtracking算法的思想。回溯算法實際上一個類似枚舉的搜索嘗試過程,主要是在搜索嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就“回溯”返回,嘗試別的路徑。回溯法是一種選優搜索法,按選優條件向前搜索,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術爲回溯法

領域算法詳解

A. 領域算法 梳理知識點:在瞭解基礎算法之後,我們還要學習和了解在不同專業領域有哪些特有的算法。這裏不一定要求複雜度,而是要有知識面以及解決問題的思路。

  • 一些領域算法 - Overview

B. 領域算法之 安全算法:主要包括摘要算法和加密算法兩大類。

  • 安全算法 - 摘要算法

  • 消息摘要算法的主要特徵是加密過程不需要密鑰,並且經過加密的數據無法被解密,目前可以解密逆向的只有CRC32算法,只有輸入相同的明文數據經過相同的消息摘要算法才能得到相同的密文。消息摘要算法不存在密鑰的管理與分發問題,適合於分佈式網絡上使用。

  • 安全算法 - 加密算法

  • 數據加密的基本過程就是對原來爲明文的文件或數據按某種算法進行處理,使其成爲不可讀的一段代碼爲“密文”,使其只能在輸入相應的密鑰之後才能顯示出原容,通過這樣的途徑來達到保護數據不被非法人竊取、閱讀的目的。該過程的逆過程爲解密,即將該編碼信息轉化爲其原來數據的過程

  • 安全算法 - 國密算法

  • 國密即國家密碼局認定的國產密碼算法。主要有SM1,SM2,SM3,SM4,SM7, SM9。

C. 領域算法之 字符串匹配算法:字符串匹配(String Matchiing)也稱字符串搜索(String Searching)是字符串算法中重要的一種,是指從一個大字符串或文本中找到模式串出現的位置。

  • 樸素的字符串匹配算法(Naive String Matching Algorithm)

  • 樸素的字符串匹配算法又稱爲暴力匹配算法(Brute Force Algorithm),最爲簡單的字符串匹配算法

  • Knuth-Morris-Pratt 字符串匹配算法(即 KMP 算法)

  • Knuth-Morris-Pratt算法(簡稱KMP)是最常用的字符串匹配算法之一

  • Boyer-Moore 字符串匹配算法

  • 各種文本編輯器的"查找"功能(Ctrl+F),大多采用Boyer-Moore算法,效率非常高

  • 字符串匹配 - 文本預處理:後綴樹(Suffix Tree)

  • 上述字符串匹配算法(樸素的字符串匹配算法, KMP 算法, Boyer-Moore算法)均是通過對模式(Pattern)字符串進行預處理的方式來加快搜索速度。對 Pattern 進行預處理的最優複雜度爲 O(m),其中 m 爲 Pattern 字符串的長度。那麼,有沒有對文本(Text)進行預處理的算法呢?本文即將介紹一種對 Text 進行預處理的字符串匹配算法:後綴樹(Suffix Tree)

D. 領域算法之 大數據處理:這裏其實想讓大家理解的是大數據處理的常用思路,而不是算法本身。

  • 大數據處理 - Overview

  • 本文主要介紹大數據處理的一些思路

  • 大數據處理 - 分治/hash/排序

  • 就是先映射,而後統計,最後排序:

  • 分而治之/hash映射: 針對數據太大,內存受限,只能是: 把大文件化成(取模映射)小文件,即16字方針: 大而化小,各個擊破,縮小規模,逐個解決

  • hash_map統計: 當大文件轉化了小文件,那麼我們便可以採用常規的hash_map(ip,value)來進行頻率統計。

  • 堆/快速排序: 統計完了之後,便進行排序(可採取堆排序),得到次數最多的IP。

  • 大數據處理 - Bitmap & Bloom Filter

  • 布隆過濾器有着廣泛的應用,對於大量數據的“存不存在”的問題在空間上有明顯優勢,但是在判斷存不存在是有一定的錯誤率(false positive),也就是說,有可能把不屬於這個集合的元素誤認爲屬於這個集合(False Positive),但不會把屬於這個集合的元素誤認爲不屬於這個集合(False Negative)

  • 大數據處理 - 雙層桶劃分

  • 其實本質上還是分而治之的思想,重在“分”的技巧上!適用範圍: 第k大,中位數,不重複或重複的數字;基本原理及要點: 因爲元素範圍很大,不能利用直接尋址表,所以通過多次劃分,逐步確定範圍,然後最後在一個可以接受的範圍內進行。

  • 大數據處理 - Trie樹/數據庫/倒排索引

  • 適用範圍: 數據量大,重複多,但是數據種類小可以放入內存;基本原理及要點: 實現方式,節點孩子的表示方式;擴展: 壓縮實現

  • 大數據處理 - 外排序

  • 適用範圍: 大數據的排序,去重;基本原理及要點: 外排序的歸併方法,置換選擇敗者樹原理,最優歸併樹

  • 大數據處理 - Map & Reduce

  • MapReduce是一種計算模型,簡單的說就是將大批量的工作(數據)分解(MAP)執行,然後再將結果合併成最終結果(REDUCE)。這樣做的好處是可以在任務被分解後,可以通過大量機器進行並行計算,減少整個操作的時間。但如果你要我再通俗點介紹,那麼,說白了,Mapreduce的原理就是一個歸併排序

E. 領域算法之 分佈式算法:接着向大家介紹分佈式算法,包括一致性Hash算法,經典的Paxos算法,Raft算法,ZAB算法等;順便也介紹了經典用於全局ID生成的Snowflake算法。

  • 分佈式算法 - Overview

  • 本文總結下常見的分佈式算法

  • 分佈式算法 - 一致性Hash算法

  • 一致性Hash算法是個經典算法,Hash環的引入是爲解決單調性(Monotonicity)的問題;虛擬節點的引入是爲了解決平衡性(Balance)問題

  • 分佈式算法 - Paxos算法

  • Paxos算法是Lamport宗師提出的一種基於消息傳遞的分佈式一致性算法,使其獲得2013年圖靈獎。自Paxos問世以來就持續壟斷了分佈式一致性算法,Paxos這個名詞幾乎等同於分佈式一致性, 很多分佈式一致性算法都由Paxos演變而來

  • 分佈式算法 - Raft算法

  • Paxos是出了名的難懂,而Raft正是爲了探索一種更易於理解的一致性算法而產生的。它的首要設計目的就是易於理解,所以在選主的衝突處理等方式上它都選擇了非常簡單明瞭的解決方案

  • 分佈式算法 - ZAB算法

  • ZAB 協議全稱:Zookeeper Atomic Broadcast(Zookeeper 原子廣播協議), 它應該是所有一致性協議中生產環境中應用最多的了。爲什麼呢?因爲他是爲 Zookeeper 設計的分佈式一致性協議!

  • 分佈式算法 - Snowflake算法

  • Snowflake,雪花算法是由Twitter開源的分佈式ID生成算法,以劃分命名空間的方式將 64-bit位分割成多個部分,每個部分代表不同的含義。這種就是將64位劃分爲不同的段,每段代表不同的涵義,基本就是時間戳、機器ID和序列數。爲什麼如此重要?因爲它提供了一種ID生成及生成的思路,當然這種方案就是需要考慮時鐘回撥的問題以及做一些 buffer的緩衝設計提高性能。

F. 領域算法之 其它算法彙總:最後概要性的瞭解常見的其它算法:負載均衡算法,推薦算法,數據挖掘或機器學習算法。因爲有其專業性,一般總體上了解就夠了。

  • 負載均衡算法 - 彙總

  • 本文主要介紹常用的負載均衡算法和Nginx中支持的負載均衡算法:輪詢法(Round Robin),加權輪詢法(Weight Round Robin),平滑加權輪詢法(Smooth Weight Round Robin),隨機法(Random),加權隨機法(Weight Random),源地址哈希法(Hash),最小連接數法(Least Connections)

  • 推薦算法 - 彙總

  • 本文主要對推薦算法整體知識點做彙總,做到總體的理解;深入理解需要再看專業的材料

  • 數據挖掘 - 10大算法彙總

  • 國際權威的學術組織the IEEE International Conference on Data Mining (ICDM) 2006年12月評選出了數據挖掘領域的十大經典算法: C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, kNN, Naive Bayes, and CART

更多關於Java技術棧的技術文章、技術資源(文檔、視頻)、以及各咱企業面試題,可以關注民工哥技術之路公衆號,回覆關鍵字 1024 獲取全部分享的技術資源。

數據庫理論與實踐

數據庫基礎與理論

A. 瞭解數據庫基礎和理論知識:在學習數據庫之前,不要一上來就是SQL語句;這裏建議從數據結構開始切入到數據庫,然後再理解數據庫是如何工作的,緊接着理解數據庫系統的原理知識點和相關知識體系。

  • SQL DB - 資料彙總

  • SQL DB - 關係型數據庫是如何工作的

  • 很多人在學習數據時都是孤立的學習知識點,這樣是很難將所有知識點串起來深入理解;強烈推薦你學習兩篇文章:Architecture of a Database System (opens new window)以及How does a relational database work (opens new window);本文主要在第二篇基礎上翻譯並梳理,如果你英文不好的話,你可以通過本文幫助你構築數據庫體系的基礎

  • SQL DB - 關係型數據庫設計理論

  • 在上文了解數據庫如何工作後,本節介紹如何將一個關係模型(基於表的數據模型)合理的轉化爲數據表和關係表,以及確定主外健的。這便是數據庫設計理論基礎,包括術語,函數依賴,範式等理論基礎

  • SQL DB - 關係型數據庫設計流程

  • 在上文知道如何設計表和健後,讓我們再看看整個的數據庫設計的標準流程吧,主要包括需求分析, 概念結構設計, 邏輯結構設計 , 物理設計, 實施階段運行和維護階段這6個階段

  • SQL DB - 數據庫系統核心知識點

  • 基於上篇數據庫如何工作的基礎之上,我們再來梳理下數據庫系統中有哪些重要的知識點,包括:事務,併發一致性,封鎖,隔離級別,多版本併發控制等

SQL語言基礎和進階

B. 完全掌握SQL語言:在瞭解數據庫基礎之後,如下章節將重點闡述SQL語言相關的知識;主要順序是:SQL語法->SQL語句練習->SQL題目進階->SQL語句優化建議等。

  • SQL語言 - SQL語法基礎

  • 本文包含了所有SQL語言的基礎語法,並用例子的方式向你展示

  • SQL語言 - SQL語句練習

  • 在上文學習了SQL的基本語法以後,本文將通過最經典的“教師-學生-成績”表來幫助你練習SQL。@pdai

  • SQL語言 - SQL題目進階

  • 接下來,通過Leetcode上的SQL題目進行進階吧

  • SQL語言 - SQL語句優化

  • 最後,再總結一些SQL語句的優化建議

SQL DB - MySQL數據庫

C. 掌握MySQL數據庫:在理解了SQL語言後,開始進階MySQL相關的知識點吧(在開始前,建議你完整看一本MySQl相關的書,作爲你的知識體系基礎);這裏不會講如何安裝MySQL或者如何使用,因爲這是容易的,而是會關注一些有助於我們構建MySQL相關知識體系的知識點等。

  • MySQL - 數據類型

  • 本文主要整理MySQL中數據字段類型。

  • MySQL - 存儲引擎

  • 本文主要介紹MySQL中的存儲引擎。

  • MySQL - 索引(B+樹)

  • MySQL - 性能優化

  • MySQL - 分表分庫

  • MySQL - 主從複製與讀寫分離

  • MySQL - 一條 SQL 的執行過程詳解

  • 一條 SQL 的執行過程詳解。

NoSQL DB - Redis詳解

D. 掌握Redis數據庫:在理解了關係型數據庫後,開始進階最爲常用的KV庫Redis,一些大廠都在使用,面試也必問。

首先,我們通過學習Redis的概念基礎,瞭解它適用的場景。

  • Redis入門 - Redis概念和基礎

  • Redis是一種支持key-value等多種數據結構的存儲系統。可用於緩存,事件發佈或訂閱,高速隊列等場景。支持網絡,提供字符串,哈希,列表,隊列,集合結構直接存取,基於內存,可持久化。

其次,這些適用場景都是基於Redis支持的數據類型的,所以我們需要學習它支持的數據類型;同時在redis優化中還需要對底層數據結構瞭解,所以也需要了解一些底層數據結構的設計和實現。

  • Redis入門 - 數據類型:5種基礎數據類型詳解

  • Redis所有的key(鍵)都是字符串。我們在談基礎數據結構時,討論的是存儲值的數據類型,主要包括常見的5種數據類型,分別是:String、List、Set、Zset、Hash

  • Redis入門 - 數據類型:3種特殊類型詳解

  • Redis除了上文中5種基礎數據類型,還有三種特殊的數據類型,分別是 HyperLogLogs(基數統計), Bitmaps (位圖) 和 geospatial (地理位置)

  • Redis入門 - 數據類型:Stream詳解

  • Redis5.0 中還增加了一個數據結構Stream,它借鑑了Kafka的設計,是一個新的強大的支持多播的可持久化的消息隊列。

  • Redis進階 - 底層數據結構:對象機制詳解

  • 我們在前文已經闡述了Redis 5種基礎數據類型詳解,分別是字符串(string)、列表(list)、哈希(hash)、集合(set)、有序集合(zset),以及5.0版本中Redis Stream結構詳解;那麼這些基礎類型的底層是如何實現的呢?Redis的每種對象其實都由對象結構(redisObject) 與 對應編碼的數據結構組合而成, 本文主要介紹對象結構(redisObject) 部分。。

  • Redis進階 - 底層數據結構:底層數據結構詳解

  • 前文是第一部分底層設計:對象機制詳解, 本文主要介紹底層數據結構 部分。

  • Redis進階 - 底層數據結構:redis對象與編碼(底層結構)對應關係詳解

  • 在學習完底層數據結構之後,我們終於可以結合前文內容闡述redis對象及編碼之間的關係了。

再者,需要學習Redis支持的核心功能,包括持久化,消息,事務,高可用;高可用方面包括,主從,哨兵等;高可拓展方面,比如 分片機制等。

  • Redis進階 - 持久化:RDB和AOF機制詳解

  • 爲了防止數據丟失以及服務重啓時能夠恢復數據,Redis支持數據的持久化,主要分爲兩種方式,分別是RDB和AOF; 當然實際場景下還會使用這兩種的混合模式。

  • Redis進階 - 消息傳遞:發佈訂閱模式詳解

  • Redis 發佈訂閱(pub/sub)是一種消息通信模式:發送者(pub)發送消息,訂閱者(sub)接收消息。

  • Redis進階 - 事件:Redis事件機制詳解

  • Redis 採用事件驅動機制來處理大量的網絡IO。它並沒有使用 libevent 或者 libev 這樣的成熟開源方案,而是自己實現一個非常簡潔的事件驅動庫 ae_event。

  • Redis進階 - 事務:Redis事務詳解

  • Redis 事務的本質是一組命令的集合。事務支持一次執行多個命令,一個事務中所有命令都會被序列化。在事務執行過程,會按照順序串行化執行隊列中的命令,其他客戶端提交的命令請求不會插入到事務執行命令序列中。

  • Redis進階 - 高可用:主從複製詳解

  • 我們知道要避免單點故障,即保證高可用,便需要冗餘(副本)方式提供集羣服務。而Redis 提供了主從庫模式,以保證數據副本的一致,主從庫之間採用的是讀寫分離的方式。本文主要闡述Redis的主從複製。

  • Redis進階 - 高可用:哨兵機制(Redis Sentinel)詳解

  • 在上文主從複製的基礎上,如果注節點出現故障該怎麼辦呢?在 Redis 主從集羣中,哨兵機制是實現主從庫自動切換的關鍵機制,它有效地解決了主從複製模式下故障轉移的問題。

  • Redis進階 - 高可拓展:分片技術(Redis Cluster)詳解

  • 前面兩篇文章,主從複製和哨兵機制保障了高可用,就讀寫分離而言雖然slave節點來擴展主從的讀併發能力,但是寫能力和存儲能力是無法進行擴展的,就只能是master節點能夠承載的上限。如果面對海量數據那麼必然需要構建master(主節點分片)之間的集羣,同時必然需要吸收高可用(主從複製和哨兵機制)能力,即每個master分片節點還需要有slave節點,這是分佈式系統中典型的縱向擴展(集羣的分片技術)的體現;所以在Redis 3.0版本中對應的設計就是Redis Cluster。

最後,就是具體的實踐以及實踐中遇到的問題和解決方法了:在不同版本中有不同特性,所以還需要了解版本;以及性能優化,大廠實踐等。

  • Redis進階 - 緩存問題:一致性, 穿擊, 穿透, 雪崩, 污染等

  • Redis最常用的一個場景就是作爲緩存,本文主要探討作爲緩存,在實踐中可能會有哪些問題?比如一致性, 穿擊, 穿透, 雪崩, 污染等

  • Redis進階 - 版本特性: Redis4.0、5.0、6.0特性整理

  • 在學習Redis知識體系時,我們難免會需要查看版本實現之間的差異,本文主要整理Redis較爲新的版本的特性。

  • Redis進階 - 運維監控:Redis的監控詳解

  • Redis實戰中包含開發,集羣 和 運維,Redis用的好不好,如何讓它更好,這是運維要做的;本文主要在 Redis自身狀態及命令,可視化監控工具,以及Redis監控體系等方面幫助你構建對redis運維/監控體系的認知,它是性能優化的前提。

  • Redis進階 - 性能調優:Redis性能調優詳解

  • Redis 的性能問題,涉及到的知識點非常廣,幾乎涵蓋了 CPU、內存、網絡、甚至磁盤的方方面面;同時還需要對上文中一些基礎或底層有詳細的瞭解。針對Redis的性能調優,這裏整理分享一篇水滴與銀彈(公衆號)的文章,這篇文章可以幫助你構築Redis性能調優的知識體系。

  • Redis大廠經驗 - 微博:萬億級日訪問量下,Redis在微博的9年優化歷程

  • 再分享一篇微博使用redis的經驗的文章,因爲Redis在微博內部分佈在各個應用場景,比如像現在春晚必爭的“紅包飛”活動,還有像粉絲數、用戶數、閱讀數、轉評贊、評論蓋樓、廣告推薦、負反饋、音樂榜單等等都有用到Redis;我們可以通過大廠使用redis的經驗來強化對redis使用上的認知。

NoSQL DB - MongoDB詳解

E. 掌握MongoDB數據庫:在理解了Redis後,讓我們認識NoSQL數據庫中最爲常用的MongoDB;它在後期版本中更換了證書,使用時需要注意下;但是不妨礙我們學習。

MongoDB生態

1. MongoDB引入和生態介紹:首先了解NoSQL基本的概念以及MongoDB基礎概念,進而引入MongoDB的生態。

  • Mongo入門 - MongoDB基礎概念

  • 在學習MongoDB之前先簡單瞭解相關概念。

  • Mongo入門 - MongoDB整體生態

  • 很多人在學習Mongo時僅僅圍繞着數據庫功能,圍繞着CRUD和聚合操作,但是MongoDB其實已經基本形成了它自身的生態了。我們在學習一項技能時一定要跳出使用的本身,要從高一點的格局上了解整個生態,這樣會對你構築知識體系有很大的幫助。。

2. MongoDB入門 - 基本使用:開始學習MongoDB安裝,使用等。

  • Mongo入門 - 基本使用:安裝和CRUD

  • 在理解MongoDB基礎概念後,本文將介紹MongoDB的安裝和最基本的CURD操作。

  • Mongo入門 - 基本使用:索引和聚合

  • 在瞭解MongoDB的基本CRUD操作後,常用的其它操作還有對字段的索引以及對字段的聚合操作。

  • Mongo入門 - 基本使用:效率工具

  • 本文將主要介紹常用的MongoDB的工具,這些工具可以極大程度的提升你的效率。

  • Mongo入門 - 基本使用:Java 低階API

  • 本文爲低優先級,只是向你介紹下MongoDB提供的原生的JavaAPI;而大多數公司使用Spring框架,會使用Spring Data對MongoDB原生API的封裝,比如JPA,MongoTemplate等。

  • Mongo入門 - 基本使用:Spring Data + Mongo

  • 本文爲主要介紹Spring Data對MongoDB原生API的封裝,比如JPA,MongoTemplate等。以及原生API和Spring data系列之間的關係。

3. MongoDB進階 - 原理和WiredTigger存儲引擎:在學習完常用的基礎之後,我們再看下MongoDB的原理和WiredTigger存儲引擎。

  • Mongo進階 - MongoDB體系結構

  • 上面章節已經對MongoDB生態中工具以及使用有了基礎,後續文章我們將開始理解MongoDB是如何支撐這些功能的。我們將從最基本的MongoDB的體系結構開始介紹,主要包括MongoDB的包結構MongoDB的數據邏輯結構MongoDB的數據文件結構。其中圍繞着MongoDB的數據文件結構,將爲我們後續介紹MongoDB的存儲引擎詳解打下基礎。

  • Mongo進階 - 原理和WiredTiger引擎

  • 開始初步瞭解MongoDB實現原理和WiredTiger引擎。

  • Mongo進階 - WT引擎:數據結構

  • MongoDB的WiredTiger存儲引擎背後採用了什麼樣的數據結構呢?本文將從常見引擎數據結構典型B-Tree數據結構磁盤數據結構, 內存數據結構, Page數據結構等方面詳解介紹。。

  • Mongo進階 - WT引擎:Page生命週期

  • 通過前文我們瞭解到數據以page爲單位加載到cache; 有必要系統的分析一頁page的生命週期、狀態以及相關參數的配置,這對後續MongoDB的性能調優和故障問題的定位和解決有幫助。

  • Mongo進階 - WT引擎:checkpoint原理

  • Checkpoint主要有兩個目的: 一是將內存裏面發生修改的數據寫到數據文件進行持久化保存,確保數據一致性;二是實現數據庫在某個時刻意外發生故障,再次啓動時,縮短數據庫的恢復時間,WiredTiger存儲引擎中的Checkpoint模塊就是來實現這個功能的。

4. MongoDB進階 - 數據庫核心知識點:再者我們還學要進一步學習MongoDB的核心知識點。

  • Mongo進階 - DB核心:索引實現

  • 數據庫核心知識點之索引

  • Mongo進階 - DB核心:複製集

  • 數據庫核心知識點之複製集

  • Mongo進階 - DB核心:分片Sharding

  • 數據庫核心知識點之復分片Sharding

  • Mongo進階 - DB核心:備份恢復

  • 數據庫核心知識點之備份恢復

5. MongoDB進階 - 數據模型設計:在真正使用中,需要知道如何設計數據模型。

  • Mongo進階 - 系統設計:數據模型

  • MongoDB使用文檔數據模型。

  • Mongo進階 - 系統設計:模式構建

  • MongoDB使用文檔數據模型具有內在的靈活性,允許數據模型支持你的應用程序需求, 靈活性也可能導致模式比它們應有樣子的更復雜。這涉及到如何在MongoDB中設計數據庫模式(schema),有一個嚴峻的現實,大多數性能問題都可以追溯到糟糕的模式設計。

6. MongoDB進階 - 性能優化:最後基於上述知識點,我們再瞭解下常見的性能優化的方式。

  • Mongo進階 - 性能:查詢聚合優化

  • 在MongoDB中通過查詢聚合語句分析定位慢查詢/聚合分析

NoSQL DB - ElasticSearch

E. 掌握ElasticSearch數據庫:在理解了MongoDB後,讓我們再學習下搜索的索引庫;日誌收集ELK棧是非常常見的,同時在一些離線大數據分析中也經常使用。

首先,我們通過學習ElasticSearch的概念基礎,瞭解Elastic Stack生態和場景方案。

  • ES詳解 - 認知:ElasticSearch基礎概念

  • 在學習ElasticSearch之前,先簡單瞭解下ES流行度,使用背景,以及相關概念等

  • ES詳解 - 認知:Elastic Stack生態和場景方案

  • 在瞭解ElaticSearch之後,我們還要了解Elastic背後的生態即我們常說的ELK;與此同時,還會給你展示ElasticSearch的案例場景,讓你在學習ES前對它有個全局的印象。

然後,搭建ElasticSearch和Kibana,進而從查詢和聚合的角度入門學習。

  • ES詳解 - 安裝:ElasticSearch和Kibana安裝

  • 瞭解完ElasticSearch基礎和Elastic Stack生態後,我們便可以開始學習使用ElastiSearch了。所以本文主要介紹ElasticSearch和Kibana的安裝。

  • ES詳解 - 入門:查詢和聚合的基礎使用

  • 安裝完ElasticSearch 和 Kibana後,爲了快速上手,我們通過官網GitHub提供的一個數據進行入門學習,主要包括查詢數據和聚合數據。

入門後,需要從兩大方面深入ElasticSearch常用功能:第一方面是索引管理;第二方面是查詢和聚合。

  • ES詳解 - 索引:索引管理詳解

  • 瞭解基本使用後,我們從索引操作的角度看看如何對索引進行管理。

  • ES詳解 - 索引:索引模板(Index Template)詳解

  • 前文介紹了索引的一些操作,特別是手動創建索引,但是批量和腳本化必然需要提供一種模板方式快速構建和管理索引,這就是本文要介紹的索引模板(Index Template),它是一種告訴Elasticsearch在創建索引時如何配置索引的方法。爲了更好的複用性,在7.8中還引入了組件模板。

  • ES詳解 - 查詢:DSL查詢之複合查詢詳解

  • 在查詢中會有多種條件組合的查詢,在ElasticSearch中叫複合查詢。它提供了5種複合查詢方式:bool query(布爾查詢)、boosting query(提高查詢)、constant_score(固定分數查詢)、dis_max(最佳匹配查詢)、function_score(函數查詢)。

  • ES詳解 - 查詢:DSL查詢之全文搜索詳解

  • DSL查詢極爲常用的是對文本進行搜索,我們叫全文搜索,本文主要對全文搜索進行詳解。

  • ES詳解 - 查詢:DSL查詢之Term詳解

  • DSL查詢另一種極爲常用的是對詞項進行搜索,官方文檔中叫”term level“查詢,本文主要對term level搜索進行詳解。

  • ES詳解 - 聚合:聚合查詢之Bucket聚合詳解

  • 除了查詢之外,最常用的聚合了,ElasticSearch提供了三種聚合方式:桶聚合(Bucket Aggregration),指標聚合(Metric Aggregration) 和 管道聚合(Pipline Aggregration),本文主要介紹桶聚合(Bucket Aggregration)。

  • ES詳解 - 聚合:聚合查詢之Metric聚合詳解

  • 前文主要講了 ElasticSearch提供的三種聚合方式之桶聚合(Bucket Aggregration),本文主要講講指標聚合(Metric Aggregration)。

  • ES詳解 - 聚合:聚合查詢之Pipline聚合詳解

  • 前文主要講了 ElasticSearch提供的三種聚合方式之指標聚合(Metric Aggregration),本文主要講講管道聚合(Pipeline Aggregration)。

進一步進階,瞭解並深入ElasticSearch底層的原理等。

  • ES詳解 - 原理:從圖解構築對ES原理的初步認知

  • 在學習ElasticSearch原理時,我推薦你先通過官方博客中的一篇圖解文章(雖然是基於2.x版本)來構築對ES的初步認知(這種認識是體系上的快速認知)。

  • ES詳解 - 原理:ES原理知識點補充和整體結構

  • 通過上文圖解了解了ES整體的原理後,我們便可以基於此知識體系下梳理下ES的整體結構以及相關的知識點, 這將幫助你更好的ElasticSearch索引文檔和搜索文檔的原理。

  • ES詳解 - 原理:ES原理之索引文檔流程詳解

  • ElasticSearch中最重要原理是文檔的索引和文檔的讀取,本文帶你理解ES文檔的索引過程。

  • ES詳解 - 原理:ES原理之讀取文檔流程詳解

  • ElasticSearch中最重要原理是文檔的索引和文檔的讀取,前文介紹了索引文檔流程,本文帶你理解ES文檔的讀取過程。

最後,學習ElasticSearch實踐,大廠經驗,運維,資料等。

  • ES詳解 - 優化:ElasticSearch性能優化詳解

  • Elasticsearch 作爲一個開箱即用的產品,在生產環境上線之後,我們其實不一定能確保其的性能和穩定性。如何根據實際情況提高服務的性能,其實有很多技巧。這章我們分享從實戰經驗中總結出來的 elasticsearch 性能優化,主要從硬件配置優化、索引優化設置、查詢方面優化、數據結構優化、集羣架構優化等方面講解。

  • ES詳解 - 大廠實踐:騰訊萬億級 Elasticsearch 技術實踐

  • ElasticSearch - 備份和遷移

更多關於Java技術棧的技術文章、技術資源(文檔、視頻)、以及各咱企業面試題,可以關注民工哥技術之路公衆號,回覆關鍵字 1024 獲取全部分享的技術資源。

開發與常用基礎

開發之常用類庫

A. 開發之常用類庫:區別於學習,在開發應用時正確使用一些開源第三方工具包可以極大的提升開發效率,本章主要介紹運用極爲廣泛的工具包,比如Apache Common,Google Guava,Hutool等。

  • 常用類庫 - Apache Common包

  • 工具類第一選擇1 - Apache common包不僅被成千上萬開源工具使用,更是學習Java編程比較好的代碼參考工具,效率工具。

  • 常用類庫 - Google Guava包

  • 工具類第一選擇2- Google出品,必屬精品。

  • 常用類庫 - Hutool包

  • 國產的工具類庫,有點是比較全,也比較實用;選它要注意下它的協議是中國第一個開源協議木蘭寬鬆許可證, 第1版 (opens new window),商業型項目最好諮詢下相關法務部門。

  • 常用類庫 - Spring常用工具類

  • Spring作爲常用的開發框架,在Spring框架應用中,排在ApacheCommon,Guava, Huool等通用庫後,第二優先級可以考慮使用Spring-core-xxx.jar中的util包。

  • 常用類庫 - 日誌相關類庫詳解

  • Java日誌庫是最能體現Java庫在進化中的淵源關係的,在理解時重點理解日誌框架本身和日誌門面,以及比較好的實踐等。要關注其歷史淵源和設計(比如橋接),而具體在使用時查詢接口即可。

  • 常用類庫 - JSON類庫詳解

  • JSON應用非常廣泛,對常用對FastJson,Jackson和Gson作了具體闡述;其中考慮到FastJson代碼質量,漏洞,坑等等,應該儘量避免使用。

  • 常用類庫 - Lombok工具庫詳解

  • Lombok是一款非常實用Java工具,可用來幫助開發人員消除Java的冗長代碼,尤其是對於簡單的Java對象(POJO)。實際上我並不推薦使用Lombok(不主動使用它), 但是因爲它有着很大的使用量,我們仍然有必要掌握它,不僅知道如何使用和它解決的問題,還要知道它的坑。

  • 常用類庫 - MapStruct工具庫詳解

  • MapStruct是一款非常實用Java工具,主要用於解決對象之間的拷貝問題,比如PO/DTO/VO/QueryParam之間的轉換問題。區別於BeanUtils這種通過反射,它通過編譯器編譯生成常規方法,將可以很大程度上提升效率。

  • 常用類庫 - 其它常用類庫

  • 其它常用類庫體系很龐大,但是工具類的原則是隻需要查找會使用即可。

開發之代碼質量保障

B1. 開發之單元測試:單元測試是從開發側保證軟件質量的第一步,本章將具體介紹單元測試相關的內容和工具,比如Junit,Mockito等。

  • 單元測試:淺談單元測試

  • 單元測試(unit testing),是指對軟件中的最小可測試單元進行檢查和驗證。這是基礎,所以圍繞着單元測試,我從網上搜集和總結了相關的概念,以助你完善體系。

  • 單元測試:Junit4 詳解

  • JUint是Java編程語言的單元測試框架,用於編寫和運行可重複的自動化測試。本文主要針對Junit4要點進行梳理總結。

  • 單元測試:Junit5 詳解

  • JUnit 5是JUnit的下一代。目標是爲JVM上的開發人員端測試創建一個最新的基礎。這包括專注於Java 8及更高版本,以及啓用許多不同風格的測試。

  • 單元測試:Mockito 詳解

  • Mock通常是指,在測試一個對象A時,我們構造一些假的對象來模擬與A之間的交互,而這些Mock對象的行爲是我們事先設定且符合預期。通過這些Mock對象來測試A在正常邏輯,異常邏輯或壓力情況下工作是否正常。而Mockito是最流行的Java mock框架之一。

  • 單元測試:IDEA下單元測試詳解

  • 工欲善其事必先利其器,我們在寫單元測試一定要使用工具,這將能大幅度提升編碼的效率。本文以IDEA爲例,看看如何利用插件提升效率。

  • 單元測試 - SpringBoot2+Mockito實戰

  • 在真實的開發中,我們通常是使用SpringBoot的,目前SpringBoot是v2.4.x的版本(SpringBoot 2.2.2.RELEASE之前默認是使用 JUnit4,之後版本默認使用Junit5);所以我們寫個基於SpringBoot2.4+H2的內存庫的簡單例子,同時加點必要的單元測試。

B2. 開發之代碼質量:項目的代碼通常是一個團隊共同完成的,要保障代碼質量的首要前提就是統一代碼的風格,命名規範,靜態代碼檢查等等。

  • 代碼質量 - 統一風格:統一代碼格式化詳解

  • 項目的代碼通常是一個團隊共同完成的,要保障代碼質量的首要前提就是統一代碼的風格,本文將介紹常用的統一風格的措施之統一代碼格式化。

  • 代碼質量 - 統一風格:統一命名規範詳解

  • 好的代碼本身就是註釋, 所以我們需要統一命名風格,本文將介紹常用的統一風格的措施之統一命名規範。

  • 代碼質量 - 統一風格:靜態樣式檢查詳解

  • 統一樣式檢查規範裏,最爲常用的統一樣式工具是checkstyle插件,本文將介紹常用的統一風格的措施之靜態樣式檢查。

  • 代碼質量 - 代碼質量管理: Sonarlint插件詳解

  • 在提交代碼前,爲提升代碼質量還需要使用一些靜態代碼工具檢查代碼質量,最爲常用的是Sonar;在本地IDE中可以配置Sonarlint插件進行檢查。

  • 代碼質量 - 代碼質量管理: SpotBugs插件詳解

  • SpotBugs是Findbugs的繼任者(Findbugs已經於2016年後不再維護),用於對代碼進行靜態分析,查找相關的漏洞;在本地IDE中可以配置SpotBugs插件進行檢查。

開發之正則表達式

C. 開發之正則表達式:正則表達式運用極爲廣泛,但是知識點又多;在學習時,總體上理解,對常用的知悉,開發時可以快速查詢使用即可。

  • 正則表達式 - 知識點學習

  • 正則表達式的語法知識點

  • 正則表達式 - 常用正則表達式

  • 常用的正則表達式,供使用時查詢

  • 正則表達式 - 在線工具彙總

  • 主要總結常用的在線正則表達式相關的工具,從而高效的寫出正確的表達式。

開發之網絡協議

D. 開發之網絡協議:對Web開發而言,網絡協議是必學項,本章主要對常見的網絡協議進行梳理,並重點分析常用TCP/IP協議等,這篇網絡基礎和協議 - Overview將指導你如何學習這個系列。

第一步:學習計算機網絡基礎;構築任何基礎體系之前,需要學習這個專題的整體知識點(最好是一本完整的書),這裏主要基於《計算機網絡(第五版)》知識點梳理,不得不說這本書作者謝希仁畫的PPT還是挺棒的。網絡基礎分三部分內容,主要包含如下:

  • 網絡基礎之一 - 計算機網絡基礎部分梳理

  • 網絡基礎的第一篇,主要來源於大學的課程《計算機網絡(第五版)》知識點梳理,內容整理自這裏 (opens new window), 但是作了調整和優化; 不得不說這本書作者謝希仁畫的PPT還是挺棒的。

  • 網絡基礎之二 - 網絡7層協議,4層,5層

  • 網絡基礎的第二篇,我覺的一定要有全局框架觀,構建全局觀時建議分三步:第一步,理解全局的網絡層次;第二步,理解每一層次中的常見的網絡設備及功能;第三步,理解每一層中的常見協議。在此基礎上,將其它知識點放置在相應的層次(很多網絡上的零散知識點是沒法幫你構築完整的知識體系的,推薦你完整的看一本關於網絡的書籍來構築基礎)

  • 網絡基礎之三 - IP 協議相關詳解

  • 網絡基礎第三篇,主要闡述:IP協議(在網絡層)及其配套協議(在數據鏈路層的ARP協議,在網絡層的ICMP,IGMP協議,IPV6詳解,網絡地址轉換 NAT等。

第二步:學習傳輸層協議TCP/UDP;TCP/UDP是後面應用層協議的基礎。

  • 網絡協議 - TCP 協議詳解

  • TCP是一個巨複雜的協議,關於TCP這個協議的細節,我還是推薦你去看W.Richard Stevens的《TCP/IP 詳解 卷1:協議》 (opens new window)。全網上講TCP/IP的文章衆多,多數是皮毛;本文梳理自 左耳朵耗子的文章《TCP 的那些事兒》 (opens new window),來幫助大家理解TCP/IP, 其中引用的圖片在這裏 (opens new window)

  • 網絡協議 - UDP 協議詳解

  • 基於TCP和UDP的協議非常廣泛,所以也有必要對UDP協議進行詳解

第三步:學習應用層協議;HTTP 基於TCP協議實現,web開發必學;DNS 基於UDP協議實現。

  • 網絡協議 - HTTP 協議詳解

  • HTTP 協議詳解,web開發必備

  • 網絡協議 - DNS 相關詳解

  • DNS的核心工作就是將域名翻譯成計算機IP地址, 它是基於UDP協議實現的,本文將具體闡述DNS相關的概念,解析,調度原理(負載均衡和區域調度)等DNS相關的所有知識點

第四步:知識點貫穿理解;

  • 知識點串聯:輸入URL 到頁面加載過程詳解

  • 第一,將前面涉及網絡協議特別是TCP協議HTTP協議DNS解析等等知識點貫穿;

  • 第二,在此基礎上介紹瀏覽器渲染過程,以及爲Web優化提供基礎。

第五步:相關工具等;

  • 工具: netstat查看服務及監聽端口詳解

  • 在Linux使用過程中,需要了解當前系統開放了哪些端口,並且要查看開放這些端口的具體進程和用戶,可以通過netstat命令進行簡單查詢。

  • 工具: 網絡抓包神器 tcpdump 使用詳解

  • tcpdump 是一款強大的網絡抓包工具,它使用 libpcap 庫來抓取網絡數據包,這個庫在幾乎在所有的 Linux/Unix 中都有。熟悉 tcpdump 的使用能夠幫助你分析調試網絡數據,本文將通過一個個具體的示例來介紹它在不同場景下的使用方法。。

  • 工具: Wireshark介紹及抓包分析

  • Wireshark(前稱Ethereal)是一個網絡封包分析軟件.網絡管理員使用Wireshark來檢測網絡問題,網絡安全工程師使用Wireshark來檢查資訊安全相關問題,開發者使用Wireshark來爲新的通訊協定除錯,普通使用者使用Wireshark來學習網絡協定的相關知識。

開發之安全相關

E. 開發之安全相關:保障開發出的軟件安全是非常重要的,本章主要對開發知識體系,OWASP Top 10梳理,以及對常見的漏洞進行詳解; 這篇開發安全 - Overview將指導你如何學習這個系列。

第一步:業內趨勢和常見漏洞;在學習安全需要總體瞭解安全趨勢和常見的Web漏洞,首推瞭解OWASP,因爲它代表着業內Web安全漏洞的趨勢

  • 開發安全 - OWASP Top 10

第二步:重點知識點詳解;這裏將具體對常見對幾種攻擊方式進行闡述,包括注入攻擊,CSRF,XSS等。

  • 開發安全 - 注入攻擊詳解

  • 注入攻擊最爲常見的攻擊方式,作爲開發而言必須完全避免; 本文會介紹常見的幾種注入方式,比如:SQL 注入, xPath 注入, 命令注入, LDAP注入, CLRF注入, Host頭注入, Email頭注入等等,總結來看其本質其實是一樣的,且防禦措施也大同小異。

  • 開發安全 - CSRF 詳解

  • CSRF(Cross-site request forgery跨站請求僞造,也被稱成爲“one click attack”或者session riding,通常縮寫爲CSRF或者XSRF,是一種對網站的惡意利用。

  • 開發安全 - XSS 詳解

  • XSS是跨站腳本攻擊(Cross Site Scripting),爲不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫爲XSS。惡意攻擊者往Web頁面裏插入惡意Script代碼,當用戶瀏覽該頁之時,嵌入其中Web裏面的Script代碼會被執行,從而達到惡意攻擊用戶的目的

  • 開發安全 - DDoS 詳解

  • 分佈式拒絕服務攻擊(英文意思是Distributed Denial of Service,簡稱DDoS)是指處於不同位置的多個攻擊者同時向一個或數個目標發動攻擊,或者一個攻擊者控制了位於不同位置的多臺機器並利用這些機器對受害者同時實施攻擊。由於攻擊的發出點是分佈在不同地方的,這類攻擊稱爲分佈式拒絕服務攻擊,其中的攻擊者可以有多個

  • 開發安全 - 點擊劫持詳解

  • 點擊劫持其實是一種視覺上的欺騙手段,攻擊者將一個透明的、不可見的iframe覆蓋在一個網頁上,通過調整iframe頁面位置,誘使用戶在頁面上進行操作,在不知情的情況下用戶的點擊恰好是點擊在iframe頁面的一些功能按鈕上

第三步:學習和實踐:一個比較好對學習常見web漏洞的平臺 - Web安全測試平臺(DVMA)

  • 開發安全實戰 - Web安全測試平臺(DVMA)

  • DVWA(Damn Vulnerable Web Application)是一個用來進行安全脆弱性鑑定的PHP/MySQL Web應用,旨在爲安全專業人員測試自己的專業技能和工具提供合法的環境,幫助web開發者更好的理解web應用安全防範的過程。

第四步:滲透測試:用滲透測試的整個流程,幫你理解項目發佈時安全團隊如何做滲透測試來儘量避免漏洞

  • 開發安全實戰 - 滲透測試流程示例

  • 在應用程序上線之前,都會進行多次內部或者外部的滲透測試。對於開發而言,有必要了解下滲透測試的整體流程,從而知己知彼,避免一些開發中的問題

Spring 框架

Spring基礎
  • Spring 資料彙總

  • Spring MVC

  • Spring Bean 生命週期

  • Spring AOP 實現原理

Spring Boot入門
  • Spring Boot - Helloworld

  • 使用Intelli IDEA寫一個SpringBoot的HelloWorld

  • Spring Boot - Swagger UI

  • 本例也是一個Spring Boot的Hello World 應用。包含, 對用戶基本數據增刪查改,JPA,H2,Swagger

  • Spring Boot - Logback配置日誌

  • 出於性能等原因,Logback 目前是springboot應用日誌的標配;當然有時候在生產環境中也會考慮和三方中間件採用統一處理方式

  • Spring Boot - ORM Mybatis

  • 國內使用MyBatis還是挺多的,本例展示通過註解方式連接MyBatis

  • Spring Boot - MongoDB CRUD

  • 本例展示一個Mongo CURD 的Demo, 由於我在springboot多數據源示例中已經使用了JPA形式的MongoRepository,所以在這個例子中我將只展示使用MongoTemplate(MongoOptions)方式

  • Spring Boot - Elatiscsearch CRUD

  • 本例展示一個ElasticSearch CURD 的Demo

  • Spring Boot - Thymeleaf

  • 在開發一個小項目的時候,使用的是Spring Boot,Spring Boot 官方推薦的前端模板是thymeleaf, 花了兩天時間將官方的文檔看完並總結了下知識體系結構

  • Spring Boot - Websocket Demo

  • 從網上找的Websocket Demo例子

  • Spring Boot - 訪問外部接口

  • 在Spring-Boot項目開發中,存在着本模塊的代碼需要訪問外面模塊接口,或外部url鏈接的需求, 比如調用外部的地圖API或者天氣API

  • Spring Boot - 實現API限流

  • 高併發的三板斧: 緩存,降級和限流。本文只是關於限流的一個Demo,限流可以有很多方式,具體可以看分佈式限流的章節

  • Spring Boot - 分佈式quartz任務管理

  • 通常我們使用quartz只是實現job單實例運行,本例將展示quartz實現基於數據庫的分佈式任務管理,和控制job生命週期

Spring Boot進階
  • Spring Boot - 多個數據源Service層封裝

  • mysql, es, mongodb 三個數據源用配置文件方式連接,JPA只是正對dao做了封裝,本文主要介紹如何對service層進行封裝

  • Spring Boot - java 註解

  • 本文主要介紹一些SpringBoot中常用的註解

  • Spring Boot - 使用第三方Jar

  • 在項目中我們經常需要使用第三方的Jar,出現這種情況的原因在於,即便我們有Nexus或者其他Artifactory,這裏介紹兩種方案

  • Spring Boot - 自定義Starter封裝

  • 在Springboot封裝一個自定義的Starter的一個Demo,從創建一個模塊->封裝starter->使用

  • Spring Boot - JavaFX 2.0應用

以上內容來自:https://www.pdai.tech/md/outline/x-outline.html

Spring Cloud
  • Spring Cloud入門-十分鐘瞭解Spring Cloud

  • Spring Cloud入門-Eureka服務註冊與發現(Hoxton版本)

  • Spring Cloud入門-Ribbon服務消費者(Hoxton版本)

  • Spring Cloud入門-Hystrix斷路器(Hoxton版本)

  • Spring Cloud入門-Hystrix Dashboard與Turbine斷路器監控(Hoxton版本)

  • Spring Cloud入門-OpenFeign服務消費者(Hoxton版本)

  • Spring Cloud入門-Zuul服務網關(Hoxton版本)

  • Spring Cloud入門-Config分佈式配置中心(Hoxton版本)

  • Spring Cloud入門-Bus消息總線(Hoxton版本)

  • Spring Cloud入門-Sleuth服務鏈路跟蹤(Hoxton版本)

  • Spring Cloud入門-Consul服務註冊發現與配置中心(Hoxton版本)

  • Spring Cloud入門-Gateway服務網關(Hoxton版本)

  • Spring Cloud入門-Admin服務監控中心(Hoxton版本)

  • Spring Cloud入門-Oauth2授權的使用(Hoxton版本)

  • Spring Cloud入門-Oauth2授權之JWT集成(Hoxton版本)

  • Spring Cloud入門-Oauth2授權之基於JWT完成單點登錄(Hoxton版本

  • Spring Cloud入門-Nacos實現註冊和配置中心(Hoxton版本)

  • Spring Cloud入門-Sentinel實現服務限流、熔斷與降級(Hoxton版本)

  • Spring Cloud入門-Seata處理分佈式事務問題(Hoxton版本)

企業面試題

Java面試總結匯總,整理了包括Java基礎知識,集合容器,併發編程,JVM,常用開源框架Spring,MyBatis,數據庫,中間件等,包含了作爲一個Java工程師在面試中需要用到或者可能用到的絕大部分知識。

Web容器 - Tomcat詳解

初始化和啓動流程

  • Tomcat - 如何設計一個簡單的web容器

  • 在學習Tomcat前,很多人先入爲主的對它的認知是巨複雜的;所以第一步,在學習它之前,要打破這種觀念,我們通過學習如何設計一個最基本的web容器來看它需要考慮什麼;進而在真正學習Tomcat時,多把重點放在它的頂層設計上,而不是某一塊代碼上, 思路永遠比具體實現重要的多。

  • Tomcat - 理解Tomcat架構設計

  • 前文我們已經介紹了一個簡單的Servlet容器是如何設計出來,我們就可以開始正式學習Tomcat了,在學習開始,我們有必要站在高點去看看Tomcat的架構設計。

  • Tomcat - 源碼分析準備和分析入口

  • 上文我們介紹了Tomcat的架構設計,接下來我們便可以下載源碼以及尋找源碼入口了。

  • Tomcat - 啓動過程:初始化和啓動流程

  • 在有了Tomcat架構設計和源碼入口以後,我們便可以開始真正讀源碼了。

  • Tomcat - 啓動過程:類加載機制詳解

  • 上文我們講了Tomcat在初始化時會初始化classLoader。本文將具體分析Tomcat的類加載機制,特別是區別於傳統的雙親委派模型的加載機制。

  • Tomcat - 啓動過程:Catalina的加載

  • 通過前兩篇文章,我們知道了Tomcat的類加載機制和整體的組件加載流程;我們也知道通過Bootstrap初始化的catalinaClassLoader加載了Catalina,那麼進而引入了一個問題就是Catalina是如何加載的呢?加載了什麼呢?本文將帶你進一步分析。

  • Tomcat - 組件生命週期管理:LifeCycle

  • 上文中,我們已經知道Catalina初始化了Server(它調用了 Server 類的 init 和 start 方法來啓動 Tomcat);你會發現Server是Tomcat的配置文件server.xml的頂層元素,那這個階段其實我們已經進入到Tomcat內部組件的詳解;這時候有一個問題,這麼多組件是如何管理它的生命週期的呢?

  • Tomcat - 組件拓展管理:JMX和MBean

  • 我們在前文中講Lifecycle以及組件,怎麼會突然講JMX和MBean呢?本文通過承接上文Lifecycle講Tomcat基於JMX的實現。

  • Tomcat - 事件的監聽機制:觀察者模式

  • 本文承接上文中Lifecycle中實現,引出Tomcat的監聽機制。

  • Tomcat - Server的設計和實現: StandardServer

  • 基於前面的幾篇文章,我們終於可以總體上梳理Server的具體實現了,這裏體現在StandardServer具體的功能實現上。

  • Tomcat - Service的設計和實現: StandardService

  • 上文講了Server的具體實現了,本文主要講Service的設計和實現;我們從上文其實已經知道Server中包含多個service了。

  • Tomcat - 線程池的設計與實現:StandardThreadExecutor

  • 上文中我們研究了下Service的設計和實現,StandardService中包含Executor的調用;這個比較好理解,Tomcat需要併發處理用戶的請求,自然而言就想到線程池,那麼Tomcat中線程池(Executor)具體是如何實現的?本文帶你繼續深度解析。

  • Tomcat - Request請求處理: Container設計

  • 在理解了Server,Service和Executor後,我們可以進入Request處理環節了。我們知道客戶端是可以發起多個請求的,Tomcat也是可以支持多個webapp的,有多個上下文,且一個webapp中可以有多個Servlet...等等,那麼Tomcat是如何設計組件來支撐請求處理的呢?本節文將介紹Tomcat的Container設計。

  • Tomcat - Container容器之Engine:StandardEngine

  • 上文已經知道Container的整體結構和設計,其中Engine其實就是Servlet Engine,負責處理request的頂層容器。

  • Tomcat - Container的管道機制:責任鏈模式

  • 上文中介紹了Engine的設計,其中有Pipline相關內容沒有介紹,本文將向你闡述Tomcat的管道機制以及它要解決的問題。

  • Tomcat - Request請求處理過程:Connector

  • 本文主要介紹request請求的處理過程。

ORM - MyBatis詳解

  • MyBatis詳解 - 總體框架設計

  • MyBatis整體架構包含哪些層呢?這些層次是如何設計的呢?

  • MyBatis詳解 - 初始化基本過程

  • 從上文我們知道MyBatis和數據庫的交互有兩種方式有Java API和Mapper接口兩種,所以MyBatis的初始化必然也有兩種;那麼MyBatis是如何初始化的呢?

  • MyBatis詳解 - 配置解析過程

  • 【本文爲中優先級】通過上文我們知道MyBatis初始化過程中會解析配置,那具體是如何解析的呢?

  • MyBatis詳解 - 官網配置清單

  • 【本文爲低優先級】通過上文我們知道配置是如何加載並初始化的,那MyBatis提供了哪些配置呢?通過MyBatis官網文檔我們一探究竟。PS:對於清單型的,只需要大致瀏覽且在使用時能快速查找即可,所以是低優先級的。

  • MyBatis詳解 - Mapper映射文件配置

  • 在mapper文件中,以mapper作爲根節點,其下面可以配置的元素節點有:select, insert, update, delete, cache, cache-ref, resultMap, sql; 本文將Mapper映射文件配置進行詳解。

  • MyBatis詳解 - sqlSession執行流程

  • 前面的章節主要講mybatis如何解析配置文件,這些都是一次性的過程。從本章開始講解動態的過程,它們跟應用程序對mybatis的調用密切相關。

  • MyBatis詳解 - 動態SQL使用與原理

  • 動態 SQL 是 MyBatis 的強大特性之一。如果你使用過 JDBC 或其它類似的框架,你應該能理解根據不同條件拼接 SQL 語句有多痛苦,例如拼接時要確保不能忘記添加必要的空格,還要注意去掉列表最後一個列名的逗號。利用動態 SQL,可以徹底擺脫這種痛苦

  • MyBatis詳解 - 插件機制

  • MyBatis提供了一種插件(plugin)的功能,雖然叫做插件,但其實這是攔截器功能。那麼攔截器攔截MyBatis中的哪些內容呢?

  • MyBatis詳解 - 插件之分頁機制

  • Mybatis的分頁功能很弱,它是基於內存的分頁(查出所有記錄再按偏移量和limit取結果),在大數據量的情況下這樣的分頁基本上是沒有用的。本文基於插件,通過攔截StatementHandler重寫sql語句,實現數據庫的物理分頁

  • MyBatis詳解 - 數據源與連接池

  • 本文主要介紹MyBatis數據源和連接池相關的內容。

  • MyBatis詳解 - 事務管理機制

  • 本文主要介紹MyBatis事務管理相關的使用和機制。

  • MyBatis詳解 - 一級緩存實現機制

  • 減少資源的浪費,MyBatis會在表示會話的SqlSession對象中建立一個簡單的緩存,將每次查詢到的結果結果緩存起來,當下次查詢的時候,如果判斷先前有個完全一樣的查詢,會直接從緩存中直接將結果取出,返回給用戶,不需要再進行一次數據庫查詢了。

  • MyBatis詳解 - 二級緩存實現機制

  • MyBatis的二級緩存是Application級別的緩存,它可以提高對數據庫查詢的效率,以提高應用的性能。

開發百寶箱(常用資源)

  • 開發百寶箱

開發工具清單

  • 工具清單 - Overview

  • 工具清單 - 項目管理

  • 工具清單 - IDE工具

  • 工具清單 - 看板工具

  • 工具清單 - Bug追蹤管理

  • 工具清單 - CI & CD

  • 工具清單 - API管理

  • 工具清單 - 監控工具

  • 工具清單 - 文檔/Wiki/Notes

  • 工具清單 - 文件管理和共享

開發工具詳解

  • 常用軟件工具

  • 工具詳解 - Git

  • Git是分佈式代碼託管的標杆,這裏將提供如何學習Git,以及Git工作流的總結,和常用的操作命令

  • 工具詳解 - Eclipse,STS,IDEA

  • 本文總結常用的IDE工具

  • 工具詳解 - Maven項目構建

  • 在Java開發中,常用構建工具ant,maven和gradle, 其中maven相對主流;本文參考和總結自這裏 (opens new window) , 對maven的理解看這一篇就夠

  • 工具詳解 - Jenkins+Gitlab

  • 使用Jenkins+Gitlab搭建CI環境

Linux相關

  • Linux - Linux基礎知識

  • Linux基礎知識學習梳理

  • Linux - Linux 常用

  • 本文記錄常用的Linux命令, 主要使用CentOS7

  • Linux - Curl使用

  • 主要總結Linux Curl的一些常見用法

  • Linux - Linux創建自建服務

  • 以打包自己開發的Java應用到Linux服務器,作爲一個服務啓動,並開啓自啓。

Docker相關

  • Docker - Overview

  • 虛擬化技術 - Docker Vs. 虛擬機

  • 人們爲了提高系統及硬件資源的利用率而引入了虛擬化技術。虛擬化是一種資源管理技術,它可以各種實體資源抽像後再分隔,從而打破實體結構的限制,最大程度的提高資源的利用率。Docker屬於軟件虛擬化技術中的操作系統層虛擬化技術,它是基於LXC實現的一個應用容器引擎,Docker讓開發者可以打包他們的應用及依賴環境到一個可移植的容器中,然後可以將這個容器快速部署開發、測試或生產環境中。瞭解本文從三個問題着手,什麼是虛擬化技術,docker和虛擬機區別,docker可以用來做什麼?

  • Docker基礎 - 入門基礎和Helloworld

  • 在瞭解了虛擬化技術和Docker之後,讓我們上手Docker,看看Docker是怎麼工作的。這裏會介紹CentOS環境下Docker的安裝和配置,以及會給你展示兩個實例,給你一個直觀的理解。再囉嗦下,有條件的情況下直接看官網 (opens new window), 網上資料魚龍混雜,版本也更新不及時。

  • Docker基礎 - 倉庫,鏡像,容器詳解

  • 本文將從倉庫,鏡像,容器三個方面講解常用的docker命令和使用等,對於開發而言這塊使用的

  • Docker基礎 - 一個web應用運行實例

  • 通過上文我們已經基本瞭解了docker的結構(倉庫,鏡像,容器)以及跑docker應用了;本文將通過介紹一個web應用:向你展示如何進行主機與web容器之間的通信,這是web開發者常用的;第二,貫穿上文中內容, 且爲我們後續講解網絡提供基礎

  • Docker基礎 - Docker網絡使用和配置

  • 上文已經向你介紹了,web容器創建和容器互聯了,但是容器之間爲什麼可以直接通信?主機和容器之間爲何可以通信?如何進行自定義的配置呢?所以這節就是我們要講述的Docker網絡。

  • Docker基礎 - Docker數據卷和數據管理

  • Docker 容器的數據放哪裏呢?本文帶你理解如何在 Docker 內部以及容器之間管理數據。

開發原則,流程,協議

  • 軟件開發中的原則 - SOLID

  • 在軟件開發中,前人對軟件系統的設計和開發總結了一些原則和模式, 不管用什麼語言做開發,都將對我們系統設計和開發提供指導意義。本文主要將總結這些常見的原則,和具體闡述意義。

  • 分佈式理論 - CAP

  • CAP理論是分佈式系統、特別是分佈式存儲領域中被討論的最多的理論。其中C代表一致性 (Consistency),A代表可用性 (Availability),P代表分區容錯性 (Partition tolerance)。CAP理論告訴我們C、A、P三者不能同時滿足,最多隻能滿足其中兩個。

  • 分佈式理論 - BASE

  • BASE是“Basically Available, Soft state, Eventually consistent(基本可用、軟狀態、最終一致性)”的首字母縮寫。其中的軟狀態和最終一致性這兩種技巧擅於對付存在分區的場合,並因此提高了可用性。

  • 事務理論 - ACID

  • 事務的四個基本特性

  • 康威定律 - 微服務基礎

  • 微服務這個概念很早就提出了, 真正火起來是在2016年左右,而康威定律(Conway's Law)就是微服務理論基礎。本文整理自肥俠的文章, 幫助大家理解微服務理論體系

  • 開發流程詳解

  • 談談我常見的敏捷開發流程的理解

  • 開源協議詳解

  • 開源不等於免費!爲了加速我們的開發,我們會使用開源的軟件和源碼;爲避免商業風險,需要在使用時瞭解第三方如軟件協議,版本,和已知CVE風險等;本文旨在從開源軟件再發布過程使用權限的角度入手,總結各個常見開源協議的異同,方便理解。

  • 知識共享協議CC 4.0

  • 本文主要介紹知識共享許可協議,及本站遵守的多數站點會採用的知識共享協議CC BY-NC-SA 4.0協議,即署名-非商業性使用-相同方式共享協議。

代碼規範

  • 阿里巴巴 Java 開發手冊

  • Twitter Java Style Guide

設計模式

在軟件開發中,前人對軟件系統的設計和開發總結了一些原則和模式, 不管用什麼語言做開發,都將對我們系統設計和開發提供指導意義。本文主要將對24種設計模式和7個設計原則進行總結,和具體闡述意義。你可以通過這篇文章設計模式 - Overview 瞭解整體上的知識點。

第一步:創建型設計模式

  • 創建型 - 單例模式(Singleton pattern)

  • 單例模式(Singleton pattern): 確保一個類只有一個實例,並提供該實例的全局訪問點, 本文介紹6中常用的實現方式

  • 創建型 - 簡單工廠(Simple Factory)

  • 簡單工廠(Simple Factory),它把實例化的操作單獨放到一個類中,這個類就成爲簡單工廠類,讓簡單工廠類來決定應該用哪個具體子類來實例化,這樣做能把客戶類和具體子類的實現解耦,客戶類不再需要知道有哪些子類以及應當實例化哪個子類

  • 創建型 - 工廠方法(Factory Method)

  • 工廠方法(Factory Method),它定義了一個創建對象的接口,但由子類決定要實例化哪個類。工廠方法把實例化操作推遲到子類

  • 創建型 - 抽象工廠(Abstract Factory)

  • 抽象工廠(Abstract Factory),抽象工廠模式創建的是對象家族,也就是很多對象而不是一個對象,並且這些對象是相關的,也就是說必須一起創建出來。而工廠方法模式只是用於創建一個對象,這和抽象工廠模式有很大不同

  • 創建型 - 生成器(Builder)

  • 生成器(Builder),封裝一個對象的構造過程,並允許按步驟構造

  • 創建型 - 原型模式(Prototype)

  • 原型模式(Prototype),使用原型實例指定要創建對象的類型,通過複製這個原型來創建新對象

第二步:結構型設計模式

  • 結構型 - 外觀(Facade)

  • 外觀模式(Facade pattern),它提供了一個統一的接口,用來訪問子系統中的一羣接口,從而讓子系統更容易使用

  • 結構型 - 適配器(Adapter)

  • 適配器模式(Adapter pattern): 將一個類的接口, 轉換成客戶期望的另一個接口。適配器讓原本接口不兼容的類可以合作無間。對象適配器使用組合, 類適配器使用多重繼承

  • 結構型 - 橋接(Bridge)

  • 橋接模式(Bridge pattern): 使用橋接模式通過將實現和抽象放在兩個不同的類層次中而使它們可以獨立改變

  • 結構型 - 組合(Composite)

  • 組合模式(composite pattern): 允許你將對象組合成樹形結構來表現"整體/部分"層次結構. 組合能讓客戶以一致的方式處理個別對象以及對象組合

  • 結構型 - 裝飾(Decorator)

  • 裝飾者模式(decorator pattern): 動態地將責任附加到對象上, 若要擴展功能, 裝飾者提供了比繼承更有彈性的替代方案

  • 結構型 - 享元(Flyweight)

  • 享元模式(Flyweight Pattern): 利用共享的方式來支持大量細粒度的對象,這些對象一部分內部狀態是相同的。它讓某個類的一個實例能用來提供許多"虛擬實例"

  • 結構型 - 代理(Proxy)

  • 代理模式(Proxy pattern): 爲另一個對象提供一個替身或佔位符以控制對這個對象的訪問

第三步:行爲型設計模式

  • 行爲型 - 責任鏈(Chain Of Responsibility)

  • 責任鏈模式(Chain of responsibility pattern): 通過責任鏈模式, 你可以爲某個請求創建一個對象鏈. 每個對象依序檢查此請求並對其進行處理或者將它傳給鏈中的下一個對象

  • 行爲型 - 策略(Strategy)

  • 策略模式(strategy pattern): 定義了算法族, 分別封閉起來, 讓它們之間可以互相替換, 此模式讓算法的變化獨立於使用算法的客戶

  • 行爲型 - 模板方法(Template Method)

  • 模板方法模式(Template pattern): 在一個方法中定義一個算法的骨架, 而將一些步驟延遲到子類中. 模板方法使得子類可以在不改變算法結構的情況下, 重新定義算法中的某些步驟

  • 行爲型 - 命令模式(Command)

  • 命令模式(Command pattern): 將"請求"封閉成對象, 以便使用不同的請求,隊列或者日誌來參數化其他對象. 命令模式也支持可撤銷的操作

  • 行爲型 - 觀察者(Observer)

  • 觀察者模式(observer pattern): 在對象之間定義一對多的依賴, 這樣一來, 當一個對象改變狀態, 依賴它的對象都會收到通知, 並自動更新

  • 行爲型 - 訪問者(Visitor)

  • 訪問者模式(visitor pattern): 當你想要爲一個對象的組合增加新的能力, 且封裝並不重要時, 就使用訪問者模式

  • 行爲型 - 狀態(State)

  • 狀態模式(State pattern): 允許對象在內部狀態改變時改變它的行爲, 對象看起來好象改了它的類

  • 行爲型 - 解釋器(Interpreter)

  • 解釋器模式(Interpreter pattern): 使用解釋器模式爲語言創建解釋器,通常由語言的語法和語法分析來定義

  • 行爲型 - 迭代器(Iterator)

  • 迭代器模式(iterator pattern): 提供一種方法順序訪問一個聚合對象中的各個元素, 而又不暴露其內部的表示

  • 行爲型 - 中介者(Mediator)

  • 中介者模式(Mediator pattern) : 使用中介者模式來集中相關對象之間複雜的溝通和控制方式

  • 行爲型 - 備忘錄(Memento)

  • 備忘錄模式(Memento pattern): 當你需要讓對象返回之前的狀態時(例如, 你的用戶請求"撤銷"), 你使用備忘錄模式

架構與系統設計

架構基礎與方法論

A. 架構基礎 - 基礎知識:首先帶你梳理下架構中有哪些知識點,如何學習架構,並向你介紹架構相關基礎知識。

  • 架構 - 知識體系

  • 本系列將帶你梳理下架構相關的知識體系,包括如何學習架構等。

  • 架構 - 架構基礎: 特點,本質...

  • 本節總結下架構相關的基礎知識:概述,特點,目標,本質...

B. 架構基礎 - 理解架構:然後帶你從構架的視角,架構的演進,架構的服務演化等角度分析架構的維度;而架構的模式即方法論總結,架構的核心要素是我們架構實現的目標。

  • 架構 - 理解構架的視角

  • 在學習架構時,我認爲首先要理清楚架構的視角,因爲你所認知的架構和別人所說的架構可能是兩碼事。對於不同職位的視角是不一樣的,比如開發而言他更多的看到的是開發架構;對售前人員,他可能更多的看到的是業務架構;對於運維人員,他看到的可能是運維架構;而對於技術支持和部署人員,他更多的看到的網絡和物理架構

  • 架構 - 理解架構的演進

  • 在學習架構時,第一步不要去學習框架,而是要學習架構的演進。強烈推薦李智慧老師的《大型網站技術架構》,這本書翻起來很快,對構築你自己的體系很有幫助,本文的內容來源於它,在此基礎上拓展了下

  • 架構 - 理解架構的服務演化

  • Kubernetes、Service Mesh 和 Serverless應該是最近比較火的了,而上文主要從邏輯架構角度分析了架構演進,本文將從服務演化和容器編排化的角度幫你增強對架構演進的認識

  • 架構 - 理解架構的模式

  • 架構演進中有很多知識點,總體上可以歸結爲以下模式,這裏說的模式本質是架構中技術點的抽象。強烈推薦李智慧老師的《大型網站技術架構》,本文的內容也是來源於它,在此基礎上拓展了下

  • 架構 - 理解架構的核心要素

  • 一般來說軟件架構需要關注性能、可用性、伸縮性、擴展性和安全性這5個架構要素

架構技術點詳解

C. 架構技術點詳解:緊接着對於高併發和高可用,高性能,具體闡述其中涉及的知識點,比如:緩存,限流,降級和熔斷,負載均衡,容災備份,故障轉移。

  • 架構之高併發:緩存

  • 高併發實現的三板斧:緩存,限流和降級。緩存在高併發系統中有者極其廣闊的應用,需要重點掌握,本文重點介紹下緩存及其實現

  • 架構之高併發:限流

  • 每個系統都有服務的上線,所以當流量超過服務極限能力時,系統可能會出現卡死、崩潰的情況,所以就有了降級和限流。限流其實就是:當高併發或者瞬時高併發時,爲了保證系統的穩定性、可用性,系統以犧牲部分請求爲代價或者延遲處理請求爲代價,保證系統整體服務可用

  • 架構之高併發:降級和熔斷

  • 在高併發環境下,服務之間的依賴關係導致調用失敗,解決的方式通常是: 限流->熔斷->隔離->降級, 其目的是防止雪崩效應

  • 架構之高可用:負載均衡

  • 負載均衡(Load Balance),意思是將負載(工作任務,訪問請求)進行平衡、分攤到多個操作單元(服務器,組件)上進行執行。是解決高性能,單點故障(高可用),擴展性(水平伸縮)的終極解決方案

  • 架構之高可用:容災備份,故障轉移

  • TODO

  • 架構 - 保障架構安全

  • 本文對架構安全知識點梳理

互聯網架構案例

D. 架構案例:從系統設計的角度,將上述的知識點融入進來,比如:秒殺系統設計等。

  • 架構案例 - 秒殺系統設計

E. 互聯網架構案例:最後我們再看下互聯網架構案例,幫助自己理解和學習架構。

  • 京東: 億級商品詳情頁設計

  • 閒魚: 億級商品結構化背後的思考和演進

  • 閒魚: 多狀態多操作的交易鏈路架構演進

  • 閒魚: 拉新投放系統如何設計

  • 閒魚: 複雜搜索系統的可靠性優化之路

  • 美團: 配送系統架構演進實踐

  • 美團: 即時物流的分佈式系統架構設計

  • 美團: 外賣客戶端高可用建設體系

  • 美團: 數據庫高可用架構的演進與設想

  • 美團: 數據同步到倉庫的架構實踐

架構參考資料

F. 架構參考資料:此外還會總結下架構裏面比較好的學習資料。

1. 《大型網站技術架構:核心原理與案例分析》

這是比較早,比較系統介紹大型網站技術架構的書,通俗易懂又充滿智慧,即便你之前完全沒接觸過網站開發,通讀前幾章,也能快速獲取到常見的網站技術架構及其應用場景。非常贊。

2. 《億級流量網站架構核心技術》

相比《大型網站技術架構》的高屋建瓴,開濤的這本《億級流量網站架構核心技術》則落實到細節,網站架構中常見的各種技術,比如緩存、隊列、線程池、代理……,統統都講到了,而且配有核心代碼。甚至連 Nginx 的配置都有!

如果你想在實現大流量網站時找參考技術和代碼,這本書最合適啦。

3. 《架構即未來》

這是一本“神書”啦,超越具體技術層面,着重剖析架構問題的根源,幫助我們弄清楚應該以何種方式管理、領導、組織和配置團隊。

4. 《分佈式服務架構:原理、設計與實戰》

這本書全面介紹了分佈式服務架構的原理與設計,並結合作者在實施微服務架構過程中的實踐經驗,總結了保障線上服務健康、可靠的最佳方案,是一本架構級、實戰型的重量級著作。

5. 《聊聊架構》

這算是架構方面的一本神書了,從架構的原初談起,從業務的拆分談起,談到架構的目的,架構師的角色,架構師如何將架構落地……強烈推薦。

不過,對於沒有架構實踐經驗的小夥伴來講,可能會覺得這本書比較虛,概念多,實戰少。但如果你有過一兩個項目的架構經驗,就會深深認同書中追本溯源探討的架構理念。

6. 《軟件架構師的12項修煉》

大多數時候所謂的“技術之玻璃天花板”其實只是缺乏軟技能而已。這些技能可以學到,缺乏的知識可以通過決定改變的努力來彌補。

以上內容來自:https://www.pdai.tech/md/outline/x-outline.html

微服務

微服務已經不是什麼新技術,只是聞道有先後,大廠和趨勢在前行,你不得不邁開腳步(可能你反對,但是趨勢擋不住),當微服務撲面而來的時候,你是否還在觀望或者猶豫,當你恍然大悟的時候,你是否又迷茫不知所措?是的,我們需要一份微服務的腦圖,也許這份圖譜不一定是標準答案,但是在你做參考和評估的時候,希望能對你有所幫助。如下圖所示:

微服務總體的內容包含有六大組件:服務描述,註冊中心,服務架構,服務監控,服務跟蹤和服務治理。這六大組件互相依賴,相輔相成,縱深挖掘,又可以牽扯出DevOps和容器化技術等周邊信息,這些武器庫代表的是技術的未來,不管是你是在小企業還是大廠,還是大廠裏的小部門,不知道你是否有這種體驗?

服務描述:

類似服務的說明文檔,簡單但不可或缺。比如,服務調用首先要解決的問題就是服務如何對外描述。比如,你對外提供了一個服務,那麼這個服務的服務名叫什麼?調用這個服務需要提供哪些信息?調用這個服務返回的結果是什麼格式的?該如何解析?這些就是服務描述要解決的問題。

註冊中心:

有了服務的接口描述,下一步要解決的問題就是服務的發佈和訂閱,就是說你提供了一個服務(Provider),如何讓外部(Consumer)想調用你的服務的人知道。這個時候就需要一個類似註冊中心(Registry)的角色,服務提供者將自己提供的服務以及地址登記到註冊中心,服務消費者則從註冊中心查詢所需要調用的服務的地址,然後發起請求。如下圖所示:

服務框架:

通過註冊中心,服務消費者就可以獲取到服務提供者的地址,有了地址後就可以發起調用。但在發起調用之前你還需要解決以下幾個問題。服務通信採用什麼協議?是RESTful API還是gRPC?數據傳輸採用什麼方式數據壓縮採用什麼格式?這些活通常集成到了我們的服務框架裏面,市面上有很多這樣的開源框架,相對都比較成熟,接下來考驗你的是快速上手的能力。

服務監控:

一旦服務消費者與服務提供者之間能夠正常發起服務調用,你就需要對調用情況進行監控,以瞭解服務是否正常。通常來講,服務監控主要包括三個流程,指標收集,數據處理,數據展示。監控是爲了發現問題和異常,如果要進一步跟蹤和定位問題,則需要進一步瞭解服務追蹤。

服務追蹤:

除了需要對服務調用情況進行監控之外,你還需要記錄服務調用經過的每一層鏈路,以便進行問題追蹤和故障定位,最後達到接近問題的目的。服務監控和追蹤可以合併起來,但是要明確各自的職責是不一樣的。

服務治理:

服務監控能夠發現問題,服務追蹤能夠定位問題所在,而解決問題就得靠服務治理了。服務治理就是通過一系列的手段來保證在各種意外情況下,服務調用仍然能夠正常進行。就目前開源的服務框架,大部分都不包括服務治理的內容,所以有可能這塊是需要你和你的團隊進行定製化開發,就看你做到什麼程度了,就好比你有數據庫但是你沒有ER圖描述,並不影響你用微服務,當然如果有就是錦上添花的東西了。

以上六大組件可以粗暴的定義爲微服務的二級目錄,他們共同組成了微服務架構,在生產環境下缺一不可。

以上文字部分節選自:cnblogs.com/jackyfei/p/10019621.html

Kubernetes

雖然 Docker 已經很強大了,但是在實際使用上還是有諸多不便,比如集羣管理、資源調度、文件管理等等。那麼在這樣一個百花齊放的容器時代湧現出了很多解決方案,比如 Mesos、Swarm、Kubernetes 等等,其中谷歌開源的 Kubernetes 是作爲老大哥的存在。

Kubernetes 解決的核心問題

  • 服務發現和負載均衡

  • Kubernetes 可以使用 DNS 名稱或自己的 IP 地址公開容器,如果到容器的流量很大,Kubernetes 可以負載均衡並分配網絡流量,從而使部署穩定。

  • 存儲編排

  • Kubernetes 允許您自動掛載您選擇的存儲系統,例如本地存儲、公共雲提供商等。

  • 自動部署和回滾

  • 您可以使用 Kubernetes 描述已部署容器的所需狀態,它可以以受控的速率將實際狀態更改爲所需狀態。例如,您可以自動化 Kubernetes 來爲您的部署創建新容器,刪除現有容器並將它們的所有資源用於新容器。

  • 自動二進制打包

  • Kubernetes 允許您指定每個容器所需 CPU 和內存(RAM)。當容器指定了資源請求時,Kubernetes 可以做出更好的決策來管理容器的資源。

  • 自我修復

  • Kubernetes 重新啓動失敗的容器、替換容器、殺死不響應用戶定義的運行狀況檢查的容器,並且在準備好服務之前不將其通告給客戶端。

  • 密鑰與配置管理

  • Kubernetes 允許您存儲和管理敏感信息,例如密碼、OAuth 令牌和 ssh 密鑰。您可以在不重建容器鏡像的情況下部署和更新密鑰和應用程序配置,也無需在堆棧配置中暴露密鑰。

Kubernetes 的出現不僅主宰了容器編排的市場,更改變了過去的運維方式,不僅將開發與運維之間邊界變得更加模糊,而且讓 DevOps 這一角色變得更加清晰,每一個軟件工程師都可以通過 Kubernetes 來定義服務之間的拓撲關係、線上的節點個數、資源使用量並且能夠快速實現水平擴容、藍綠部署等在過去複雜的運維操作。

更多介紹參閱:Kubernetes 前世今生( 附學習導圖 )

安裝

安裝v1.16.0版本,竟然成功了。記錄在此,避免後來者踩坑。本篇文章,安裝大步驟如下:詳細安裝步驟參考:CentOS 搭建 K8S,一次性成功,收藏了! 集羣安裝教程請參考:全網最新、最詳細基於V1.20版本,無坑部署最小化 K8S 集羣教程

Pod 實現原理

Pod 就是最小並且最簡單的 Kubernetes 對象

詳細介紹請參考:Kubernetes 之 Pod 實現原理

Harbor 倉庫

Kuternetes 企業級 Docker 私有倉庫 Harbor 工具。Harbor 的每個組件都是以 Docker 容器的形式構建的,使用 Docker Compose 來對它進行部署。用於部署 Harbor 的 Docker Compose 模板位於 /Deployer/docker-compose.yml 中,其由 5 個容器組成,這幾個容器通過 Docker link 的形式連接在一起,在容器之間通過容器名字互相訪問。對終端用戶而言,只需要暴露 Proxy(即Nginx) 的服務端口即可。

詳細介紹與搭建步驟請參考:企業級環境中基於 Harbor 搭建

YAML 語法

YAML 是一種非常簡潔/強大/專門用來寫配置文件的語言!YAML 全稱是 ”YAML Ain’t a Markup Language” 的遞歸縮寫,該語言的設計參考了 JSON / XML 和 SDL 等語言,強調以數據爲中心,簡潔易讀,編寫簡單。

更多詳細內容請參閱::Kubernetes 之 YAML 語法,這篇文章介紹的非常詳細,有很多例子說明。

資源清單

K8S 中所有的內容都抽象爲了資源,資源實例化之後就叫做對象。

更多詳細內容請參閱:Kubernetes 之資源清單詳細介紹看這裏

資源控制器

Kubernetes 資源控制器配置文件的編寫是學習 K8S 的重中之重!資源配額控制器確保了指定的資源對象始終不會超過配置的資源,能夠有效的降低整個系統宕機的機率,增強系統的魯棒性,對整個集羣的穩定性有非常重要的作用。

Kubernetes 資源控制器使用指南手冊

服務發現

Kubernetes 中爲了實現服務實例間的負載均衡和不同服務間的服務發現,創造了 Service 對象,同時又爲從集羣外部訪問集羣創建了 Ingress 對象。

更多詳細內容請參閱:Kubernetes 之服務發現

Ingress 服務

我們都知道傳統的 SVC 只支持四層上面的代碼,而對於七層上的代碼而無能爲力。比如:我們使用 K8S 集羣對外提供 HTTPS 的服務,爲了方便和便捷,我們需要在對外的 Nginx 服務上面配置 SSL 加密,但是將請求發送給後端服務的時候,進行證書卸載的操作,後續都是用 HTTP 的協議進行處理。而面對此問題,K8S 中給出了使用 Ingress (K8S在1.11版本中推出了)來進行處理。

更多詳細內容請參閱:Kubernetes 之 Ingress 服務,介紹關於 Ingress 服務的安裝方式,配置關於 Ingress 服務的 HTTP 代理訪問,介紹 Ingress 服務的 BasicAuth 認證方式,介紹 Ingress 的進行規則重寫的方式。

數據存儲

在之前的文章中,我們已經知道了很多 K8S 中的組件了,包括資源控制器等。在資源控制器中,我們說到了 StatefulSet 這個控制器組件,其專門爲了有狀態服務而生的,而對應的存儲要存放到哪裏呢?

介紹 K8S 中常見的存儲機制可以讓我們所使用的:Kubernetes 之數據存儲

集羣調度

有這樣一個需求,就是集羣中多臺服務的配置是不一致的。這就導致資源分配並不是均勻的,比如我們需要有些服務節點用來運行計算密集型的服務,而有些服務節點來運行需要大量內存的服務。而在 k8s 中當然也配置了相關服務來處理上述的問題,那就是 Scheduler。

詳細的介紹請參考:Kubernetes 之集羣調度

kubectl 使用指南

kubectl 是 Kubernetes 自帶的客戶端,可以用它來直接操作 Kubernetes 集羣。

更多詳細內容請參閱:Kubernetes 之 kubectl 使用指南

管理工具
  • Kubernetes 集羣管理工具 K9S

  • 輕鬆管理 Kubernetes 集羣的7個工具

  • 介紹5 款頂級 Kubernetes 日誌監控工具**

Kubernetes 常見問題總結

對於新安裝的 Kubernetes,經常出現的一個問題是 Service 沒有正常工作。如果您已經運行了 Deployment 並創建了一個 Service,但是當您嘗試訪問它時沒有得到響應,希望這份文檔(全網最詳細的 K8s Service 不能訪問排查流程)能幫助您找出問題所在。

Kubernetes 上對應用程序進行故障排除的 6 個技巧 推薦給大家,日常排錯必備。分享一份阿里雲內部超全K8s實戰手冊,免費下載!

  • 採用 jenkins pipeline 實現自動構建並部署至 k8s

  • 10個小技巧提高 Kubernetes 容器效率

  • Kubernetes 常見運維技巧總結

高清PDF下載獲取方式,大家關注我的微信公衆號:民工哥技術之路,然後在後臺回臺回覆 Java全棧知識體系 免費獲取下載鏈接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章