Node.js與Golang使用感受與小結
目錄
一、互聯網的基石TCP/IP協議
二、HTTP服務器編寫與編程語言無關
三、構建HTTP服務器需要掌握的知識點
四、HTTP協議基礎
五、Node.js簡介
六、是前端選擇,還是后端的福音?
七、Node.js與傳統php-fpm模式之間的對比
八、安裝Node.js
九、讓瀏覽器讀懂你的心--Content-Type
十、向瀏覽器發送文件
十一、Node.js異步流程控制(序列模式、並發模式、有限並發模式)
十二、靜態資源文件的簡單優化
十三、現在還需少些什么?
十四、Golang 簡介
十五、為什么要用Golang ?
十六、安裝Golang開發環境
十七、如何使用Golang 編寫一個HTTP服務器?
十八、Golang 的http包與Node.js的http模塊對比
前言
這篇文章是對於近段時間以來我對於這兩個平台的一些初步的了解,或許文中某些觀點與您有所不同,但這卻是此時我對這兩個平台的一些認識,以及使用這兩個平台給我帶來的真實感受。
一、互聯網的基石TCP/IP協議
可以毫不誇張的說,如果沒有TCP/IP 協議,那么也就沒有此時的互聯網。TCP/IP協議的架構層,經常被人們與OSI網絡分層相對比。從概念上來說OSI或許更加完善先進,但是歷史卻選擇了TCP/IP協議。因為早期的unix系統實現了TCP/IP協議,並且運行的很好。於是OSI模式便很少有人願意去實現它,也許正是因為這樣。TCP/IP協議才成就了今天的地位,行業的標准。
二、HTTP服務器編寫與編程語言無關
2009年之前,大部份web方面的從業者都習慣於使用服務器+語言的運行模式,比如用
Apache+php 或Nginx+php的模式。但隨后出現的一些語言平台以及基於某些語言的框架打破了這種模式。比如Node.js,又比如Ruby社區的Rails。由此可見編寫一個HTTP服務器,與您所使用的語言沒太多關系。不管你用javascript、或php或python,只要能把內容通過HTTP協議推送到前端瀏覽器就好。
三、構建HTTP服務器需要掌握的知識點
1、HTTP協議基礎(知道HTTP通信的基本模式,包括常用報文)
這篇文章沒有打算對於某門語言進行入門級別的指導,因此您可能需要自己去網絡上搜集這方面的資源。關於HTTP協議基礎可以參考《HTTP權威指南》,您可以花一兩周的時間把這本書看完。相信您看完之后,多少都會對您的知識體系有所幫助。
2、熟悉一門語言python,ruby,php,javascript 等,甚至Lisp也行。
熟悉一門語言是必須的,建議您選擇一門喜歡的語言去學習,無論是Golang或是javascript,都是不錯的開始。編程語言很大程度上只是你去實現某些事情的一個工具,不必執着於哪門語言好或壞,每一門語言能存在五年以上並且還有很多人用的語言,必然有着它吸引人的地方。
3、能夠用你熟悉的語言進行基於TCP/IP協議上的通信。
無論你選擇什么樣的語言,如果進行網絡編程的話都需要想辦法讓它能支持TCP/IP協議。據目前的情況來看,很多現代語言或多或少的都有方法去支持TCP/IP通信。甚至php這門語言,也可以通過libevent 的擴展實現一個簡單的http服務器。
四、HTTP協議基礎
HTTP是以TCP/IP為基礎的網絡協議,目前該協議最為常用的版本是1.1版本。了解HTTP協議的一些簡單知識,可以在您編寫服務器時更快的發現和解決問題。當然HTTP頭中的很多信息對於網站的優化都會有影響,比如頭部中的緩存控制可以讓您減少服務器的I/O消耗,現代服務器的主要瓶頸還是在於I/O消耗。
HTTP協議主要由兩個過程組成------請求報文與返回報文。
關於請求報文
請求報文主要由兩部份組成,第一部份則是起始行,起始行規定了請求時使用的HTTP方法、請求資源路徑以及當前客戶端使用的HTTP協議版本(雖然現在大部份瀏覽器都默認使用1.1版本,但是還是有部份用戶使用更為古老的版本)。下圖是一個請求報文的抓包截圖,我們將會對其進行簡單的說明。

字段 |
字段名 |
解釋 |
擴展 |
Host |
nodejs.org |
告訴服務器當前訪問的主機名為nodejs.org |
如果你正在實現一個類似於Apache中的vhost功能,那么這個字段可能對你有用 |
User-Agent |
:Mozilla/5.0 (windows NT 6.1; wow64;rv:18.0) Gecko/20100101 Firefox/18.0 |
告訴服務器,當前訪問您的設備的工作環境 |
如果你正在做一個瀏覽器信息統計的功能,那么這段報文可能對你有用,當然這段報文也可以被用戶偽造 |
Accept |
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
|
告訴服務器,當前訪問您的瀏覽器支持些什么文檔類型 |
|
Accept-Language
|
en-US,en;q=0.5
|
告訴服務器,當前訪問您的設備支持些什么語言 |
如果您正在制作一個國際化的站點,那么這一部份信息可能對您有用。 |
Accept-Encoding
|
gzip, deflate
|
告訴服務器,當前訪問您的設備支持哪些壓縮算法 |
如果您想減少網絡傳輸量,特別是靜態資源的傳輸量。可能這一部份信息對您有用,在實際工作中有些靜態資源通過Gzip壓縮后,體積只有原來的30%左右。 |
Pragma |
no-cache |
告訴服務器,此頁面不緩存 |
事實上這個字段可以用Cache-Control控制 |
Cache-Control |
no-cache |
告訴服務器,此頁面不緩存 |
做頁面緩存控制的時候可以使用 |
第一行 GET http://nodejs.org/ HTTP/1.1 這一行的意思是瀏覽器告訴服務器端,當前正在使用HTTP 1.1協議中的GET方法獲取http://nodejs.org/ 這個路徑的資源。第一行之下的部份,可以單獨看成一個部份。以鍵值對(K-V)的形式存在,可以想像成關系數據庫中的字段與字段值。
Web開發基本上都是圍繞http協議展開,所以了解並熟悉http協議對於長遠發展來說是有好處的。通過合理利用http header字段,還能夠幫助我們減少很多安全方面的問題。但目前注重一塊的web開發人員較少。
未來完,,,待續
==========================================================
關於作者:
網名:念念之間 現居:深圳
Email:jinfei121@qq.com
QQ:490821193
從03年開始玩論壇,但正式寫代碼是前幾年的事情。剛工作前兩主要寫php程序,目前主要專職寫
Javascript.平時喜歡研究各種新鮮技術~~
Node與Golang的粉絲~~
==========================================================