最新Java學(xué)習(xí)路線
學(xué)習(xí)路線
話不多說,直接上剛畫完的后端技術(shù)學(xué)習(xí)路線思維導(dǎo)圖框架:

計(jì)算機(jī)基礎(chǔ)
不管是后端開發(fā)還是前端開發(fā),說到底我們所有的軟件開發(fā)都是在計(jì)算上編寫程序,雖然對于大部分人來說,真正開始寫代碼的時候很少會讓你去解決計(jì)算機(jī)底層的問題,不接觸不代表不重要,計(jì)算機(jī)基礎(chǔ)是最重要的。
后端開發(fā)工作中經(jīng)常用到 Java、C++、Python、Golang 這些語言稱為高級編程語言,稱為高級是它們接近我們?nèi)粘=涣鞯淖匀徽Z言,離計(jì)算機(jī)底層遠(yuǎn),但所有的高級語言最終都會轉(zhuǎn)化成匯編->計(jì)算機(jī)指令->控制流操控計(jì)算機(jī)硬件,所以學(xué)習(xí)計(jì)算機(jī)構(gòu)成和工作原理、操作系統(tǒng)這些基礎(chǔ)知識,能夠加深我們隊(duì)高級語言的理解。
那我們一直說的計(jì)算機(jī)基礎(chǔ)到時是什么?計(jì)算機(jī)科學(xué)技術(shù) CS(Computer Science)作為一門專業(yè)課程,就和其他工科課程一樣有自己的理論體系,如果你是計(jì)算機(jī)專業(yè)的同學(xué)不用我來教該學(xué)什么,計(jì)算機(jī)專業(yè)大學(xué)四年學(xué)校教的那些就是基礎(chǔ),別小看你在學(xué)校學(xué)的那些看起來沒啥用的課程。我這有一份中中科大的計(jì)算機(jī)技術(shù)本科主要課程結(jié)構(gòu)安排。
一流大學(xué)的計(jì)算機(jī)專業(yè)要學(xué)什么可以對照著看下,從學(xué)科數(shù)學(xué)理論基礎(chǔ)、計(jì)算機(jī)體系結(jié)構(gòu)、軟件工程方法等等維度展開。
那如果你不是計(jì)算機(jī)相關(guān)專業(yè)的想轉(zhuǎn)行,也不要被嚇到了,畢竟這是人家四年時間的學(xué)習(xí)內(nèi)容,本科的培養(yǎng)目標(biāo)不僅僅是培養(yǎng)出一個軟件工程師,本科學(xué)習(xí)還是面向碩士博士的基礎(chǔ)培養(yǎng),注意是計(jì)算機(jī)科學(xué)專業(yè),名字里有個詞叫「科學(xué)」,我這篇文章要說的 BAT 公司后臺軟件開發(fā),可以認(rèn)為是「工學(xué)」方向,更多的是服務(wù)于工程開發(fā)。
如果只是面向后臺開發(fā)和工作面試,或者你是非計(jì)算機(jī)專業(yè)想轉(zhuǎn)行,社畜沒有太多時間去學(xué)習(xí)大學(xué)那些理論課程,那幫我把計(jì)算機(jī)基礎(chǔ)的范圍縮小到下面這 4 門專業(yè)課:計(jì)算機(jī)組成原理、計(jì)算機(jī)網(wǎng)路、操作系統(tǒng)、數(shù)據(jù)結(jié)構(gòu)。
計(jì)算機(jī)組成原理
這門課程讓你了解計(jì)算機(jī)的組成和工作原理,要學(xué)習(xí)的內(nèi)容包括:
數(shù)據(jù)在計(jì)算機(jī)中的表示和運(yùn)算(檸檬說:計(jì)算機(jī)不識數(shù),只認(rèn)得高低電平,所以數(shù)據(jù)在計(jì)算機(jī)內(nèi)部都用二進(jìn)制的0和1表示)
存儲系統(tǒng)(檸檬說:數(shù)據(jù)和程序指令都要存儲下來,學(xué)習(xí)計(jì)算機(jī)的存儲層次,內(nèi)存、外存、高速緩存、虛擬存儲技術(shù))
指令系統(tǒng)(檸檬說:寫的代碼最終都要被翻譯成計(jì)算機(jī)指令,指令格式和尋址方式有多種,控制器來控制指令執(zhí)行)
中央處理器(也就是 CPU 計(jì)算機(jī)的大腦,主要構(gòu)成是運(yùn)算器和控制器)
總線(檸檬說:計(jì)算機(jī)的血管動脈,連接計(jì)算機(jī)各功能組件,用來傳輸數(shù)據(jù)、地址信號、控制信號)
輸入輸出系統(tǒng)(檸檬說:Input/Output 也叫 IO 系統(tǒng),連接和管理各種外部設(shè)備比如鍵盤、顯示器等等)
計(jì)算機(jī)網(wǎng)絡(luò)
世界上第一臺通用計(jì)算機(jī)「ENIAC」于 1946 被發(fā)明出來,如其名字一樣僅僅是用于計(jì)算,在后來計(jì)算機(jī)越來越多,如果沒有網(wǎng)絡(luò)每臺計(jì)算機(jī)都將成為一個孤島,也不會有現(xiàn)在互聯(lián)網(wǎng)的繁榮,「計(jì)算機(jī)網(wǎng)絡(luò)」這門課程的學(xué)習(xí)路線非常清晰,就是圍繞著如何讓地理位置上不同的計(jì)算機(jī)連接起來,并高效可靠的交換數(shù)據(jù)信息,實(shí)現(xiàn)人在家中做,天下事盡知。
計(jì)算機(jī)網(wǎng)絡(luò)有分層次,根據(jù)各層屬性和特點(diǎn),分為:
物理層
數(shù)據(jù)鏈路層
網(wǎng)絡(luò)層
傳輸層
應(yīng)用層
這個層次劃分從上到下就是一個網(wǎng)絡(luò)數(shù)據(jù)包的接收路徑,反之就是發(fā)送路徑。既然要交換信息肯定得商量一套通用的協(xié)議,就像我們和老外交流,要么他們學(xué)中文要么我們學(xué)英文,反正得統(tǒng)一出一個標(biāo)準(zhǔn)語言出來,這在計(jì)算機(jī)網(wǎng)絡(luò)中稱之為「通信協(xié)議」。如上述的網(wǎng)絡(luò)分層,每層都有各自適配的協(xié)議,所以計(jì)算機(jī)網(wǎng)絡(luò)的學(xué)習(xí)基本就是圍繞著分層協(xié)議的學(xué)習(xí)。
操作系統(tǒng)
操作系統(tǒng)也是一種軟件。你熟悉的微軟Windos操作系統(tǒng),后臺開發(fā)熟悉的各種發(fā)行版的 Linux 系統(tǒng),都是通過軟件的形式安裝在計(jì)算機(jī)上。
只不過這個軟件和我們平常接觸的應(yīng)用程序軟件不同,它比較特殊,因?yàn)樗蛳潞陀?jì)算機(jī)硬件(就是我們在計(jì)算機(jī)組成原理中學(xué)習(xí)的那些硬件)打交道,向上給其他應(yīng)用程序和用戶提供通用的交互的接口,說白了操作系統(tǒng)就是個中介和管家的角色。它幫我們做了下面這些事情:
進(jìn)程管理(檸檬說:你寫的程序運(yùn)行起來才能干活,運(yùn)行起來的程序稱為進(jìn)程,進(jìn)程是資源的最小單位)
內(nèi)存管理(檸檬說:計(jì)算機(jī)內(nèi)存又貴又少,動不動又要來個高并發(fā),內(nèi)存管理大有學(xué)問)
文件管理(檸檬說:計(jì)算機(jī)中的資料和信息需要通過文件系統(tǒng)來保存、管理)
輸入輸出管理(檸檬說:各種外部設(shè)備如何接入計(jì)算機(jī)和接入之后又如何管理)
數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)大家最熟悉,即使毫無計(jì)算機(jī)基礎(chǔ)或是想轉(zhuǎn)行計(jì)算機(jī),第一個遇到的就是數(shù)據(jù)結(jié)構(gòu),因?yàn)槊嬖囁⒌乃惴}本質(zhì)上就是對各種數(shù)據(jù)結(jié)構(gòu)的運(yùn)用。所以單純對面試功利的角度來說,數(shù)據(jù)結(jié)構(gòu)也是必須要掌握的計(jì)算機(jī)基礎(chǔ),數(shù)據(jù)結(jié)構(gòu)要學(xué)到:
線性表(鏈表、數(shù)組、循環(huán)鏈表)
棧和隊(duì)列
樹和各種二叉樹(二叉排序樹、平衡二叉樹、哈夫曼樹、B樹、B+樹、Trie樹)
圖(圖的存儲結(jié)構(gòu)、BFS、DFS、最短路徑、最小生成樹、拓?fù)渑判?、關(guān)鍵路徑)
查找算法(二分查找、B樹查找、HASH表、KMP字符串模式匹配)
排序算法(插入排序、冒泡排序、歸并排序、基數(shù)排序、堆排序)
貪心算法
位運(yùn)算
分治算法
動態(tài)規(guī)劃
好了,計(jì)算機(jī)基礎(chǔ)四大專業(yè)課已經(jīng)大概過了一遍,當(dāng)然這是我給沒有計(jì)算機(jī)基礎(chǔ)同學(xué)的實(shí)用主義建議,等你學(xué)完這四門課程也只能夠說入門計(jì)算機(jī)了,不過這已經(jīng)比很多人厲害了。如果想真正的了解計(jì)算機(jī)這門學(xué)科,可以等學(xué)完了這 4 門基礎(chǔ)課程之后,再花寫時間挑一些上面培養(yǎng)方案中的課程去學(xué)習(xí),做一個知識體系完備的計(jì)算機(jī)軟件后端開發(fā)工程師。
Linux
在后臺開發(fā)領(lǐng)域,你所能接觸到的后端服務(wù)不敢說 100%,至少也有 90% 以上是運(yùn)行在 Linux 系統(tǒng)之上,因?yàn)樗_源、便利、功能強(qiáng)大,需要學(xué)習(xí)以下技術(shù)點(diǎn):
Linux系統(tǒng)使用
所以如果你想走后端開發(fā)這條路線,我建議你趁早使用 Linux ,越早越好??梢允窃趥€人 PC 上裝 Linux 虛擬機(jī),或者裝個雙系統(tǒng),我在大學(xué)就是這么玩的,那時候云服務(wù)器還沒現(xiàn)在這么普及,現(xiàn)在我覺得買個 Linux 云服務(wù)器最方便,如果是學(xué)生還有教育優(yōu)惠也不貴。
有了Linux系統(tǒng)之后干嘛呢?把它作為你的常用系統(tǒng),經(jīng)常登錄進(jìn)去對照著「鳥哥的 Linux 私房菜」從頭到尾操作一遍,ok,Linux的基礎(chǔ)操作你就掌握了。
Linux 高級編程
Linux「高級編程」的意思是比上面的 Linux 基礎(chǔ)操作更深入一個層次。
學(xué)會了 Linux 的使用還不算是一個真正的開發(fā)人員,使用系統(tǒng)是成為開發(fā)者最基本要求,會操作Linux 就像使用 Windows 系統(tǒng)一樣,只不過是學(xué)習(xí)成本的問題,如果這個世界沒有 Window 系統(tǒng),你女朋友花點(diǎn)時間也能掌握 Linux 系統(tǒng)基本操作。
要想進(jìn)階成為后端開發(fā)人員,就要懂得如何使用 Linux 系統(tǒng)提供的各種系統(tǒng)API(系統(tǒng)調(diào)用接口)進(jìn)行編程開發(fā),程序員用你寫的代碼來控制系統(tǒng),普通用戶只會用鼠標(biāo)操縱。這個階段需要學(xué)習(xí):
Unix 系統(tǒng)實(shí)現(xiàn) Linux、基本系統(tǒng)數(shù)據(jù)類型
文件操作函數(shù):
open
、read
close
write
dup
fcntl
ioctl
stat
chmod``access
chdir
...系統(tǒng)編程接口的基本特性和高級特性
Linux進(jìn)程環(huán)境、如何創(chuàng)建進(jìn)程、線程,程序的存儲空間分配、環(huán)境變量
進(jìn)程組、會話以及任務(wù)控制、進(jìn)程優(yōu)先級和調(diào)度
動態(tài)庫和靜態(tài)庫
進(jìn)程間通信:管道和FIFO、消息隊(duì)列、信號量、共享內(nèi)存、內(nèi)存映射
套接字和網(wǎng)絡(luò)編程
總之,這一階段需要學(xué)習(xí)的是在 Linux 環(huán)境下的高級編程技巧,通過對這些內(nèi)容的學(xué)習(xí)也能讓你更深入的理解 Linux 系統(tǒng)是如何工作和運(yùn)行的,并且真正的踏入 Linux 系統(tǒng)編程大門。
網(wǎng)絡(luò)編程
網(wǎng)絡(luò)編程是通過網(wǎng)絡(luò)套接字 socket 方式實(shí)現(xiàn)的通信,所以也屬于進(jìn)程間通信 IPC(Inter-Process Communication)。
由于現(xiàn)在的后臺服務(wù)基于服務(wù)端/客戶端模型,兩者之間基于網(wǎng)絡(luò)通信,你在家用手機(jī)點(diǎn)個外賣的服務(wù)請求,也是通過網(wǎng)絡(luò)通信發(fā)給某團(tuán)的后臺服務(wù)器,所以后臺服務(wù)開發(fā),說到底還是網(wǎng)絡(luò)編程,以及建立在網(wǎng)絡(luò)編程數(shù)據(jù)之上的應(yīng)用層開發(fā)。
網(wǎng)絡(luò)編程學(xué)什么:
什么是socket套接字
套接字選項(xiàng)
TCP/UDP 套接字編程
Unix domain 協(xié)議和編程
原始套接字編程
IO多路復(fù)用:select 、poll、epoll、kqueue
序列化技術(shù)
零拷貝技術(shù)
開源網(wǎng)絡(luò)庫:muduo、libevent
學(xué)完以上內(nèi)容你大概可以寫一個類似QQ一樣的網(wǎng)絡(luò)聊天小工具。
不在在工作中,都有成熟的網(wǎng)絡(luò)框架或網(wǎng)絡(luò)通信庫,大公司比如鵝廠大部分是自研網(wǎng)絡(luò)通信框架,小公司用開源項(xiàng)目,這讓很多后臺開發(fā)人員不必關(guān)心底層的網(wǎng)絡(luò)通信細(xì)節(jié),除了部分基礎(chǔ)架構(gòu)的開發(fā)同學(xué),大部分后臺開發(fā)同學(xué)工作都是在做業(yè)務(wù)系統(tǒng)的開發(fā)。
但了解底層網(wǎng)絡(luò)編程原理,是后臺開發(fā)人員的核心能力,這點(diǎn)對于 C/C++ 后臺開發(fā)程序員尤為重要。它能拔高你看問題的高度,不了解底層原理,就像是在黑盒編程一樣,出了問題無從下手排查。
學(xué)完了以上內(nèi)容,基本是具備了從事后臺開發(fā)的基礎(chǔ)能力,也能開發(fā)出一個簡單的后臺服務(wù)器了。
數(shù)據(jù)庫
除非是單純的轉(zhuǎn)發(fā)路由類后臺服務(wù),一般來說后臺開發(fā)的web服務(wù)器后臺程序,后臺服務(wù)程序說白了就是個死循環(huán):
接收客戶端數(shù)據(jù)包 -> 處理數(shù)據(jù)包 -> 業(yè)務(wù)邏輯處理 -> 保存必要的數(shù)據(jù) -> 回復(fù)響應(yīng)數(shù)據(jù)給客戶端
這其中會伴隨對各種數(shù)據(jù)的處理,比如電商系統(tǒng)會處理訂單數(shù)據(jù)、用戶數(shù)據(jù),游戲后臺會處理角色數(shù)據(jù)和裝備數(shù)據(jù)等等,有數(shù)據(jù)就會涉及到存儲系統(tǒng),數(shù)據(jù)一般都存儲到數(shù)據(jù)庫。
主要學(xué)習(xí) 2 大類數(shù)據(jù)庫:
關(guān)系型數(shù)據(jù)庫是指采用了關(guān)系模型來組織數(shù)據(jù)的數(shù)據(jù)庫,簡單理解就是二維表格模型。
非關(guān)系型數(shù)據(jù)庫一般指的是 key-value
形式存儲數(shù)據(jù)的 NoSQL 數(shù)據(jù)庫,數(shù)據(jù)和鍵值是簡單的映射關(guān)系。
關(guān)系型數(shù)據(jù)庫
MySQL 數(shù)據(jù)庫架構(gòu)
MySQL索引使用和優(yōu)化
innoDB存儲引擎
查詢性能優(yōu)化
聚集索引、非聚集索引
事務(wù)隔離,ACID,MVCC
鎖機(jī)制,樂觀鎖、悲觀鎖、讀鎖、寫鎖、意向鎖
日志
數(shù)據(jù)備份與恢復(fù)
非關(guān)系型數(shù)據(jù)庫
redis 基本操作和使用
redis 設(shè)計(jì)與實(shí)現(xiàn)原理
MongoDB
levelDB
memcache
HBase
CKV+ 騰訊自研
后臺開發(fā)服務(wù)還需要學(xué)會解決三高問題:高并發(fā)、高可用、高性能。
高并發(fā)
利用到目前為止學(xué)習(xí)的內(nèi)容,我們的開發(fā)的后臺服務(wù)器應(yīng)付一些小并發(fā)場景綽綽有余,但是隨著互聯(lián)網(wǎng)應(yīng)用業(yè)務(wù)量的上漲,對后臺服務(wù)端的請求數(shù)劇增,高并發(fā)需求隨之而來,高并發(fā)指的就是高 TPS 和高 QPS
TPS (Transactions Per Second)每秒事務(wù)數(shù)
QPS(Query Per Second)每秒查詢數(shù)等。
對于高并發(fā)服務(wù)必須改變傳統(tǒng)的單進(jìn)程模型,才能處理的過來如此海量的請求。
多進(jìn)程
對于高并發(fā)的服務(wù)請求,由于后臺服務(wù)一般都是 IO 密集型應(yīng)用,IO 密集型應(yīng)用就是大部分 CPU 時間用在網(wǎng)絡(luò) IO 上,相對的是 CPU 密集型應(yīng)用大部分時間花在數(shù)據(jù)計(jì)算上。
大多數(shù)的后臺服務(wù)程序都是 IO 密集型的應(yīng)用,網(wǎng)絡(luò) IO 的時候 CPU 等待白白浪費(fèi)時間, 這就告訴我們 CPU 的潛力還沒有完全發(fā)揮,所以當(dāng)一個進(jìn)程的處理能力達(dá)到上限,我們可以多創(chuàng)建幾個進(jìn)程,這就是多進(jìn)程模型。
多線程
多線程與多進(jìn)程類似,實(shí)際在Linux系統(tǒng)中線程是由輕量級的進(jìn)程 LWP(Light-weight process)實(shí)現(xiàn),多線程方式實(shí)現(xiàn)的后臺服務(wù)相對于多進(jìn)程更加輕量,因?yàn)槎嗑€程是在同一個進(jìn)程內(nèi)部實(shí)現(xiàn)。
不過多線程也會帶來新的問題,比如全局?jǐn)?shù)據(jù)競爭和同步問題,引入線程鎖還要防止死鎖的發(fā)生。
協(xié)程
那什么是協(xié)程呢?協(xié)程 Coroutines
是一種比線程更加輕量級的微線程。類比一個進(jìn)程可以擁有多個線程,一個線程也可以擁有多個協(xié)程,因此協(xié)程又稱微線程和纖程??梢源致缘陌褏f(xié)程理解成子程序調(diào)用,每個子程序都可以在一個單獨(dú)的協(xié)程內(nèi)執(zhí)行。
異步回調(diào)
所謂異步回調(diào)就是,服務(wù)端發(fā)起 IO 請求的線程不等網(wǎng)絡(luò) IO 線程操作完成,就繼續(xù)執(zhí)行隨后的代碼,一般請求線程需要先注冊一個回調(diào)函數(shù),當(dāng)IO 完成之后網(wǎng)絡(luò)IO線程通過調(diào)用之前注冊的回調(diào)函數(shù)來通知發(fā)起 IO 請求的線程,這樣發(fā)起請求的線程就不會阻塞住等待結(jié)果,提高了服務(wù)處理性能。
高性能
按以上服務(wù)模型可以提高服務(wù)本身處理能力,高性能后臺服務(wù)往往還會利用多種技術(shù)、從多個維度優(yōu)化提高性能。比如采用CDN(Content Delivery Network)內(nèi)容分發(fā)網(wǎng)絡(luò),存儲和分發(fā)使用戶就近獲取內(nèi)容,縮短響應(yīng)時間;采用池化技術(shù),避免頻繁的資源分配與回收;采用服務(wù)集群,橫向擴(kuò)展服務(wù)能力;采用緩存技術(shù),熱點(diǎn)數(shù)據(jù)加入緩存,減少數(shù)據(jù)庫訪問。
CND 內(nèi)容分發(fā)技術(shù)
池化技術(shù):數(shù)據(jù)庫連接池,線程池
集群化
緩存技術(shù)
高可用
高可用即保證服務(wù)的穩(wěn)定性,不出現(xiàn)重大問題或宕機(jī),常見的解決高可用思路是冗余和負(fù)載均衡。冗余的意思就是多部署幾臺服務(wù)器,當(dāng)其中一臺掛掉另外一臺能頂上。通過負(fù)載均衡技術(shù)實(shí)現(xiàn)對流量的動態(tài)調(diào)配,不至于出現(xiàn)大量流量沖擊某臺機(jī)器出現(xiàn)請求不均勻,軟件負(fù)載均衡技術(shù)可以通過DNS、Nginx、LVS等技術(shù)實(shí)現(xiàn)。這里主要學(xué)習(xí)的技術(shù)有:
負(fù)載均衡技術(shù),軟硬件負(fù)載均衡
限流隔離降級技術(shù)
應(yīng)用層容災(zāi),資源隔離熔斷
異地多活
設(shè)計(jì)模式
設(shè)計(jì)模式代表著軟件開發(fā)的一種最佳實(shí)踐。已經(jīng)經(jīng)歷了很長一段時間的發(fā)展,它們提供了軟件開發(fā)過程中面臨的一般問題的最佳解決方案。學(xué)習(xí)這些模式有助于經(jīng)驗(yàn)不足的開發(fā)人員通過一種簡單快捷的方式來學(xué)習(xí)軟件設(shè)計(jì),當(dāng)設(shè)計(jì)大規(guī)模軟件時遵循必要的設(shè)計(jì)模式能讓寫出的代碼更加健壯和可擴(kuò)展。
設(shè)計(jì)模式 6 大原則:
開閉原則:對擴(kuò)展開放,對修改關(guān)閉,多使用抽象類和接口。
里氏替換原則:基類可以被子類替換,使用抽象類繼承,不使用具體類繼承。
依賴倒轉(zhuǎn)原則:要依賴于抽象,不要依賴于具體,針對接口編程,不針對實(shí)現(xiàn)編程。
接口隔離原則:使用多個隔離的接口,比使用單個接口好,建立最小的接口。
迪米特法則:一個軟件實(shí)體應(yīng)當(dāng)盡可能少地與其他實(shí)體發(fā)生相互作用,通過中間類建立聯(lián)系。
合成復(fù)用原則:盡量使用合成/聚合,而不是使用繼承。
常見設(shè)計(jì)模式分類
工廠模式
單例模式
建造者模式
適配器模式
橋接模式
過濾器模式
裝飾器模式
外觀模式
享元模式
代理模式
責(zé)任鏈模式
解釋器模式
迭代器模式
觀察者模式
...
分布式
為什么會出現(xiàn)分布式?隨著業(yè)務(wù)的體量不斷增長,單個節(jié)點(diǎn)的處理能力無法滿足日益增長的計(jì)算、存儲任務(wù)的時候,且硬件的提升(加內(nèi)存、加磁盤、使用更好的CPU)高昂到得不償失的時候,應(yīng)用程序也不能進(jìn)一步優(yōu)化的時候,我們才需要考慮分布式系統(tǒng)。
分布式系統(tǒng)是由一組通過網(wǎng)絡(luò)進(jìn)行通信、為了完成共同的任務(wù)而協(xié)調(diào)工作的計(jì)算機(jī)節(jié)點(diǎn)組成的系統(tǒng)。分布式系統(tǒng)的出現(xiàn)是為了用廉價的、普通的機(jī)器完成單個計(jì)算機(jī)無法完成的計(jì)算、存儲任務(wù)。其目的是利用更多的機(jī)器,處理更多的數(shù)據(jù)。
分布式系統(tǒng)要解決的問題本身就是和單機(jī)系統(tǒng)一樣的,而由于分布式系統(tǒng)多節(jié)點(diǎn)、通過網(wǎng)絡(luò)通信的拓?fù)浣Y(jié)構(gòu),會引入很多單機(jī)系統(tǒng)沒有的問題,為了解決這些問題又會引入更多的機(jī)制、協(xié)議。這里需要學(xué)習(xí)的內(nèi)容包括:
分布式一致性算法:PAXOS、Raft、Zab
分布式事務(wù):2PC、3PC、TCC
分布式唯一 ID 生成:雪花算法、UUID、淘寶 TDDL SEQUENCE方案、美團(tuán) Leaf
一致性HASH算法
擴(kuò)展性設(shè)計(jì),設(shè)計(jì)可擴(kuò)展的軟件架構(gòu)
分布式文件系統(tǒng):HDFS、FastDFS
微服務(wù)架構(gòu)設(shè)計(jì),服務(wù)注冊、服務(wù)發(fā)現(xiàn)、服務(wù)路由
安全
本質(zhì)上后臺服務(wù)在網(wǎng)絡(luò)上運(yùn)行,需要和各種網(wǎng)絡(luò)環(huán)境交互,在正常情況下能夠工作,但互聯(lián)網(wǎng)中有很多針對后臺服務(wù)的惡意攻擊,因此網(wǎng)絡(luò)安全也是后臺開發(fā)工程師需要學(xué)習(xí)的內(nèi)容。這里主要包括:
web安全:CSRF、SQL注入、XSS
DDos防范
加解密算法:對稱加密、哈希算法、非對稱加密
網(wǎng)絡(luò)隔離:內(nèi)外網(wǎng)分離、跳板機(jī)
授權(quán)認(rèn)證算法:OAuth2.0、OIDC、2FA、單點(diǎn)登錄SSO
監(jiān)控與統(tǒng)計(jì)
后臺服務(wù)運(yùn)行我們?nèi)绾瘟私馄溥\(yùn)行狀態(tài)和健康度?如果只是開發(fā)小玩具監(jiān)控和統(tǒng)計(jì)大可不必,只需記錄本地日志即可,對于成熟的大型后臺服務(wù)系統(tǒng),監(jiān)控、統(tǒng)計(jì)、追蹤必不可少,無監(jiān)控,不運(yùn)營。
開源的監(jiān)控軟件有:Prometheus、Zabbix、Open-Falcon。
追蹤系統(tǒng)也非常重要,特別是目前微服務(wù)化,一次服務(wù)請求需要經(jīng)歷多個不同的微服務(wù)處理,給分布式追蹤帶來新的挑戰(zhàn),主要包含以下三個方面:
通過收集日志(Logging),記錄程序的調(diào)試信息或錯誤信息,對系統(tǒng)和各個服務(wù)的運(yùn)行狀態(tài)進(jìn)行監(jiān)控
通過收集量度(Metrics),比如累加量,對系統(tǒng)和各個服務(wù)的性能進(jìn)行監(jiān)控
通過分布式追蹤(Tracing ),追蹤服務(wù)請求是如何在各個分布的組件中進(jìn)行處理的細(xì)節(jié)
業(yè)界也有一些成熟的開源軟件用于監(jiān)控與追蹤:SkyWalking、Pinpoint、Zipkin、CAT大眾點(diǎn)評開源。不過大公司一般都有自研的一套監(jiān)控與追蹤系統(tǒng),比如騰訊內(nèi)部就有多套自研監(jiān)控與調(diào)用鏈追蹤系統(tǒng)。
搜索引擎
我們討論的是全文搜索引擎,什么是全文搜索引擎?
全文搜索引擎是目前廣泛應(yīng)用的主流搜索引擎。它的工作原理是計(jì)算機(jī)索引程序通過掃描文章中的每一個詞,對每一個詞建立一個索引,指明該詞在文章中出現(xiàn)的次數(shù)和位置,當(dāng)用戶查詢時,檢索程序就根據(jù)事先建立的索引進(jìn)行查找,并將查找的結(jié)果反饋給用戶的檢索方式。這個過程類似于通過字典中的檢索字表查字的過程。
數(shù)據(jù)分為結(jié)構(gòu)化數(shù)據(jù)與非結(jié)構(gòu)化數(shù)據(jù)
像數(shù)據(jù)庫表這種的數(shù)據(jù)是結(jié)構(gòu)化數(shù)據(jù);而對于像HTML、XML、文檔這樣不定長度且無固定格式的數(shù)據(jù)我們稱之為非結(jié)構(gòu)化數(shù)據(jù)。非結(jié)構(gòu)化數(shù)據(jù)也稱為全文數(shù)據(jù),對非結(jié)構(gòu)化數(shù)據(jù)的搜索可以用全文檢索的方式,
目前兩大主流的全文搜索引擎「Solr」和「Elasticsearch」都是基于 Lucene 建立。搜索引擎需要學(xué)習(xí)的內(nèi)容:
搜索引擎原理,搜索引擎利用倒排索引技術(shù)來實(shí)現(xiàn)對全文數(shù)據(jù)的高效檢索。
Lucene,Apache Lucene 是一個開源的全文搜索引擎工具包。
Elasticsearch 原理與使用
Solr 原理與使用
大數(shù)據(jù)
大數(shù)據(jù),又稱為巨量資料,指的是在傳統(tǒng)數(shù)據(jù)處理應(yīng)用軟件不足以處理的大或復(fù)雜的數(shù)據(jù)集的術(shù)語。隨著后臺服務(wù)用戶數(shù)增加和數(shù)據(jù)的積累,產(chǎn)生海量有待挖掘價值的數(shù)據(jù),分析利用這些數(shù)據(jù)可以反饋線上決策,優(yōu)化運(yùn)營策略,產(chǎn)生數(shù)據(jù)價值。
海量數(shù)據(jù)也可以定義為來自各種來源的大量非結(jié)構(gòu)化或結(jié)構(gòu)化數(shù)據(jù)。
在軟件開發(fā)領(lǐng)域的大數(shù)據(jù)概念自 20 世紀(jì) 90 年代的數(shù)據(jù)倉庫開始,對于大數(shù)據(jù)的處理也導(dǎo)致各種海量數(shù)據(jù)的統(tǒng)計(jì)和處理技術(shù)發(fā)展。
主要包含以下的技術(shù)點(diǎn)需要學(xué)習(xí):數(shù)據(jù)存儲、離線分析、流式計(jì)算。
大數(shù)據(jù)存儲:Hadoop 框架,HDFS、HBase、YARN 架構(gòu)、Apache Kudu
離線分析:Hive、MapReduce、Spark
流式計(jì)算:Flink、Storm、Kafka Stream、Spark Streaming
虛擬化
虛擬化,是指通過虛擬化技術(shù)將一臺計(jì)算機(jī)虛擬為多臺邏輯計(jì)算機(jī)。
虛擬化的好處
靈活性:在同一硬件上同時運(yùn)行多個操作系統(tǒng)
敏捷性:移動操作系統(tǒng)的方式與將文件或圖片從一臺物理服務(wù)器移動到另一臺物理服務(wù)器的方式相同。
容錯:當(dāng)物理服務(wù)器出現(xiàn)故障時,管理軟件會自動將實(shí)例遷移到可用服務(wù)器,甚至無感知物理硬件故障。
降低成本:您不再需要過多的物理服務(wù)器,操作和維護(hù)所需的費(fèi)用也隨之減少。
常見的虛擬化技術(shù):KVM、Xen、OpenVZ、Docker
雖然對于大多數(shù)后臺服務(wù)程序來說, 很多服務(wù)都是部署在 Docker 容器里,但 Docker 共用了底層系統(tǒng)的 kernel,所有容器共用一部分的運(yùn)行庫,因此隔離性相比 KVM 之類的虛擬化技術(shù)差一點(diǎn),KVM 與 Docker 有各自的使用場景,未來很長一段時間是共存狀態(tài)。
OpenStack 管理 VM(Virtual Machine)虛擬機(jī)的工具;Kubernetes 簡稱 K8s ,是管理 container 容器的工具。
中間件
在后端開發(fā)中你可能經(jīng)常聽說到「中間件」這個詞,那什么是中間件?看下Wiki上的定義:
中間件技術(shù)創(chuàng)建在對應(yīng)用軟件部分常用功能的抽象上,將常用且重要的過程調(diào)用、分布式組件、消息隊(duì)列、事務(wù)、安全、鏈接器、商業(yè)流程、網(wǎng)絡(luò)并發(fā)、HTTP 服務(wù)器、Web Service 等功能集于一身或者分別在不同品牌的不同產(chǎn)品中分別完成。
中國科學(xué)院軟件所研究員仲萃豪把中間件定義為「平臺+通信」。這個定義限定了只有用于分布式系統(tǒng)中的此類軟件才能被稱為中間件,同時此定義也把中間件與實(shí)際應(yīng)用的應(yīng)用軟件區(qū)分開來。
大白話來說,中間件就是把分布式系統(tǒng)中一些通用功能的抽象出來提供服務(wù)的一類軟件統(tǒng)稱。它屏蔽掉了底層操作系統(tǒng)的復(fù)雜性,向上提供一個統(tǒng)一的開發(fā)環(huán)境,降低了軟件系統(tǒng)開發(fā)的復(fù)雜度,由于中間件是介于操作系統(tǒng)和應(yīng)用軟件之間,為應(yīng)用軟件提供服務(wù)功能的軟件,由于介于兩種軟件之間,所以稱為中間件。
常見的的開源中間件有下面幾種,組合起來就能搭建一個完整的分布式后臺服務(wù)系統(tǒng):
web server 中間件,Nginx、OpenResty、Tomcat...
緩存中間件,服務(wù)端緩存包括 Redis、Memcached...
消息隊(duì)列中間件,Kafka、RabbitMQ、ActiveMQ...
RPC框架,Tars、Dubbo、gRPC、Thrift
數(shù)據(jù)庫中間件,Sharding jdbc
日志系統(tǒng)中間件,ELK B指的是一套解決方案,是 Elasticsearch、Logstash 、 Kibana、Beats 是這 4 種軟件產(chǎn)品的首字母縮寫。
配置中心中間件,Apollo、zookeeper統(tǒng)一配置管理
API網(wǎng)關(guān),開源項(xiàng)目有 Tyk、kong、zuul、orange...
版本控制
大型軟件項(xiàng)目的代碼量巨大,如何有效組織和管理源碼和版本,于是產(chǎn)生了版本控制系統(tǒng)。版本控制系統(tǒng)就是我們常說的SVN 或 Git,用來追蹤、維護(hù)源碼、文件以及配置文件等等的改動,并且提供控制這些改動控制權(quán)的程序。
常見的版本控制系統(tǒng)分為兩大類:集中式版本控制和分布式版本控制。作為后端開發(fā)工程師,版本控制系統(tǒng)的使用也是必須掌握的基礎(chǔ)技能,不過這些系統(tǒng)一般都是邊使用邊熟悉,剛開始熟悉一些常用操作就好。
常見的有集中式版本控制系統(tǒng),代表是SVN;
分布式版本控制系統(tǒng),代表是Git
工具
一些和后端開發(fā)或者說軟件開發(fā)相關(guān)的工具推薦,主要是編輯器和 IDE。
編輯器
在 Linux 下開發(fā)肯定離不開 Vim 或者 Emacs,這兩個都是常用的編輯器,已經(jīng)形成了兩大愛好者陣營。特別是 Vim 編輯器,學(xué)習(xí)成本有點(diǎn)高,配合上各種插件和配置,有些 Vim 愛好者已經(jīng)把它當(dāng)成 IDE 來用了,一旦掌握可以大幅提升工作效率,值得你去學(xué)習(xí)。
當(dāng)然除了 Vim 如果是文字編輯工作,比如寫 README 文檔或者寫技術(shù)博客,那么強(qiáng)烈推薦學(xué)習(xí)下 Markdown 語法,這是一種種輕量級標(biāo)記語言,它允許人們使用易讀易寫的純文本格式編寫文檔,注重內(nèi)容本身不用過多的調(diào)整排版。Markdown 編輯器推薦 Typora 、有道云筆記 Markdown 編輯器、VSCode Markdown插件。
IDE
編輯器作為小工程還可以勝任,不過后端開發(fā)工作中,一般都是大型的軟件工程項(xiàng)目,所以不大可能用編輯器來管理,這時候就需要學(xué)習(xí)使用專業(yè)的集成開發(fā)工具。
集成開發(fā)環(huán)境(IDE,Integrated Development Environment )是用于提供程序開發(fā)環(huán)境的應(yīng)用程序,一般包括代碼編輯器、編譯器、調(diào)試器和圖形用戶界面等工具。
磨刀不誤砍柴工,挑一把趁手的兵器再去編程世界遨游。各語言 IDE 五花八門,推薦 JetBrains 系列和 VS Code ,JetBrains 產(chǎn)品包括各語言開發(fā)的一系列的 IDE,特別是Java 的Intellij IDEA 口碑非常不錯,部分對應(yīng)的產(chǎn)品系列如下。
CLion - 跨平臺的C/C++ IDE 開發(fā)工具,支持C++11 、C++14、libc++以及Boost。
GoLand - Go語言的集成開發(fā)環(huán)境。
IntelliJ IDEA - 2001年發(fā)布。一套智能的 Java 集成開發(fā)環(huán)境,特別專注與強(qiáng)調(diào)程序師的開發(fā)撰寫效率提升。
PhpStorm - PHP IDE開發(fā)工具。
PyCharm - 一款結(jié)合了Django框架的Python IDE開發(fā)工具。
AppCode - Swift 和 Objective-C IDE開發(fā)工具。
Visual Studio Code(簡稱VS Code)是一個由微軟開發(fā),同時支持Windows 、 Linux和macOS等操作系統(tǒng)的免費(fèi)代碼編輯器,它支持測試,并內(nèi)置了Git 版本控制功能,同時也具有開發(fā)環(huán)境功能,例如代碼補(bǔ)全(類似于 IntelliSense)、代碼片段和代碼重構(gòu)等。該編輯器支持用戶個性化配置,例如改變主題顏色、鍵盤快捷方式等各種屬性和參數(shù),同時還在編輯器中內(nèi)置了擴(kuò)展程序管理的功能。
在2019年的 Stack Overflow 組織的開發(fā)者調(diào)研中,VS Code被認(rèn)為是最受開發(fā)者歡迎的開發(fā)環(huán)境。
測試
軟件工程師不僅要寫代碼,還要做測試,軟件測試和軟件開發(fā)是相伴相生,測試能讓保證我們寫出代碼更加健壯和可維護(hù)。
TDD是測試驅(qū)動開發(fā)(Test-Driven Development)的英文簡稱,是敏捷開發(fā)中的一項(xiàng)核心實(shí)踐和技術(shù),也是一種設(shè)計(jì)方法論。TDD的原理是在開發(fā)功能代碼之前,先編寫單元測試用例代碼,根據(jù)測試代碼確定需要編寫什么產(chǎn)品代碼。需要掌握和了解以下測試技術(shù)和方法。
單元測試
壓力測試
全鏈路測試
A/B 測試,灰度發(fā)布,藍(lán)綠部署
學(xué)習(xí)順序
總結(jié)下,后端技術(shù)學(xué)習(xí)的內(nèi)容還是很多的,不可能一蹴而就。
這篇文章能看到這里的同學(xué),如果是初學(xué)者,可能就想問直接問我從哪里開始學(xué)習(xí)?那我就不賣關(guān)子,如果你不知道從哪開始學(xué),對于學(xué)習(xí)路線各個節(jié)點(diǎn),我就按個人的學(xué)習(xí)經(jīng)驗(yàn)并結(jié)合認(rèn)識的大廠高 P 給的建議,給你把以上技術(shù)路線學(xué)習(xí)優(yōu)先級做個排序,你照著學(xué)就行,排序規(guī)則:
星級越高,排名越靠前,重要程度越高,優(yōu)先安排時間學(xué)習(xí)。
計(jì)算機(jī)基礎(chǔ) 5星
Linux 5 星
數(shù)據(jù)庫 5 星
設(shè)計(jì)模式 5 星
工具 5 星
中間件 4 星
分布式 4 星
高并發(fā)、高可用、高性能 4 星
搜索引擎 4 星
測試 3 星
監(jiān)控與統(tǒng)計(jì) 3 星
虛擬化 3 星
安全 3 星
大數(shù)據(jù) 3 星
語言的困惑
細(xì)心的讀者應(yīng)該發(fā)現(xiàn)了,到目前為止本文討論的后端技術(shù)學(xué)習(xí)路線內(nèi)容,并沒有提及特定編程語言,不提及并不是說不重要,語言是很多技術(shù)的前置知識。打個比方來說,編程語言是磚瓦,高大上的項(xiàng)目都是一磚一瓦堆砌而成。
其實(shí)你在學(xué)習(xí)上述技術(shù)點(diǎn)的過程中,會自然而然的接觸到各種編程語言的中間件或是開源項(xiàng)目,不管用什么語言做后端服務(wù)開發(fā),都是沒有問題的,并且都不有很多優(yōu)秀的開源框架可以借鑒學(xué)習(xí),關(guān)鍵是要有清晰的學(xué)習(xí)路線,主流的后端開發(fā)語言包括 Java、C++、PHP、Python、Go ,那學(xué)哪個呢?
如果你是在校的學(xué)生,時間充足,我建議可以都可以嘗試下,不試過怎么知道不合適?然后結(jié)合自己偏愛和未來打算從事的崗位方向選擇一門語言深入學(xué)習(xí);
如果你是職場社畜,那就要適應(yīng)團(tuán)隊(duì),產(chǎn)品業(yè)務(wù)需要用什么語言開發(fā)那就學(xué)哪個。萬變不離其宗,后端技術(shù)的知識都是相通的,不要被特定語言所束縛,這些通用的后端技術(shù)掌握后,剩下的就只是編程語言學(xué)習(xí),很快啊,很快的。
如果本文對你有用,請幫忙轉(zhuǎn)發(fā)關(guān)注支持一下!
作者:Java大蝸牛001
鏈接:https://juejin.cn/post/6951289343365349406
來源:掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。