go-zero 微服務實戰系列(一、開篇)

kevwan 發表於 2022-06-05
微服務 Go

前言

在社群中經常看到有人問有沒有基於 go-zero 的比較完整的專案參考,該類問題本質上是想知道基於 go-zero 的專案的最佳實踐。完整的專案應該是一個完整的產品功能,包含產品需求、架構設計、關鍵流程的編碼、表設計以及各種效能優化和資料一致性等,是一個真正貼近生產級的專案,是可以直接拿來在自己的生產專案中進行參考的,而目前社群並沒有類似的比較完整的開源專案參考,因此決定和大家一起從零開始基於 go-zero 構建一個完整的貼近生產的專案。

該系列的主題是基於 go-zero 構建一個高併發的系統,為神馬要選擇這個主題呢?我猜大家一定感受到了 CRUD 的枯燥,而是希望專案是高併發的是帶有一定挑戰的,可能我們工作中的專案請求量比較低,主要以實現功能為主。但是,現代的網際網路產品隨時都有面對突發大流量的可能,比如我們的商城平時可能業務流量比較平穩,但某一天運營突然說要做一次秒殺活動來推廣,如果沒有提前做好應對高併發的準備,我們的服務很可能是扛不住的,結果也就可想而知。所以我們平時就需要提前儲備足夠多的高併發的知識,當遇到高併發需求的場景的時候就能夠從容應對。

該系列為實戰系列,過於基礎的知識可能會比較少涉及,所以需要大傢俱備以下基礎能力:

為什麼選擇go-zero?

go-zero 為我們提供了許多高併發場景下的實用工具,比如為了降低介面耗時我們往往需要併發的請求依賴的服務,這個時候我們可以使用 mapreduce 並行的處理請求;面對海量請求為了降低Redis壓力和提高響應時間,我們可以使用 collection 構建本地快取;避免使用者連續請求造成服務壓力可以使用 limit 做使用者級別的限流等等。好的框架能夠給我的專案開發帶來事半功倍的效果,Go-zero的簡潔易用性與內建的開箱即用的工具和服務治理能力助力我們構建一個高併發高可靠的系統。

產品需求

為了更加貼近我們真實的專案開發,專案會基於真實的產品需求進行構建。商城是我們平時接觸比較多而又比較複雜的系統,所以我們決定通過構建商城系統來和大家一起學習如何基於 go-zero 構建高併發系統。商城的功能點非常多,我們沒有辦法把所有的功能點都一一演示,但會實現一個 mvp版本,我們會在mvp版本中把 go-zero 的核心功能和構建高併發商城系統的核心點都演示出來。

如下思維導圖列出了該電商系統主要實現的功能:

go-zero 微服務實戰系列(一、開篇)

產品原型圖

原型圖是我們實現功能的主要參考,下面列出了商城系統主要的頁面UI,通過這些UI在心中可以大致構建出系統的架構,構建不出來也木有問題,跟隨文章一點點前進即可,奧利給!!!

首頁和分類原型圖

可以看到首頁功能比較複雜,包含了搜尋功能、Banner輪播圖、搶購入口、排行榜、推薦等,分類中包含了不同分類的推薦商品

go-zero 微服務實戰系列(一、開篇)

go-zero 微服務實戰系列(一、開篇)

購物車和我的訂單原型圖

購物車展示了當前登入使用者的購物車商品列表,除了商品基本資訊還包括了商品數量。我的訂單列表中展示了處於不同狀態的商品列表

go-zero 微服務實戰系列(一、開篇)

go-zero 微服務實戰系列(一、開篇)

商品詳情和商品評價原型

商品詳情展示了商品的詳情資訊,同時在該頁面可以新增購物車以及立即購買等,使用者還可以點選收藏對該商品進行收藏,商品的評價功能是必不可少的,你是不是在購買某件商品的時候也會先看看該商品的使用者評價呢?

go-zero 微服務實戰系列(一、開篇)

go-zero 微服務實戰系列(一、開篇)

以上貼出了商城專案主要實現的功能點和主要頁面的原型圖,我們的專案也會圍繞這些主要的功能點展開。比較核心的功能點,比如請求量非常高的首頁Banner我們如何優化,搶購商品如何保證不超賣,交易過程中分散式事務的實現等我們都會重點介紹。

系列文章目錄

第一篇即為本篇文章,主要對專案做一個概覽。

第二篇文章會介紹我們的微服務的劃分以及工程目錄結構的定義和使用 goctl 做一些專案程式碼的初始化工作。

第三篇文章會先定義專案的 API,只有定義好 API 協議之後才能真正的開始寫程式碼,如何協議定義的不清楚會大大增加專案返工的機率,定義好API後緊接著我們需要進行表結構設計,資料庫我們使用 MySQL。

第四篇文章主要是和大家一起熟悉下 go-zero 的基本使用,主要包括資料庫的增刪改查,快取的操作,自定義中介軟體,常用工具包比如 mapreduce 的使用等等。

第五六七篇我們著重介紹快取的使用姿勢,在高併發系統中快取的地位不言而喻,不誇張的說如何快取設計的不好,那高併發系統也就不復存在。我們會介紹如何利用快取優化請求量巨大的首頁Banner,商品列表快取實現,以及常見的Cache Aside模式程式碼該怎麼寫,還有快取的一致性、擊穿、穿透、雪崩等優化等等。

第八篇和第九篇會介紹如何實現一個簡單的秒殺功能,秒殺功能可謂是高併發讀和高併發寫的典型代表,通過這兩篇可以瞭解到秒殺功能的優化技巧和基本姿勢。

第十篇介紹在微服務架構下經常遇到的分散式事務的問題,經過微服務拆分後,微服務間獨佔資料庫,沒法利用本地事務,通過該篇文章可以瞭解到在 go-zero 中的分散式事務的實現方式。

第十一篇介紹我們的業務程式碼如何寫單元測試。

第十二篇服務的可觀測性,上線後的服務需要具有可觀測性,包括日誌、指標監控、鏈路追蹤等。

第十三篇我們會把服務部署上線並進行功能測試。

go-zero 微服務實戰系列(一、開篇)

結束語

本篇文章首先介紹了該系列由來的背景以及我們為什麼會選擇構建高併發系統這個主題,接著介紹了我們需要構建的高併發的商城系統的主要功能點以及主要的頁面原型圖,最後列出了本系列的文章標題列表,通過標題列表可以快速瞭解整個系列的知識體系。

構建一個高併發的系統並不是一件容易的事情,涉及的知識點非常多,但我相信只要我們一起努力就一定能克服這些困難,讓自己的技術能力更上一層樓。好在我們可以站在巨人的肩膀上,go-zero 為我們提供了非常強大的構建高併發服務的能力,為我們的系統保駕護航。

希望本篇文章對你有所幫助,謝謝。

每週一、週四更新

參考

https://github.com/zhoushuguang/lebron

專案地址

https://github.com/zeromicro/go-zero

歡迎使用 go-zerostar 支援我們!

微信交流群

關注『微服務實踐』公眾號並點選 交流群 獲取社群群二維碼。