Golang 微服務(wù)學(xué)習(xí)筆記(一)

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)容(不大確定),不過如果注釋掉的話也不影響使用...


參考文章

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奕筐,一起剝皮案震驚了整個濱河市舱痘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌离赫,老刑警劉巖芭逝,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異渊胸,居然都是意外死亡旬盯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門翎猛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胖翰,“玉大人,你說我怎么就攤上這事切厘∪龋” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵疫稿,是天一觀的道長培他。 經(jīng)常有香客問我鹃两,道長,這世上最難降的妖魔是什么舀凛? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任俊扳,我火速辦了婚禮,結(jié)果婚禮上猛遍,老公的妹妹穿的比我還像新娘馋记。我一直安慰自己,他們只是感情好螃壤,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布抗果。 她就那樣靜靜地躺著筋帖,像睡著了一般奸晴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上日麸,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天寄啼,我揣著相機(jī)與錄音,去河邊找鬼代箭。 笑死墩划,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嗡综。 我是一名探鬼主播乙帮,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼极景!你這毒婦竟也來了察净?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤盼樟,失蹤者是張志新(化名)和其女友劉穎氢卡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晨缴,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡译秦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了击碗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筑悴。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖稍途,靈堂內(nèi)的尸體忽然破棺而出雷猪,到底是詐尸還是另有隱情,我是刑警寧澤晰房,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布求摇,位于F島的核電站射沟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏与境。R本人自食惡果不足惜验夯,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望摔刁。 院中可真熱鬧挥转,春花似錦、人聲如沸共屈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拗引。三九已至借宵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間矾削,已是汗流浹背壤玫。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留哼凯,地道東北人欲间。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像断部,于是被迫代替她去往敵國和親猎贴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容