go-zero 微服務(wù)實(shí)戰(zhàn)系列(一、開(kāi)篇)
前言
在社區(qū)中經(jīng)常看到有人問(wèn)有沒(méi)有基于 go-zero 的比較完整的項(xiàng)目參考,該類(lèi)問(wèn)題本質(zhì)上是想知道基于 go-zero 的項(xiàng)目的最佳實(shí)踐。完整的項(xiàng)目應(yīng)該是一個(gè)完整的產(chǎn)品功能,包含產(chǎn)品需求、架構(gòu)設(shè)計(jì)、關(guān)鍵流程的編碼、表設(shè)計(jì)以及各種性能優(yōu)化和數(shù)據(jù)一致性等,是一個(gè)真正貼近生產(chǎn)級(jí)的項(xiàng)目,是可以直接拿來(lái)在自己的生產(chǎn)項(xiàng)目中進(jìn)行參考的,而目前社區(qū)并沒(méi)有類(lèi)似的比較完整的開(kāi)源項(xiàng)目參考,因此決定和大家一起從零開(kāi)始基于 go-zero 構(gòu)建一個(gè)完整的貼近生產(chǎn)的項(xiàng)目。
該系列的主題是基于 go-zero 構(gòu)建一個(gè)高并發(fā)的系統(tǒng),為神馬要選擇這個(gè)主題呢?我猜大家一定感受到了 CRUD 的枯燥,而是希望項(xiàng)目是高并發(fā)的是帶有一定挑戰(zhàn)的,可能我們工作中的項(xiàng)目請(qǐng)求量比較低,主要以實(shí)現(xiàn)功能為主。但是,現(xiàn)代的互聯(lián)網(wǎng)產(chǎn)品隨時(shí)都有面對(duì)突發(fā)大流量的可能,比如我們的商城平時(shí)可能業(yè)務(wù)流量比較平穩(wěn),但某一天運(yùn)營(yíng)突然說(shuō)要做一次秒殺活動(dòng)來(lái)推廣,如果沒(méi)有提前做好應(yīng)對(duì)高并發(fā)的準(zhǔn)備,我們的服務(wù)很可能是扛不住的,結(jié)果也就可想而知。所以我們平時(shí)就需要提前儲(chǔ)備足夠多的高并發(fā)的知識(shí),當(dāng)遇到高并發(fā)需求的場(chǎng)景的時(shí)候就能夠從容應(yīng)對(duì)。
該系列為實(shí)戰(zhàn)系列,過(guò)于基礎(chǔ)的知識(shí)可能會(huì)比較少涉及,所以需要大家具備以下基礎(chǔ)能力:
了解go語(yǔ)言語(yǔ)法和基本使用姿勢(shì),請(qǐng)參考文檔 本系列項(xiàng)目數(shù)據(jù)庫(kù)使用Mysql,請(qǐng)參考文檔 本系列項(xiàng)目緩存使用Redis,請(qǐng)參考文檔 本系列項(xiàng)目消息隊(duì)列使用Kafka,請(qǐng)參考文檔 了解go-zero基本使用,請(qǐng)參考文檔
為什么選擇go-zero?
go-zero 為我們提供了許多高并發(fā)場(chǎng)景下的實(shí)用工具,比如為了降低接口耗時(shí)我們往往需要并發(fā)的請(qǐng)求依賴(lài)的服務(wù),這個(gè)時(shí)候我們可以使用 mapreduce 并行的處理請(qǐng)求;面對(duì)海量請(qǐng)求為了降低Redis壓力和提高響應(yīng)時(shí)間,我們可以使用 collection 構(gòu)建本地緩存;避免用戶(hù)連續(xù)請(qǐng)求造成服務(wù)壓力可以使用 limit 做用戶(hù)級(jí)別的限流等等。好的框架能夠給我的項(xiàng)目開(kāi)發(fā)帶來(lái)事半功倍的效果,Go-zero的簡(jiǎn)潔易用性與內(nèi)置的開(kāi)箱即用的工具和服務(wù)治理能力助力我們構(gòu)建一個(gè)高并發(fā)高可靠的系統(tǒng)。
產(chǎn)品需求
為了更加貼近我們真實(shí)的項(xiàng)目開(kāi)發(fā),項(xiàng)目會(huì)基于真實(shí)的產(chǎn)品需求進(jìn)行構(gòu)建。商城是我們平時(shí)接觸比較多而又比較復(fù)雜的系統(tǒng),所以我們決定通過(guò)構(gòu)建商城系統(tǒng)來(lái)和大家一起學(xué)習(xí)如何基于 go-zero 構(gòu)建高并發(fā)系統(tǒng)。商城的功能點(diǎn)非常多,我們沒(méi)有辦法把所有的功能點(diǎn)都一一演示,但會(huì)實(shí)現(xiàn)一個(gè) mvp版本,我們會(huì)在mvp版本中把 go-zero 的核心功能和構(gòu)建高并發(fā)商城系統(tǒng)的核心點(diǎn)都演示出來(lái)。
如下思維導(dǎo)圖列出了該電商系統(tǒng)主要實(shí)現(xiàn)的功能:

產(chǎn)品原型圖
原型圖是我們實(shí)現(xiàn)功能的主要參考,下面列出了商城系統(tǒng)主要的頁(yè)面UI,通過(guò)這些UI在心中可以大致構(gòu)建出系統(tǒng)的架構(gòu),構(gòu)建不出來(lái)也木有問(wèn)題,跟隨文章一點(diǎn)點(diǎn)前進(jìn)即可,奧利給!!!
首頁(yè)和分類(lèi)原型圖
可以看到首頁(yè)功能比較復(fù)雜,包含了搜索功能、Banner輪播圖、搶購(gòu)入口、排行榜、推薦等,分類(lèi)中包含了不同分類(lèi)的推薦商品


購(gòu)物車(chē)和我的訂單原型圖
購(gòu)物車(chē)展示了當(dāng)前登錄用戶(hù)的購(gòu)物車(chē)商品列表,除了商品基本信息還包括了商品數(shù)量。我的訂單列表中展示了處于不同狀態(tài)的商品列表


商品詳情和商品評(píng)價(jià)原型
商品詳情展示了商品的詳情信息,同時(shí)在該頁(yè)面可以添加購(gòu)物車(chē)以及立即購(gòu)買(mǎi)等,用戶(hù)還可以點(diǎn)擊收藏對(duì)該商品進(jìn)行收藏,商品的評(píng)價(jià)功能是必不可少的,你是不是在購(gòu)買(mǎi)某件商品的時(shí)候也會(huì)先看看該商品的用戶(hù)評(píng)價(jià)呢?


以上貼出了商城項(xiàng)目主要實(shí)現(xiàn)的功能點(diǎn)和主要頁(yè)面的原型圖,我們的項(xiàng)目也會(huì)圍繞這些主要的功能點(diǎn)展開(kāi)。比較核心的功能點(diǎn),比如請(qǐng)求量非常高的首頁(yè)Banner我們?nèi)绾蝺?yōu)化,搶購(gòu)商品如何保證不超賣(mài),交易過(guò)程中分布式事務(wù)的實(shí)現(xiàn)等我們都會(huì)重點(diǎn)介紹。
系列文章目錄
第一篇即為本篇文章,主要對(duì)項(xiàng)目做一個(gè)概覽。
第二篇文章會(huì)介紹我們的微服務(wù)的劃分以及工程目錄結(jié)構(gòu)的定義和使用 goctl 做一些項(xiàng)目代碼的初始化工作。
第三篇文章會(huì)先定義項(xiàng)目的 API,只有定義好 API 協(xié)議之后才能真正的開(kāi)始寫(xiě)代碼,如何協(xié)議定義的不清楚會(huì)大大增加項(xiàng)目返工的幾率,定義好API后緊接著我們需要進(jìn)行表結(jié)構(gòu)設(shè)計(jì),數(shù)據(jù)庫(kù)我們使用 MySQL。
第四篇文章主要是和大家一起熟悉下 go-zero 的基本使用,主要包括數(shù)據(jù)庫(kù)的增刪改查,緩存的操作,自定義中間件,常用工具包比如 mapreduce 的使用等等。
第五六七篇我們著重介紹緩存的使用姿勢(shì),在高并發(fā)系統(tǒng)中緩存的地位不言而喻,不夸張的說(shuō)如何緩存設(shè)計(jì)的不好,那高并發(fā)系統(tǒng)也就不復(fù)存在。我們會(huì)介紹如何利用緩存優(yōu)化請(qǐng)求量巨大的首頁(yè)Banner,商品列表緩存實(shí)現(xiàn),以及常見(jiàn)的Cache Aside模式代碼該怎么寫(xiě),還有緩存的一致性、擊穿、穿透、雪崩等優(yōu)化等等。
第八篇和第九篇會(huì)介紹如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的秒殺功能,秒殺功能可謂是高并發(fā)讀和高并發(fā)寫(xiě)的典型代表,通過(guò)這兩篇可以了解到秒殺功能的優(yōu)化技巧和基本姿勢(shì)。
第十篇介紹在微服務(wù)架構(gòu)下經(jīng)常遇到的分布式事務(wù)的問(wèn)題,經(jīng)過(guò)微服務(wù)拆分后,微服務(wù)間獨(dú)占數(shù)據(jù)庫(kù),沒(méi)法利用本地事務(wù),通過(guò)該篇文章可以了解到在 go-zero 中的分布式事務(wù)的實(shí)現(xiàn)方式。
第十一篇介紹我們的業(yè)務(wù)代碼如何寫(xiě)單元測(cè)試。
第十二篇服務(wù)的可觀測(cè)性,上線后的服務(wù)需要具有可觀測(cè)性,包括日志、指標(biāo)監(jiān)控、鏈路追蹤等。
第十三篇我們會(huì)把服務(wù)部署上線并進(jìn)行功能測(cè)試。

結(jié)束語(yǔ)
本篇文章首先介紹了該系列由來(lái)的背景以及我們?yōu)槭裁磿?huì)選擇構(gòu)建高并發(fā)系統(tǒng)這個(gè)主題,接著介紹了我們需要構(gòu)建的高并發(fā)的商城系統(tǒng)的主要功能點(diǎn)以及主要的頁(yè)面原型圖,最后列出了本系列的文章標(biāo)題列表,通過(guò)標(biāo)題列表可以快速了解整個(gè)系列的知識(shí)體系。
構(gòu)建一個(gè)高并發(fā)的系統(tǒng)并不是一件容易的事情,涉及的知識(shí)點(diǎn)非常多,但我相信只要我們一起努力就一定能克服這些困難,讓自己的技術(shù)能力更上一層樓。好在我們可以站在巨人的肩膀上,go-zero 為我們提供了非常強(qiáng)大的構(gòu)建高并發(fā)服務(wù)的能力,為我們的系統(tǒng)保駕護(hù)航。
希望本篇文章對(duì)你有所幫助,謝謝。
每周一、周四更新
參考
https://github.com/zhoushuguang/lebron
推薦閱讀
