作者: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 系列文章見『微服務實踐』公眾號
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/251362.html
標籤:Go
上一篇:Go基礎及語法(四)
下一篇:創建并使用https證書
