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