用 Go 語言,做 Web 編程開發 Web 介紹

人民郵電出版社和實驗樓合作的第 15 本書來了!

Web 介紹

Web 應用在我們的生活中無處不在。看看我們日常使用的各個應用程序,它們要麼是 Web 應用,要麼是移動 App 這類 Web 應用的變種。無論哪一種編程語言,只要它能夠開發出與人類交互的軟件,它就必然會支持 Web 應用開發。對一門嶄新的編程語言來說,它的開發者首先要做的一件事,就是構建與互聯網(internet)和萬維網(World Wide Web)交互的庫(library)和框架,而那些更爲成熟的編程語言還會有各種五花八門的 Web 開發工具。

Go 是一門剛開始嶄露頭角的語言,它是爲了讓人們能夠簡單且高效地編寫後端系統(back end system)而創建的。這門語言擁有衆多先進的特性,並且密切關注程序員的生產力以及各種與速度相關的事項。和其他語言一樣,Go 語言也提供了對 Web 編程的支持。

本節實驗將列舉一些使用 Go 編寫 Web 應用的優點,並介紹一些關於 Web 應用的基本知識。

知識點

  • Web 應用的定義
  • 使用 Go 語言編寫 Web 應用的優點
  • Web 應用編程的基本知識
  • 使用 Go 語言編寫一個極爲簡單的 Web 應用

使用 Go 語言構建 Web 應用

Go 是一門相對比較年輕的編程語言,它擁有繁榮並且仍在不斷成長的社區,並且它也非常適合用來編寫那些需要快速運行的服務器端程序。因爲 Go 語言提供了很多過程式編程語言的特性,所以擁有過程式編程語言使用經驗的程序員對 Go 應該都不會感到陌生,但與此同時,Go 語言也提供了函數式編程方面的特性。除了內置對併發編程的支持之外,Go 語言還擁有現代化的包管理系統、垃圾收集特性以及一系列包羅萬象、威力強大的標準庫。

雖然 Go 自帶的標準庫已經非常豐富和宏大了,但 Go 仍然擁有許多質量上乘的開源庫,它們可以對標準庫不足的地方進行補充。

使用 Go 語言進行 Web 開發正變得日益流行,很多公司都已經開始使用 Go 了,其中包括 Dropbox、SendGrid 這樣的基礎設施公司,Square 和 Hailo 這樣的技術驅動的公司,甚至是 BBC、紐約時報這樣的傳統公司。

在開發大規模 Web 應用方面,Go 語言提供了一種不同於現有語言和平臺但又切實可行的方案。大規模可擴展的 Web 應用通常需要具備以下特質:

  • 可擴展;
  • 模塊化;
  • 可維護;
  • 高性能。

可擴展

大規模的 Web 應用應該是可擴展的(scalable),這意味着應用的管理者應該能夠簡單、快速地提升應用的性能以便處理更多請求。如果一個應用是可擴展的,那麼它就是線性的,這意味着應用的管理者可以通過添加更多硬件來獲得更強的請求處理能力。

有兩種方式可以對性能進行擴展:

  • 垂直擴展(vertical scaling),即提升單臺設備的 CPU 數量或者性能;
  • 水平擴展(horizontal scaling),即通過增加計算機的數量來提升性能。

因爲 Go 語言擁有非常優異的併發編程支持,所以它在垂直擴展方面擁有不俗的表現:一個 Go Web 應用只需要使用一個操作系統線程(OS thread),就可以通過調度來高效地運行數十萬個 goroutine。

跟其他 Web 應用一樣,Go 也可以通過在多個 Go Web 應用之上架設代理來進行高效的水平擴展。因爲 Go Web 應用都會被編譯爲不包含任何動態依賴關係的靜態二進制文件,所以我們可以把這些文件分發到沒有安裝 Go 語言的系統裏,從而以一種簡單且一致的方式部署 Go Web 應用。

模塊化

大規模 Web 應用應該由可替換的組件構成,這種做法能夠使開發者更容易添加、移除或者修改特性,從而更好地滿足程序不斷變化的需求。除此之外,這種做法的另一個好處是使開發者可以通過複用模塊化的組件來降低軟件開發所需的費用。

儘管 Go 是一門靜態類型語言,但用戶可以通過它的接口機制對行爲進行描述,以此來實現動態類型匹配(dynamic typing)。Go 語言的函數可以接受接口作爲參數,這意味着用戶只要實現了接口所需的方法,就可以在繼續使用現有代碼的同時向系統中引入新的代碼。與此同時,因爲 Go 語言的所有類型都實現了空接口,所以用戶只需要創建出一個接受空接口作爲參數的函數,就可以把任何類型的值用作該函數的實際參數。此外,Go 語言還實現了一些在函數式編程中非常常見的特性,其中包括函數類型、使用函數作爲值以及閉包,這些特性允許用戶使用已有的函數來構建新的函數,從而幫助用戶構建出更爲模塊化的代碼。

Go 語言也經常會被用於創建微服務(microservice)。在微服務架構中,大型應用通常由多個規模較小的獨立服務組合而成,這些獨立服務通常可以相互替換,並根據它們各自的功能進行組織。比如,日誌記錄服務會被歸類爲系統級服務,而開具賬單、風險分析這樣的服務則會被歸類爲應用級服務。創建多個規模較小的 Go 服務並將它們組合爲單個 Web 應用,這種做法使得我們可以在有需要的時候對應用中的服務進行替換,而整個 Web 應用也會因此變得更加模塊化。

可維護

和其他龐大而複雜的應用一樣,擁有一個易於維護的代碼庫(codebase)對大規模的 Web 應用來說也是非常重要的。這是因爲大規模的應用通常都會不斷地成長和演化,所以開發者需要經常性地回顧並修改代碼,而修改難懂、笨拙的代碼需要花費大量的時間,並且隱含着可能會造成某些功能無法正常運作的風險。因此,確保源代碼能夠以適當的方式組織起來並且具有良好的可維護性對開發者來說就顯得至關重要了。

Go 語言的設計鼓勵良好的軟件工程實踐,它擁有簡潔且極具可讀性的語法以及靈活且清晰的包管理系統。除此之外,Go 語言還有一整套優秀的工具,它們不僅可以增強程序員的開發體驗,還能夠幫助他們寫出更具可讀性的代碼,比如以標準化方式對 Go 代碼進行格式化的源代碼格式化程序 gofmt 就是其中一個例子。

因爲 Go 語言希望文檔可以和代碼一同演進,所以它的文檔工具 godoc 會對 Go 源代碼及其註釋進行語法分析,然後以 HTML、純文本或者其他多種格式創建出相應的文檔。godoc 的使用方法非常簡單,開發者只需要把文檔寫到源代碼裏面,godoc 就會把這些文檔以及與之相關聯的代碼提取出來,生成相應的文檔文件。

除此之外,Go 還內置了對測試的支持:gotest 工具會自動尋找與源代碼處於同一個包(package)之內的測試代碼,並運行其中的功能測試和性能測試。Go 語言也提供了 Web 應用測試工具,這些工具可以模擬出一個 Web 服務器,並對該服務器生成的響應(response)進行記錄。

高性能

高性能不僅意味着能夠在短時間內處理大量請求,還意味着服務器能夠快速地對客戶端進行響應,並讓終端用戶(end user)能夠快速地執行操作。

Go 語言的一個設計目標就是提供接近於 C 語言的性能,儘管這個目標目前尚未達成,但 Go 語言現在的性能已經非常具有競爭力:Go 程序會被編譯爲本地碼(native code),這一般意味着 Go 程序可以運行得比解釋型語言的程序要快,並且就像前面說過的那樣,Go 語言的 goroutine 對併發編程提供了非常好的支持,這使得 Go 應用可以同時處理多個請求。

希望以上介紹能夠引起你對使用 Go 語言及其平臺進行 Web 開發的興趣。但是在學習如何使用 Go 進行 Web 開發之前,我們需要先來了解一下什麼是 Web 應用,以及它們的工作原理是什麼,這會給我們學習之後的內容帶來非常大的幫助。

以上內容來自《Web 編程》第一章,點擊鏈接即可免費試學前兩章!

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