go-zero:微服务框架
go-zero 是一個集成了各種工程實踐的 Web 和 rpc 框架,它的彈性設(shè)計保障了大并發(fā)服務(wù)端的穩(wěn)定性,并且已經(jīng)經(jīng)過了充分的實戰(zhàn)檢驗。
go-zero 在設(shè)計時遵循了 “工具大于約定和文檔” 的理念,所以 go-zero 包含極簡的 API 定義和生成工具 goctl,可以根據(jù)定義的 API 文件一鍵生成 Go、iOS、Android、Kotlin、Dart、TypeScript、JavaScript 代碼,并可直接運行。
如上圖所示,不同客戶端的請求都會先進入 go-zero 的 API 端。API 端最主要的作用是通過 ETCD 將對應(yīng)的請求通過 gRPC 協(xié)議轉(zhuǎn)發(fā)到 Service 端。根據(jù)請求的具體內(nèi)容,Service 端負責(zé)對數(shù)據(jù)進行查詢或存儲。如果是查詢請求,go-zero 有內(nèi)置的 API 會先查詢緩存層,減少數(shù)據(jù)庫的查詢壓力。
由圖可見,API 端和 Service 端中框架已經(jīng)內(nèi)置了非常豐富的功能,在開發(fā)過程中只需要我們填充對應(yīng)的業(yè)務(wù)邏輯,即可輕松實現(xiàn) CRDU 級的需求。
我們?yōu)槭裁凑f go-zero 是開箱即用的微服務(wù)架構(gòu)呢?不急,我們來盤點下 go-zero 中有哪些強大的特性。
go-zero 適合做微服務(wù)快速開發(fā)的特性
Go-zero 擁有強大的項目腳手架工具 goctl。 goctl 和前端中的 Vue-cli、React-cli 一樣方便。goctl 通過配置文件可以生成 API、rpc 和 model 等相關(guān)代碼。 同時,go-zero 擁有較完備的項目框架。腳手架生成的項目框架足以應(yīng)對常見的需求。CRDU 等需求只需要做 “填空題”,在已生成的代碼上填充必要的業(yè)務(wù)邏輯。 其他緩存鑒權(quán)等需求,框架中也早已內(nèi)置。
另外,go-zero 擁有獨特的“漸進式”框架。“漸進式”是前端 Vue 框架的一大特性,大意是“易于上手,還便于與第三方庫或既有項目整合”。本文借用這個概念是想表明 go-zero 對項目的入侵性較少,go-zero 生成的代碼可以拆開使用,逐步對老項目進行改造。
低耦合的模塊設(shè)計,豐富的中間件,插件和工具:
-
go-zero 中各模塊耦合程度低,我們可以通過文檔中的組件中心尋找合適的中間件或自研中間件。
-
如果覺得 goctl 不能滿足需求,goctl 還支持 plugin 命令對 goctl 進行擴展。
-
go-zero 的很多配置文件是自定義語法。 go-zero 還提供了 intellij 和 vscode 插件,提供了語法高亮錯誤檢查等編輯增強功能。
goctl 介紹
goctl 是 go-zero 微服務(wù)框架下的代碼生成工具。使用 goctl 可顯著提升開發(fā)效率,讓開發(fā)人員將時間重點放在業(yè)務(wù)開發(fā)上。
goctl 的命令可歸納為如下幾類:
-
API 命令,快速生成一個 API 服務(wù)
-
rpc 命令,支持 proto 模板生成和 rpc 服務(wù)代碼生成
-
model 命令,目前支持識別 mysql ddl 進行 model 層代碼生成
-
plugin 命令,支持針對 API 自定義插件
-
其他命令,目前是發(fā)布相關(guān)
goctl 的命令眾多,本次涉及到的只是其中 API、rpc 和 model 相關(guān)的基礎(chǔ)命令。
使用 goctl 的基本流程
使用 goctl 生成代碼的流程大致可以分為 4 步:
-
使用命令 a 生成默認的配置文件;
-
按照業(yè)務(wù)需求編輯該配置文件;
-
使用命令 b 按照配置文件生成默認的代碼文件;
-
按照業(yè)務(wù)邏輯填充對應(yīng)的代碼文件。
什么情況不適宜使用 go-zero 做微服務(wù)快速開發(fā)?
看完上面的介紹,想必大家對于 go-zero 開發(fā)微服務(wù)已經(jīng)有點躍躍欲試了吧。不過經(jīng)過一番實踐,我認為當(dāng)出現(xiàn)以下情況時,不適宜采用 go-zero 作為開發(fā)微服務(wù)的框架。
當(dāng)前需求與 goctl 的理念相沖突
go-zero 的一大賣點是腳手架工具 goctl,如果定制需求過多可能與 goctl 生成的代碼相沖突。但是如果放棄 goctl 手動編寫代碼的話,開發(fā)效率會大大降低。
舉個例子,如上圖所示,go-zero 在 Service 端目前只支持 gRPC,在數(shù)據(jù)庫層只支持 Mysql、MongoDB 和 ClickHouse,服務(wù)發(fā)現(xiàn)只支持 ETCD。在這種情況下如果想實現(xiàn) PostgreSQL 替換 Mysql、Consul 替換 ETCD 等定制操作,goctl 生成的代碼執(zhí)行時很可能會出現(xiàn)異常。
希望框架提供的功能非常完善
go-zero 大部分組件是自研,比如 sqlx,httpx 等。這些自研組件滿足 CRDU 的操作綽綽有余,但是與 gorm、gin 等專攻某一方向的開源項目相比還是有非常大的差距的。
所以隨著公司業(yè)務(wù)發(fā)展需求越來越五花八門,當(dāng)前的主要矛盾從“快速開發(fā)”變成“精細化開發(fā)”時,會發(fā)現(xiàn)該框架有這樣或那樣的不足。這種情況下就需要提 RP 或自己 fork 一份魔改了。個人覺得這種情況比 Spring 或 Django 那樣一個“全家桶” 改動起來要省力省心。
總結(jié)
以上是生活随笔為你收集整理的go-zero:微服务框架的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 这两种完全不同的JPEG加载方式,你肯定
- 下一篇: 简略图解:输入 url 到出现页面,浏览