互連網服務端技術——如何學(中)

來源:互聯網
上載者:User

標籤:

boys & girls,我們的中場休息結束了哈,趕緊搬板凳繼續聽老王扯技術的淡~

(悄悄的廣播一下:如果沒有看過上一篇的同學,請關注老王的simplemain,或者拉到本文末尾掃描/識別二維碼)

 

上一篇,我們談到了互連網服務端技術的整體藍圖。同時順著這個藍圖中,介紹了語言、演算法和資料結構、架構具體有哪些要求以及怎麼樣去學習他們。接下來,老王準備介紹另外幾個比較基礎,又在工程中大量使用的技術。具體是什麼呢?我們接著往下看。首先我們還是把那幅藍圖擺出來(開始裝B啦~)。

聰明的同學一定已經發現,這一篇要介紹的:作業系統、資料庫和網路,在我們的藍圖中都佔了兩層。這兩層代表什麼呢?老王是這麼來看的:一層是體系本身,一層是基於體系的應用。比如,作業系統就涵蓋了作業系統本身以及基於作業系統的使用。那這兩層分別有什麼要求,以及如何來學習呢?

 

·作業系統(operating system)

大家聽到作業系統,第一反應是什嗎?

十年前,我的第一反應是:win98(是不是很古老的記憶了,哈哈哈~);

如今,我的第一反應是:安卓還是iOS?

你呢?

 

我們是碼工,天生的使命就是繁育後代(生物使命)和創造程式(社會使命)。我們的後代生長在這個地球,而我們的程式則是運行在作業系統之上。因此,要想我們的程式跑的快、啟動並執行好,就需要像瞭解我們產生的環境一樣,去瞭解作業系統。

 

我們對於作業系統的學習大致上可以分為兩個方面來學習:一是某個具體的作業系統(比如: windows、 linux等);另一個則是作業系統原理。根據不同的能力等級,對應的要求也是不一樣的。

 

[初級能力]

要讓程式跑起來,我們就需要熟練使用一個作業系統。大家想想,我們對於windows的操作是否已經很熟練?常用的操作有哪些?為了運行一個程式我們要做哪些操作?

 

我相信99.99%的程式員們,對上述這個問題的回答:你的這個問題簡直是在侮辱我的智商(老王已經準備好被打了~)

 

好吧,老王來回答上面的這些問題。我們要熟練使用windows,實際上就是會常見的操作、明白他的檔案管理方式、知道cpu和記憶體的運轉狀態等等。常見的操作有:

1、目錄和檔案的建立、開啟、處理和關閉(還記得案頭左上方那個“我的電腦”嗎?);

2、下載、安裝、運行一個程式(“下一步”、“下一步”……“完成”、“雙擊開啟”);

3、觀察cpu、記憶體、磁碟、網路的情況(工作列右鍵,點擊“工作管理員”)。

 

如果你使用的是windows作為伺服器,基本上對於作業系統的要求就是這樣的。但是,很不幸的是,如今互連網絕大部分伺服器使用的是linux作為伺服器,那碼工們就需要學會上述操作對應的linux命令(老王最近正在教家裡領導使用linux,準備寫一篇linux入門手冊……),具體的就是:

1、mkdir、cd、vim……

2、make&& make install、yum install、apt-get install、./run……

3、ps、top、free、df、netstat、vmstat、iostat……

 

如果沒有linux基礎,是不是覺得好難?!

 

其實,你把linux看成文字版的windows,這個事情就簡單了。先把windows操作翻譯成英語,再縮寫,就是高大上的黑屏+命令(特別是在妹子跟前玩兒黑屏,簡直是極限裝B)。比如:

a、建立目錄 ->make directory -> mkdir;

b、雙擊開啟某個目錄 ->change directory-> cd;

c、磁碟剩餘 ->disk free ->df。

 

所以,對於這個能力等級的要求,就是像使用windows一樣,去使用linux就可以了。學習的時候也不用那麼枯燥的去記住命令,而是用windows操作的方式去類比,這能涵蓋80%左右的操作。有一些特殊的,需要特別去記一下。

 

另外,linux命令有一個很麻煩的事情,就是參數有點兒多,咋辦呢?linux的命令一般提供兩種協助:

1、命令 --help(比如:cd --help),會提供給你簡要的參數提示

2、man 命令(比如:man cd),這裡的man不是男人的意思,而是手冊的縮寫。協助你全面的瞭解這個命令。

 

只要有這兩個神器,大部分問題還是能搞定。如果還搞不定,就用另外一個神器:

3、瀏覽器輸入:www.baidu.com斷行符號,搜尋方塊輸入:linux 命令……

 

除了基本命令以外,還有幾個東東要學習一下:管道(|)、輸入重新導向(<)、輸出重新導向(>)。大體就這些,怎麼樣,是不是輕鬆了些?

 

[中級能力]

我面試別的程式員的時候,經常喜歡問一個問題:當你遠程登入你的linux伺服器,發現執行命令很卡頓,請問你如何來分析出了什麼問題?以及怎麼樣來解決?(這個問題其實也擴充到windows等其他的伺服器作業系統)

 

問這個問題,其實就是想考察面試者對作業系統是否熟悉,有些原理性的東西是怎麼樣來看的,以及如何去解決他。

 

當你擔當一部分或者全部伺服器營運任務的時候,或者需要在作業系統上做相關開發的時候。這個時候,就不光要會基本的命令,基本的操作,還要會以下的一些能力:

 

1、寫指令碼:我們除了要瞭解常用的操作命令以外,還需要用熟一些進階的命令,比如:awk、sed、chown、chmod、find、sort等。同時,還要瞭解一些shell的關鍵字,比如:if、for、while、read等,把這些命令組合起來,寫一些稍微有邏輯的指令碼,方便對機器和程式進行管理;

 

2、懂原理:我們對於作業系統除了知其然,還要知其所以然。懂得作業系統一些原理性的東西。比如,進程是如何建立的、什麼是僵死進程、檔案是如何建立的、什麼是inode、資料是怎麼儲存到磁碟的、什麼是尋道、記憶體是怎麼分配的,等等。這樣可以方便我們維護伺服器的正常運轉,分析和解決作業系統出現的一些問題。

 

3、會編程:瞭解作業系統提供的API,能將原理性的東東對應到程式上,編寫出我們想要的功能代碼,並進行編譯、連結等操作。比如,我們監控一個機器的運轉,就需要編寫對應的監控程式,對cpu、記憶體、磁碟等進行即時分析,如果出現問題,就提醒管理員。(現在很多進階程式語言已經提供了虛擬機器,從而使得程式具有了很好的跨平台的能力。這一點其實協助不少程式員脫離了苦海。不過如果要編寫高效能的伺服器程式,有可能還是需要對c/c++,甚至組合語言有所瞭解,同時瞭解作業系統提供的api)。

 

會以上的這些,基本上就基本上是半個專家了,足以應對大多數情況。

 

那怎麼學呢?

 

對於命令和指令碼,老王以前喜歡ls /sbin和ls /bin,看看都有哪些命令,然後一個個的去網上查,看看他們都是幹嘛的。對於比較知名的幾個命令,就用man,看看他們詳細的用法,並寫指令碼實際去用一用。

 

對於原理性的東東,老王建議大家看看作業系統原理相關的書籍,上面都有比較詳細的講解:cpu管理、記憶體管理、檔案管理等等。

 

對於編程,如果是linux的伺服器,推薦大家一本寶典:APUE,《Advanced Programming in the UNIXEnvironment》,中文名:《UNIX環境進階編程》。老王大概讀過2-3遍,每一次讀都受益匪淺。不過光讀是不行的,最好是按照例子寫寫,才能理解。只看書的意義不大;如果是windows的伺服器,老王在10多年前寫過一些windows的程式,當時還在念本科1-2年級,那個時候還是用的vc6(那是多麼古老的記憶),看過一大半《windows程式設計》,覺得還不錯。不知道現在怎麼樣了,所以老王就不做推薦了。

 

[進階能力]

如果你是營運方面的專家,或者是作業系統的研發者。就需要對作業系統本身有深入的瞭解了。這包含兩個層面的東東:

 

1、對作業系統原理有比較深入的瞭解:處理器管理、儲存空間管理、檔案管理、裝置管理等等,具象化以後,涵蓋進程、分頁分段、檔案儲存體等等內容,讓你從抽象的角度去看待作業系統。

 

2、精深某一個作業系統:能把作業系統原理的東東落地到某一種作業系統中。比如:實現linux的檔案管理。或是根據業務需求,定製和重新編譯一個作業系統。

 

因為老王只是學過作業系統原理,對常規的原理有一定的瞭解,做底層開發的時候涉及過某些東東,但大部分沒有去做過深入實踐,所以這一部分確實也給不出太好的建議,只能是建議大家讀讀相關的書籍。如果有這方面的專家,也歡迎給出意見,大家一起學習和進步~

 

作業系統是我們碼工必須依賴的生存環境,每天都會面對。所以如果要從事互連網服務端的研發,最好能非常熟練使用至少windows和linux兩種系統。一個給你很好的案頭辦公環境,一個給你很好的程式運行環境。

 

·資料庫(database)

在談論資料庫技能之前,想問大家一個問題:為什麼要有資料庫?或者也可以換一個問法:沒有資料庫有什麼影響?

 

在回答這個問題前,老王講一個故事。當我剛剛進入百度的時候(大約是07-08年),百度(至少我所在的大部門)還基本上沒有使用資料庫,所有的系統用c/c++來開發,除了要考慮邏輯層面的東東,還要考慮如何將每個系統產生的邏輯資料寫成結構體儲存到磁碟檔案(序列化寫入),以及如何從磁碟檔案中讀取結構體資料(序列化讀入)。為了開發一個功能模組,需要以月為單位,這在移動互聯的今天,簡直就是無法忍受的慢。而我們現在怎麼做呢?用java/ruby等進階語言寫邏輯,將資料存入到資料庫中,開發一個完整功能的系統也就幾周(如果功能不大,可能就幾天)。

 

不錯,資料庫就是幫我們解決資料存放區的問題,他提供了通用的資料存放區和讀取的方案。能幫我們解決大部分資料存放區問題(有些系統資料庫也可能搞不定,或者說搞定成本比較高,以後講到的時候,再跟大家分享),極大的提升我們開發的速度。

 

我們常用的關係型資料庫,比如mysql、 sqlserver、 db2、 oracle、 postgresql等等,都包含了:sql操作、交易管理、檔案儲存體、索引管理等功能(不同資料庫在實現上會有功能差異,但大面兒上是一致的)。他們提供的這些功能足夠滿足我們日常開發的需求(完全是碼工們的救星,如果沒有資料庫,估計碼工們都被產品經理打死完了,哈哈哈~)。後來,幾年前又開始流行非關係型資料庫,比如mongodb、redis等等,這些NoSql的資料庫以輕量化設計,快速的查詢效率,在如今的互連網研發中也起到了很重要的作用(比如,對於需求快速更迭的實驗性產品,mongodb就用文檔儲存方式來應對,避免了傳統關聯式資料庫的行列限制;redis提供更多的資料結構支援等等)。

 

一般我們在中大型的資料訪問和儲存方案上,採用NoSql和RDBS相結合的方式。常常會把訪問速度快,輕量化的非關係型資料庫當做臨時性資料訪問介質,比如,memcache、redis常常被當做cache,用於應對大量重複的請求。而關係型資料庫則用來當做一致性要求較高的持久化儲存。

 

所以,針對不同的應用情境,我們對於資料庫的要求也是不一樣的。

 

[初級能力]

這個層級的能力要求,就是滿足日常業務開發需求,直白一點就是:能用!所以:

 

1、要麼用熟一種非關係型資料庫:會用程式訪問常用的set、get、delete、modify等介面;

 

2、要麼用熟一種關係型資料庫:會常用的sql來做查插刪改;會用程式訪問資料庫。

當然,以上的前提是:學會安裝和配置某種資料庫。這些要求都是碼工解決基本溫飽最基礎的

 

[中級能力]

如果你是一個公司的服務端技術負責人,就需要對資料庫有比較深入的瞭解,以應對資料量、資料一致性、查詢和提交的並發請求量等的問題。除了會基本的操作以外,你還需要對資料庫原理和某一種資料庫有一個比較深入的瞭解。可能非關係型和關係型都需要有一定的涉及。

 

1、非關係型資料庫:他是如何?的?提供哪些特殊的功能以協助我們實現不同的需求?有哪些瓶頸和問題?資料量大了以後,如何來保證資料的一致性和可用性?等等;

 

2、關係型資料庫:需要瞭解sql操作、交易管理、檔案儲存體、索引管理等幾大部分的基本原理;基本能回答以下這些問題:每一個sql請求是如何做查詢最佳化的?索引是如何設計的?以及索引的種類和工作原理?事務是如何管理的(比如mvcc)?資料是如何儲存到磁碟的?等等。

 

那麼如何來學習呢?對於實現不複雜的資料庫,最好的方式就是閱讀原始碼;對於原理性的東東,需要看演算法資料結構、作業系統原理的知識來補充(比如:b樹和b+樹、hash演算法;read、write這些io調用等)。還有一點,電腦科學是一門實踐性的科學,光看書是不行的,還需要寫代碼練習。所以,如果有機會,可以自己用檔案的方式來實現儲存。等寫完以後,很多問題就會有更深入的認識(比如:fwrite是否有緩衝?write是否有緩衝?什麼是位元組對齊?什麼是mmap、DirectIO等等)。

 

另外,可能還要詳細研究不同資料庫的配置說明。配置參數不一樣,資料庫效能表現會有很大差異。比如:記憶體調多大?讀取逾時配置多少?資料刷回磁碟的頻率是多少?等等

 

[進階能力]

這個就是專家級的要求了。對資料庫原理非常精通,精深一個資料庫系統。除了會滿足開發需求外,還可以對資料庫進行代碼修改打patch、對資料庫進行功能完善等。

 

老王自認達不到這個能力要求,所以這個方面建議不多。不過當年在百度的同居蜜友,現在已經是mysql的大犇,去年請他來百詞斬做過技術分享。

 

互連網服務端的最大技術痛點,就是資料的儲存(老王當年選擇百度的很重要的一個原因,就是自己在拉活兒的時候,解決不了訪問量大了以後,資料讀取和寫入慢的問題)。而資料存放區又分成特殊資料存放區和通用資料存放區。其中通用資料存放區,目前最好的解決方案就是資料庫。所以,學好資料庫技術是學好互連網服務端技術的重中之重。

 

·網路(network)

所謂互連網互連網,最重要的當然就是這個網路了。大家對tcp/ip、http這些名詞,估計都聽的耳朵都發繭了。

 

對於互連網server的開發來說,我們一般會比較看重三個方面:網路通訊協定、網路服務模型和網路安全。網路通訊協定是我們所有工作的基礎,是電腦網路的基礎理論;網路服務模型可以讓我們能有更高效的服務能力;而網路安全,則是保障我們服務安全的基礎。

 

針對不同的特點,不同能力等級的要求自然也有不一樣。

 

[初級能力]

1、協議知識:知道網路分層的原理,懂得常用的網路通訊協定,以及對他們的熟練應用。需要瞭解常見的協議:

a、HTTP協議。http協議是搞互連網的基礎,所以是一個必須要瞭解的。什麼是header、什麼是cookie、常見的返回碼(2xx、3xx、4xx、5xx)、什麼是post、get等等。會用工具發送http請求,或者用程式發送http調用等。

b、TCP/IP協議。這個也自然不用說,作為一個碼工,肯定應該知道什麼是ip地址?什麼是連接埠?怎麼樣建立串連?等等(如果這個不懂,怎麼幫女生修電腦呢,對不對?)

 

2、服務模型:如果是常見的web服務,就需要瞭解常見的web伺服器,會搭建、會配置、會使用。保證我們的使用者能成功的接入服務。比如:現在流行的nginx(或者以前流行過的apache、lighttp等)。如果是socket服務,就可能需要關注一些其他的伺服器或者組件(比如java的mina、netty等等),會配置,會使用。

 

3、網路安全:瞭解常見的安全威脅,比如:DoS、DDoS、xss、sql注入等。寫代碼的時候,能去主動規避常見的編碼漏洞(比如html轉義、sql轉義等)。

 

[中級能力]

對於這個能力等級的要求,主要是對網路有一個全面的瞭解,會編寫高效率網路程式,能防範一些常見的網路攻擊。因此就需要充分瞭解以下知識:

 

1、協議知識:對於互連網服務端的開發,重點要關注的就是TCP/IP和HTTP協議,具體的知識涵蓋如下:

a、網路通訊協定棧是如何分層的,以及每一層的職責和工作原理;每一層常見協議的包格式以及應用情境;

b、TCP、IP協議:IP報文的格式、協議的路由規則、 IP地址的相關內容(網關地址、廣播位址、子網路遮罩、A-D類地址等);TCP的三向交握、優雅關閉、滑動視窗、逾時重傳等。

c、Http、Https協議:這兩個協議的工作原理(https可以參見老王之前寫的一篇文章《Https到底是個啥玩意兒?》),以及一些深入的用法,比如keep alive、range等;

d、其他的一些技術,比如:網路位址轉譯(NAT)等等。

 

2、服務模型:

a、會寫基本的client-server代碼;

b、瞭解常見的網路模型,最好能寫出相關的模型代碼。比如:select、epoll;

c、常見setsockopt選項的作用: SO_RCVTIMEO、SO_SNDTIMEO、SO_REUSERADDR、SO_LINGER等。

d、瞭解常見webserver架構和工作原理,比如nginx、apache;

 

3、網路安全:

a、瞭解常見攻擊的原理,以及如何預防和處理。比如:syn半串連攻擊的產生原因和如今的解決方案。

b、會使用常見的網路工具和方法去規避網路風險。比如:iptables的配置和使用、資料庫授權管理和安全配置等等。

 

為了比較全面的瞭解網路這一部分,推薦大家閱讀經典的《TCP/IP詳解》三部曲;以及閱讀常見網路伺服器的原始碼;同時可以關注wooyun.org上面的相關知識。

 

[進階能力]

到這個階段,基本上就是某個方面的專家。要麼對網路通訊協定十分精通、要麼對網路服務模型十分瞭解,或者是網路安全的專家。具體的:

1、充分瞭解網路通訊協定,並能編寫協議代碼;

2、或者編寫高效的大規模網路伺服器;

3、或者對網路安全攻防了如指掌。

 

老王當年讀書那會兒,沒事兒幹就寫了寫ICMP協議,本來想用UDP類比實現TCP,但是沒有落地。後來工作以後,抽時間看過部分apache代碼、java的mina、thrift的代碼,改過tomcat的一些代碼,自己用java實現了reactor模型代碼,但是沒有機會去應用到大規模網路訪問中。不過,對於網路攻防做的比較少,沒有什麼經驗。

 

老王得出的一個經驗就是,有機會就多看書,多看原始碼,多思考,多折騰~ 生命不息,折騰不止。

 

=== 休息的分割線 ===

 

好了,老王今天的故事講完了,覺得怎麼樣?接下來的下篇相比上篇和中篇,更偏重實際工程中遇到的問題,因此實際操作性更強,內容更加貼地,請關注老王下一場的扯淡吧~

 

話外音:老王現在基本上每周出一篇文章,有盆友問老王為什麼不能天天出呢?原因是這樣的。可能很多盆友都發現了,老王的文章一般很長(似乎大概可能也許是4000-8000字,所以感謝大家有耐心讀完這麼冗長的文字),純碼字大概要弄幾個小時。同時工作日還要加班創業,所以一般只有周末有時間來碼字。而且老王本著對大家負責,對心負責的態度,會反覆的review和修改(這篇文章已經修改過至少4遍了)。所以老王儘力保證一周出一篇老王自己覺得還不錯的文章,希望大家理解哈~

 

還沒關注老王?趕緊加吧:simplemain

或者掃碼/長按識別二維碼:

來,看美圖了。這是2012年老王去滿洲裡-呼倫貝爾-根河-額爾古納拍的美景。老王走過大約20個省,這是可以排到Top3的地方。


互連網服務端技術——如何學(中)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.