作者:Mikael
最近發現 golang
社群裡出了一個新興的微服務框架。看了一下官方提供的工具真的很好用,只需要定義好 .api
檔案模版程式碼都可以一鍵生成,只需要關心業務;同時 core
中的工具極大減少了開發成本。
廢話不多說,來看看這個微服務框架:go-zero
起源
聊聊與go-zero結緣
最先接觸go-zero是2020年10月國慶假期,說來也巧,看到有人在go-micro群中問go-zero情況,當時go-zero作者在群中就大概回答了一下,引起了我的好奇,當時公司用的go-micro1.x,因為go-micro版本真的太混亂了,2還沒多少人用明白,現在又搞了個3,而且這幾個大版本之間高度不相容,簡直一團糟。我抱著好奇心去github.com檢視了go-zero,當時並沒有因為它的star數、文件少而放棄,哈哈,抱著試玩的心態去go get它,從此發現了新大陸,並加入了go-zero群,開始了go-zero之旅。
選擇它的幾點原因
- 微服務:在現在這個大環境下,單體服務詬病已經越來越多了,專案大起來之後 “牽一髮而動全身” 的教訓比比皆是,維護越來越困難,測試測起來也是很頭疼,構建速度慢等等,在這樣趨勢下擁抱微服務成為了大趨勢,go-zero就是一個微服務框架並且能為我解決很多實際專案中遇到的痛點、難點
- 穩定性:內外同源。穩定性是我很看重的,他們公司內外同源勢必保證了此框架的穩定性。
- 高併發:經歷了2020年疫情期間,“曉黑板” 輕鬆獲得支撐千萬日活服務
- 工作效率:說到工作效率,必須要提的就是goctl,goctl配合go-zero所有程式碼基本都是可以通過這個工具生成,只需要關心自己的業務邏輯即可,包括一鍵生成dockerfile,k8s的yaml檔案,簡直不要太爽,大大提高了工作效率
- 程式碼質量:大概看了一些go-zero的原始碼,程式碼質量上感覺還是沒得噴的,至少感覺比我自己寫的好很多,哈哈,這個每個人看法不同,大家可以去親自看一下。
- 團隊:當時加了go-zero作者微信,感覺他為人很謙和,無論問一些比較基礎的東西還是一些線上實戰經驗,也總是會耐心給我解答、意見,在使用期間我也提了一些bug,go-zero團隊都能及時的解決,迭代速度真的讓我驚豔。大家應該都知道,在國內做開源有多麼不容易。
- 對比go其他微服務框架:go的微服務框架大概我玩過go-micro、go-kit、kratos、rpcx、go-zero。
- go-micro我開始就說了是版本真心有點混亂
- go-kit也不錯但是資料相對來說較少
- kratos經過b站原始碼洩漏大家應該都知道它了,前一段時間都斷更了,差點安樂死,毛神在issue中說太忙了,不過他們在出2.0版本了,還是很期待
- rpcx 玩了一下玩的不多,但是他們宣傳是“好未來”也在用,go-zero就是“好未來”的呀,哈哈
- go-zero 上面我都說過了,就不再提了。
設計架構
在介紹go-zero實際使用前,先說一下整體架構,更方便理解
CI/CD
Step1:本地deveploer開發好程式碼之後提交到gitlab(這裡分支就不詳細說明了)
Step2:jenkins,使用pipline方式部署
- 從gitlab拉取程式碼
- docker build ,基於最新gitlab上的code構建映象
- docker push,將構建好的映象推送到映象倉庫(當然一般都是有自己私有映象倉庫比如harbor,用阿里雲的也可以)
- kubectl apply -f xxx.yaml :使用kubectl 部署到k8s中 (阿里雲k8s容器服務那麼好用,不用豈不可惜?)
kubectl部署之後,k8s就會根據你的service中的yaml定義的映象來你的映象倉庫拉取剛才你打包的最新映象,so~~上線成功啦!
嗯,有的同學說,阿里雲k8s好用是好用,可是我不會寫or不想寫Dockerfile,不會寫k8s的yaml or 不想寫,沒關係,goctl說放開它,讓我來
生成 Dockerfile
$ goctl docker -go user.go
生成k8s yaml
$ goctl kube deploy -name user-api -namespace blog -image user:v1 -o user.yaml -port 2233
所以,就是這麼簡單
訪問流程
app/web/pc 透過防火牆,首先訪問到阿里雲的負載均衡SLB,同時SLB可以將你的後端伺服器ip隱藏起來,同時可以預防DDOS攻擊,雖然有額度的,但是好過沒有~~,然後SLB訪問到前面的nginx,nginx作為代理使用,k8s中的service通過 nodeport方式暴露出來在nignx中代理到該service,同時在nginx中上報日誌到kafka,然後api可以在etcd中拿到多個rpc節點,呼叫多個後端rpc服務,rpc負責跟db互動、或者呼叫其他rpc獲取資料(當然api、rpc之間是通過etcd動態發現的)返回給api,api就是聚合資料,然後層層返回到客戶端。
整體架構都是高可用高可用
專案設計
專案地址:https://github.com/Mikaelemmmm/gozerobasic
go的專案比較靈活不像java已經形成統一標準化了,所以對於不同專案的結構都不一樣,我的做法是如下:
整個專案使用的一個大倉,專案fishtwo根目錄下:
-
app : 應用內部程式
-
build:構建、以及指令碼等
-
lib:應用程式用到的內部庫
-
app下分為3個模組:
- gateway:api服務
- services: rpc服務
- jobs:日常要處理的任務(這個可以使用
go-zero
作者的go-queue
,測試了下很好用,哈哈,後面搞好也會寫進來)
下一篇我們來看看:
- 怎麼改造
gateway 服務
? - 怎麼改造
rpc 服務
? jobs
怎麼定義?怎麼和專案結合?
未完待續~~~
框架地址
https://github.com/tal-tech/go-zero
歡迎使用 go-zero 並 star 支援我們 ?
go-zero 系列文章見『微服務實踐』公眾號