1.前言
背景
工作由PHP轉(zhuǎn)Golang枪孩,最近在用GO開發(fā)微服務(wù)后臺被碗,在學(xué)習(xí)中,如果理解有誤跨跨,歡迎交流~~目前只是使用Go micro框架來搭建后臺微服務(wù),服務(wù)發(fā)現(xiàn)使用etcd囱皿,協(xié)議使用PB勇婴,數(shù)據(jù)讀取使用redis。
技術(shù)棧
- Golang(開發(fā)語言)
- Go-micro (RPC框架)
- etcd (分布式鍵值數(shù)據(jù)庫)
- docker(容器)
- mysql嘱腥,redis (數(shù)據(jù)庫)
微服務(wù)
微服務(wù)是什么概念耕渴,一般傳統(tǒng)開發(fā)中,整個應(yīng)用都是構(gòu)建在一個代碼庫里的齿兔,具體可能會根據(jù)特征MVC分成model, controller和view層進(jìn)行開發(fā)萨螺;或者根據(jù)功能,比如登錄校驗和其他業(yè)務(wù)邏輯分開愧驱,但實際上還是在一個代碼庫內(nèi)慰技。這樣隨著開發(fā)時間的增長,會因為耦合度高而面臨以下幾個問題:
- 編寫和維護(hù)工作會變得復(fù)雜组砚,特別是隨著項目邏輯越來越多的時候吻商,各個邏輯可能會有較大耦合,提高開發(fā)難度糟红。
- 擴(kuò)展難艾帐,如果需要擴(kuò)展某個模塊時可能會面臨整個代碼庫與這個模塊耦合過深,不得不整個代碼庫進(jìn)行擴(kuò)展盆偿。
微服務(wù)實際上就是把整個應(yīng)用根據(jù)各個功能進(jìn)行拆分成各個代碼庫柒爸,把個個功能看做是一個服務(wù),獨(dú)立部署運(yùn)行事扭,職責(zé)明確捎稚。實際上就是解決上述提到的問題,將服務(wù)劃分能更好地維護(hù)和擴(kuò)展。
Golang
Golang的優(yōu)點
- 可以直接編譯成機(jī)器碼今野,不依賴其他庫葡公,部署就是編譯成執(zhí)行文件直接上傳到服務(wù)器就搞定。条霜。催什。
- 靜態(tài)類型語言,但同時擁有動態(tài)語言特性
- 對并發(fā)和并行的極佳支持宰睡。設(shè)計者通過 goroutine 這種輕量級線程的概念來實現(xiàn)這個目標(biāo)蒲凶,然后通過 channel 來實現(xiàn)各個 goroutine 之間的通信。他們實現(xiàn)了分段棧增長和 goroutine 在線程基礎(chǔ)上多路復(fù)用技術(shù)的自動化拆内。這個的確是非常吸引人的地方豹爹,創(chuàng)建一個協(xié)程非常簡單,開銷只需要4kb的棧內(nèi)存就能創(chuàng)建矛纹。這里要注意的是臂聋,具體跑的是并發(fā),跑并行要使用
GOMAXPROCS
變量 - 支持交叉編譯或南,你可以在windows下編譯Linux的應(yīng)用
- 內(nèi)置強(qiáng)大工具孩等,調(diào)試還有代碼規(guī)范等工具
- 豐富的標(biāo)準(zhǔn)庫,特別是網(wǎng)絡(luò)庫采够,標(biāo)準(zhǔn)庫很豐富肄方,基本上自己封裝一下路由就可以直接使用了。
- 支持GC蹬癌。但GC有些要注意的地方权她,所以開發(fā)的時候最后要注意下這方面,否則量級達(dá)到一定程度時逝薪,可能會因為GC導(dǎo)致性能問題隅要。
因為個人是從PHP剛轉(zhuǎn)Golang開發(fā),在學(xué)習(xí)過程中董济。個人感想是:
- 在快速小應(yīng)用開發(fā)上還是PHP比較快步清。但靜態(tài)語言優(yōu)點可以減少不少隱藏的問題,但同時擁有動態(tài)語言特效虏肾,這個對于轉(zhuǎn)語言來說很方便廓啊。
- 沒有面向?qū)ο螅ㄟ^接口(interface)的概念來實現(xiàn)封豪,一開始理解有點困難侥啤。
- 語言層面支持并發(fā)渤涌,對于后臺編程來說很方便
- 易于部署礼预,不像PHP那樣各種搭建Nginx服務(wù)器還有PHP擴(kuò)展脑融。
- 性能不用說疮装,接近C++和Java。
- 根據(jù)同事的說法雌续,其設(shè)計思想什么的不一定厲害,但它是為工程而設(shè)計的胯杭。
其他的還在體會過程中....
RPC
遠(yuǎn)程過程調(diào)用(Remote Procedure Call驯杜,縮寫為 RPC)是一個計算機(jī)通信協(xié)議。 該協(xié)議允許運(yùn)行于一臺計算機(jī)的程序調(diào)用另一臺計算機(jī)的子程序做个,而程序員無需額外地為這個交互作用編程鸽心。 如果涉及的軟件采用面向?qū)ο缶幊蹋敲催h(yuǎn)程過程調(diào)用亦可稱作遠(yuǎn)程調(diào)用或遠(yuǎn)程方法調(diào)用.
通俗點理解居暖,類似A服務(wù)器的應(yīng)用調(diào)用B服務(wù)器應(yīng)用提供的函數(shù)/方法顽频。其中有幾個問題,通訊建立TCP連接太闺。尋址則通過服務(wù)發(fā)現(xiàn)來解決糯景,方法的參數(shù)通過底層的網(wǎng)絡(luò)協(xié)議如TCP傳遞到B服務(wù)器,基于二進(jìn)制省骂,需要序列化和反序列化蟀淮。
Protocol Buffers
按照谷歌的說法,這是谷歌旗下的一款平臺無關(guān)钞澳,語言無關(guān)怠惶,可擴(kuò)展的序列化數(shù)據(jù)格式,參考xml轧粟,但更小策治,更快,更簡單兰吟。只要定義好數(shù)據(jù)結(jié)構(gòu)通惫,就可以用各個語言生產(chǎn)對應(yīng)的語言版本。內(nèi)部數(shù)據(jù)是純二進(jìn)制格式混蔼。
ETCD
Etcd的目標(biāo)是構(gòu)建一個高可用的分布式鍵值(key-value數(shù)據(jù)庫)讽膏。etcd內(nèi)部使用了raft這個一致性算法,感興趣的可以去了解下拄丰。應(yīng)用場景主要就是服務(wù)發(fā)現(xiàn)府树,必要的支持是以下幾點:
- 一個強(qiáng)一致性、高可用的服務(wù)存儲目錄料按。(基于raft)
- 一種注冊服務(wù)和健康服務(wù)健康狀況的機(jī)制奄侠。(定時心跳判斷服務(wù)是否可用)
- 一種查找和連接服務(wù)的機(jī)制。
2.架構(gòu)
整體應(yīng)用
實際上整個后臺應(yīng)用是由接入層载矿,和各個服務(wù)模塊以及服務(wù)發(fā)現(xiàn)模塊構(gòu)成垄潮。
- 前端http請求請求到接入層
- 接入層(Client):負(fù)責(zé)限流以及具體邏輯業(yè)務(wù)分發(fā)請求服務(wù)模塊烹卒,通過注冊中心獲取各個服務(wù)的可用服務(wù)器列表,調(diào)用各個服務(wù)時便通過Protocbuf協(xié)議與各個模塊進(jìn)行調(diào)用(RPC)
- 注冊中心(Registry):監(jiān)聽服務(wù)目錄(對key注冊Watcher)弯洗,當(dāng)監(jiān)聽到新的服務(wù)時旅急,將服務(wù)器添加到可用服務(wù)器列表中;有的 server 關(guān)閉后牡整,agent 檢測到某個 key 的超時藐吮,可以根據(jù)自己的策略來決定是否刪除掉該server;客戶端連接server前逃贝,由注冊中心根據(jù)策略分配服務(wù)ip地址(這個還不是很清楚谣辞,后續(xù)確定更新)
-
服務(wù)(Server):各個服務(wù)在server上部署時,便會向etcd注冊服務(wù)沐扳,并定時向etcd發(fā)送心跳泥从。
微服務(wù)框架.png
以上,有遺漏再后續(xù)補(bǔ)充沪摄,下一篇應(yīng)該是搭建整體環(huán)境和protobuf的寫法與生成躯嫉,如果只是本地測試,etcd只建單例非常簡單杨拐,安裝完直接啟動和敬,默認(rèn)監(jiān)聽本地2379端口。如果是集群可能需要配置些東西戏阅。另外protobuf生成go語言版本的時候不知道為什么會比定義的數(shù)據(jù)結(jié)構(gòu)多了三個參數(shù)昼弟,查資料貌似是protoc-gen-micro更新內(nèi)容(不大確定),不過如果注釋掉的話也不影響使用...
參考文章