企業專案遷移go-zero全攻略(一)

Kevin Wan發表於2021-01-21

作者: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實際使用前,先說一下整體架構,更方便理解

go-zero-k8s架構

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已經形成統一標準化了,所以對於不同專案的結構都不一樣,我的做法是如下:

1610618953808

整個專案使用的一個大倉,專案fishtwo根目錄下:

  • app : 應用內部程式

  • build:構建、以及指令碼等

  • lib:應用程式用到的內部庫

  • app下分為3個模組:

    • gateway:api服務
    • services: rpc服務
    • jobs:日常要處理的任務(這個可以使用 go-zero 作者的 go-queue ,測試了下很好用,哈哈,後面搞好也會寫進來)

下一篇我們來看看:

  1. 怎麼改造 gateway 服務
  2. 怎麼改造 rpc 服務
  3. jobs 怎麼定義?怎麼和專案結合?

未完待續~~~


框架地址

https://github.com/tal-tech/go-zero

歡迎使用 go-zero 並 star 支援我們 ?

go-zero 系列文章見『微服務實踐』公眾號

相關文章