基於 Hertz 和 Kitex 的 Go 微服務專案 | 開源專案推薦

語言: CN / TW / HK

theme: cyanosis highlight: srcery


FreeCar

FreeCar 是一個基於 Hertz 與 Kitex 的全棧微服務專案,歡迎 Star。

業務背景

FreeCar 的開發初衷是通過共享出行,解決新能源汽車充電時間長的問題,當汽車快要沒電時可以進行汽車的更換以免因為沒電導致行程延誤。

關於 FreeCar 更多的資訊可移步至 CyanAsterisk/FreeCar

Hertz

Hertz 是一個超大規模的企業級微服務 HTTP 框架,具有高易用性、易擴充套件、低時延等特點。

Hertz 預設使用自研的高效能網路庫 Netpoll,在一些特殊場景中,相較於 go net,Hertz 在 QPS、時延上均具有一定優勢。

在內部實踐中,某些典型服務,如框架佔比較高的服務、閘道器等服務,遷移 Hertz 後相比 Gin 框架,資源使用顯著減少,CPU 使用率隨流量大小降低 30%—60%

關於 Hertz 更多的資訊可移步至 cloudwego/hertz

技術棧

| 功能 | 實現 | | ------------ | --------------------- | | HTTP 框架 | Hertz | | RPC 框架 | Kitex | | 資料庫 | MongoDB、MySQL | | 配置中心 | Nacos | | 服務發現中心 | Nacos | | 訊息佇列 | RabbitMQ | | 鏈路追蹤 | Jaeger | | 叢集監控 | Prometheus | | 限流中介軟體 | hertz-contrib/limiter | | 部署 | docker-compose | | 物件儲存 | 騰訊雲 COS | | CI | GitHub Actions |

專案架構

呼叫關係

image.png

技術架構

image.png

服務關係

image.png

頁面展示

image.png

目錄介紹

| 目錄 | 介紹 | | ------ | ------------ | | Server | 專案核心部分 | | Shared | 可複用程式碼 | | Static | 微信小程式程式碼 |

服務介紹

| 目錄 | 介紹 | |---------|-------------------| | API | 基於 Hertz 的 API 服務 | Auth | 使用者認證服務 | | Blob | 與圖片和騰訊雲 COS 相關的服務 | | Car | 汽車服務 | | Profile | 主頁與圖片識別服務 | | Trip | 行程服務 |

快速開始

啟動基礎環境

shell make start

配置 Nacos

在瀏覽器上訪問 http://127.0.0.1:8848/nacos/index.html#/login 進行登入。

預設名稱空間以及配置組等請參考各個 config.yaml 配置檔案。

image.png image.png

關於配置中心的詳細配置,詳見

生成資料表

shell make migrate

啟動 HTTP 服務

shell make api

啟動微服務

shell make auth make blob make car make profile make trip

Jaeger

在瀏覽器上訪問 http://127.0.0.1:16686/

image.png

Prometheus

在瀏覽器上訪問 http://127.0.0.1:3000/

image.png

API 請求

專案的 API 請求示例詳見

開發指南

通過直接閱讀原始碼來了解此專案是非常困難的,在此提供開發指南方便開發者快速瞭解並上手此專案包括 Kitex、Hertz 等框架。

前置準備

通過快速開始中的命令快速啟動所需的工具與環境,若需要特殊定製請修改 docker-compose.yaml 與 Nacos 配置中的內容。

IDL

在開發之前我們需要定義好 IDL 檔案,其中 hz 為開發者提供了許多定製化的 api 註解

示例程式碼:

```thrift namespace go auth

struct LoginRequest { 1: string code }

struct LoginResponse { 1: i64 accountID }

service AuthService { LoginResponse Login(1: LoginRequest req) } ```

程式碼生成

Kitex

在新增服務目錄下執行,每次僅需更改服務名與 IDL 路徑。

服務端

shell kitex -service auth -module github.com/CyanAsterisk/FreeCar ./../../idl/auth.thrift

客戶端

shell kitex -module github.com/CyanAsterisk/FreeCar ./../../idl/auth.thrift

注意項:

  • -module github.com/CyanAsterisk/FreeCar 該引數用於指定生成程式碼所屬的 Go 模組,避免路徑問題。
  • 當前服務需要呼叫其他服務時需生成客戶端檔案。

Hertz

初始化

shell hz new -idl ./../../idl/api.proto -mod github.com/CyanAsterisk/FreeCar/server/cmd/api

更新

shell hz update -I -idl ./../../idl/api.proto

注意項:

  • -module github.com/CyanAsterisk/FreeCar/server/cmd/api 該引數用於指定生成程式碼所屬的 Go 模組,避免路徑問題。

業務開發

在程式碼生成完畢後需要先將一些必須元件新增到專案中。由於 api 層不必再次新增,因此以下主要講解關於 Kitex-Server 部分,程式碼位於 server/cmd 下。

Config

參考 server/cmd/auth/config,為微服務的配置結構體。

Global

參考 server/cmd/auth/global,為微服務提供可全域性呼叫的方法。

Initialize

參考 server/cmd/auth/initialize,提供必要元件的初始化功能,其中 nacos.go flag.go logger.go 為必須項。

Tool

參考 server/cmd/auth/tool,提供微服務的工具函式,其中 port.go 為必須項。

API

在寫閘道器層的業務邏輯時,僅需要每次更新 IDL 與新的微服務客戶端程式碼,若需要新增新的元件直接新增即可,專案高度可拔插,架構與微服務層相似。

閘道器層的業務邏輯在 server/cmd/api/biz 下,大部分程式碼會自動生成。若需要單獨新增路由需要到 server/cmd/api/router.go 中。

關於中介軟體的使用,只需要在 server/cmd/api/biz/router/api/middleware.go 中新增中介軟體邏輯即可。

許可證

FreeCar 在 GNU General Public 許可證 3.0 版下開源。

總結

這個專案還是花費的不少時間,歡迎大家學習,如果 Star 是對我們最大的鼓勵!

參考