1.前言
背景
工作由PHP轉Golang,最近在用GO開發微服務後台,在學習中,如果理解有誤,歡迎交流~~目前只是使用Go micro架構來搭建後台微服務,服務發現使用etcd,協議使用PB,資料讀取使用redis。
技術棧
- Golang(開發語言)
- Go-micro (RPC架構)
- etcd (分布式索引值資料庫)
- docker(容器)
- mysql,redis (資料庫)
微服務
微服務是什麼概念,一般傳統開發中,整個應用都是構建在一個程式碼程式庫裡的,具體可能會根據特徵MVC分成model, controller和view層進行開發;或者根據功能,比如登入校正和其他商務邏輯分開,但實際上還是在一個程式碼程式庫內。這樣隨著開發時間的增長,會因為耦合度高而面臨以下幾個問題:
- 編寫和維護工作會變得複雜,特別是隨著項目邏輯越來越多的時候,各個邏輯可能會有較大耦合,提高開發難度。
- 擴充難,如果需要擴充某個模組時可能會面臨整個程式碼程式庫與這個模組耦合過深,不得不整個程式碼程式庫進行擴充。
微服務實際上就是把整個應用根據各個功能進行拆分成各個程式碼程式庫,把個個功能看做是一個服務,獨立部署運行,職責明確。實際上就是解決上述提到的問題,將服務劃分能更好地維護和擴充。
Golang
Golang的優點
- 可以直接編譯成機器碼,不依賴其他庫,部署就是編譯成執行檔案直接上傳到伺服器就搞定。。。
- 靜態類型語言,但同時擁有動態語言特性
- 對並發和並行的極佳支援。設計者通過 goroutine 這種輕量級線程的概念來實現這個目標,然後通過 channel 來實現各個 goroutine 之間的通訊。他們實現了分段棧增長和 goroutine 線上程基礎上多工技術的自動化。這個的確是非常迷人的地方,建立一個協程非常簡單,開銷只需要4kb的棧記憶體就能建立。這裡要注意的是,具體跑的是並發,跑並行要使用
GOMAXPROCS
變數
- 支援交叉編譯,你可以在windows下編譯Linux的應用
- 內建強大工具,調試還有代碼規範等工具
- 豐富的標準庫,特別是網路程式庫,標準庫很豐富,基本上自己封裝一下路由就可以直接使用了。
- 支援GC。但GC有些要注意的地方,所以開發的時候最後要注意下這方面,否則量級達到一定程度時,可能會因為GC導致效能問題。
因為個人是從PHP剛轉Golang開發,在學習過程中。個人感想是:
- 在快速小應用開發上還是PHP比較快。但靜態語言優點可以減少不少隱藏的問題,但同時擁有動態語言特效,這個對於轉語言來說很方便。
- 沒有物件導向,通過介面(interface)的概念來實現,一開始理解有點困難。
- 語言層面支援並發,對於後台編程來說很方便
- 易於部署,不像PHP那樣各種搭建Nginx伺服器還有PHP擴充。
- 效能不用說,接近C++和Java。
- 根據同事的說法,其設計思想什麼的不一定厲害,但它是為工程而設計的。
其他的還在體會過程中....
RPC
遠端程序呼叫(Remote Procedure Call,縮寫為 RPC)是一個電腦通訊協定。 該協議允許運行於一台電腦的程式調用另一台電腦的子程式,而程式員無需額外地為這個互動作用編程。 如果涉及的軟體採用物件導向編程,那麼遠端程序呼叫亦可稱作遠程調用或遠程方法調用.
通俗點理解,類似A伺服器的應用調用B伺服器應用提供的函數/方法。其中有幾個問題,通訊建立TCP串連。定址則通過服務發現來解決,方法的參數通過底層的網路通訊協定如TCP傳遞到B伺服器,基於二進位,需要序列化和還原序列化。
Protocol Buffers
按照Google的說法,這是Google旗下的一款平台無關,語言無關,可擴充的序列化資料格式,參考xml,但更小,更快,更簡單。只要定義好資料結構,就可以用各個語言生產對應的語言版本。內部資料是純二進位格式。
ETCD
Etcd的目標是構建一個高可用的分布式索引值(key-value資料庫)。etcd內部使用了raft這個一致性演算法,感興趣的可以去瞭解下。應用情境主要就是服務發現,必要的支援是以下幾點:
- 一個強一致性、高可用的服務儲存目錄。(基於raft)
- 一種註冊服務和健康服務健康情況的機制。(定時心跳判斷服務是否可用)
- 一種尋找和串連服務的機制。
2.架構
整體應用
實際上整個後台應用是由接入層,和各個服務模組以及服務發現模組構成。
以上,有遺漏再後續補充,下一篇應該是搭建整體環境和protobuf的寫法與產生,如果只是本地測試,etcd只建單例非常簡單,安裝完直接啟動,預設監聽本地2379連接埠。如果是叢集可能需要配置些東西。另外protobuf產生go語言版本的時候不知道為什麼會比定義的資料結構多了三個參數,查資料貌似是protoc-gen-micro更新內容(不大確定),不過如果注釋掉的話也不影響使用...
參考文章
- 什麼是微服務
- Microservices in Golang
- the way to go
- Go RPC 開發指南
- Etcd 使用入門