基於GO語言框架Gin開發的MVC輪子框架:GinLaravel

fyonecon發表於2021-04-27

Github:github.com/fyonecon/ginlaravel

Gitee:gitee.com/fyonecon/ginlaravel

GinLaravel、GoLaravel介紹

GinLaravel基於Golang框架Gin(Gin學習文件:《Gin 框架中文文件》 )開發,專案結構和專案理念參考Laravel。學習本專案時建議從閱讀本專案原始碼開始,並具備Golang、Gin、go mod、centos+nginx、redis、mysql、加密解密、http、Swagger等必要知識。GinLaravel的構建和執行週期與Beego、Vue、React、Laravel、ThinkPHP、Django等都會有類似的引導思路、引數設定、外掛擴充套件、服務部署、程式碼統一性、生態護城河等。GinLaravel儘量減少漢字造詞、功能造詞、賢者造詞,不會用描述華麗、中英文混雜的造詞方式去包裝一個功能平常的老東西(比如 http+header、cookie/localstorage/sqlite+token、加密與解密、資料快取+佇列、負載均衡+docker、記憶體常駐與微服務、介面安全與前後端分離等)。

整個開發以人為本,功能模組化擴充套件,系統安全可控,漸進式提升訪問量。

GinLaravel支援MVC開發模式。本專案展示了MVC處理資料,同時展示”Verify—Controller—Kit”模式處理資料。

現已支援

Go-MySQL、GORM(v2)、Go-Redis、熱更(fresh)、Swagger、MVC、模版輸出、Http訪問頻率攔截、HttpCors、對稱加密(可中文)、http攔截器、多層路由、分詞與全文檢索、執行時監控、圖形驗證碼、生成和讀取Excel、全域性定時器等。

測試過的客戶端環境等:Vue3+Axios、Fetch、POST(x-www-form-urlencoded)、GET、Centos7、Mac。

設計理念

寬進嚴出,功能組合式,面向Api,適合複雜專案,任何引數或服務都會有預設值。整個專案執行需go(1.16+<2021~>)+mysql+redis!

路由週期

init()+main ➡️ 請求路由名 ➡️ header過濾 ➡️ 攔截請求頻率 ➡️ 校驗請求方法和Token引數 ➡️ 執行目標函式 ➡️ Controller程式並返回Json ➡️ 治理或執行時監控服務 ➡️ 程式結束️

專案目錄

  • /app/Common/ ※ 對go原生封裝的公共函式、自定義必要資料引數配置。有很多用Go解釋Go的公用函式。

  • /app/Http/ ※ 控制器、模型、攔截器

  • /app/Http/Controller/ ※ 控制器

  • /app/Http/Controller/Example ※ 示例

  • /app/Http/Controller/Gen3 ※ 版本3的控制器資料夾

  • /app/Http/Model/ ※ 資料模型

  • /app/Http/Middleware/ ※ 中介軟體,含有cors、http限速、500報錯攔截、預設路由、app執行時等

  • /app/Kit/ ※ 自定義系統服務,包含第三方服務和系統功能服務

  • /app/Runtime/ ※ app服務等執行時事件處理

  • /app/TaskInterval/ ※ app全域性定時任務,預設20s精度

  • /bootstrap/ ※ 系統服務啟動、資料庫全域性引用配置,一般不需要更改此處。

  • /bootstrap/app/ ※ 專案執行入口

  • /bootstrap/driver/ ※ 服務驅動

  • /config/ ※ MySQL資料庫、Redis快取、http埠號等配置

  • /config/docs/ ※ 介面文件外掛Swagger的目錄

  • /docs/ ※ 自動介面文件Swagger的的目錄

  • /extend/ ※ 自定義的擴充套件庫,kit是擴充套件介面應用,extend是擴充套件介面封裝

  • /routes/ ※ 路由,同時支援模版型路由(web.go)、Api型路由(api.go)。推薦4層路由命名。

  • /tmp/ ※ fresh熱更的快取日誌目錄。目錄需許可權777。

  • /storage/ ※ 系統日誌、檔案上傳、靜態快取。目錄需許可權777。

  • /views/ ※ 模版渲染的原始資料夾

  • /views/pages/ ※ 模版的html檔案

  • /views/static/ ※ 模板靜態資源:js、css、img

  • ginvel.com ※ 專案生產的二進位制檔案,在生產環境用。目錄需許可權773。

  • go.mod ※ 專案所依賴的module路徑、第三方庫等的引入

  • main.go ※ 跑起本專案的入口main檔案。

命名原則

  • 自定義函式:大駝峰
  • 自定義變數:小駝峰
  • 自定義結構體和結構體成員:大駝峰
  • MySQL、Redis:小寫+下劃線
  • 介面名:小寫+下劃線
  • 自定義資料夾名:大駝峰
  • 系統集資料夾名:小寫

基礎環境

1⃣️Go執行環境

️搭建Go和基礎Gin環境請參考:blog.csdn.net/weixin_41827162/arti...

2⃣️MySQL5.7+

請將/專案資料/ginlaravel.sql 檔案匯入到你的資料庫

3⃣️Redis

請提前開啟你的Redis服務

cmd中執行「 go run main.go 」即可啟動專案。

或使用熱更方式啟動http服務,在cmd中目錄執行”fresh”。v1.4開始為適配swaggo遂將server.go更名為main.go。

訪問

127.0.0.1:8090

專案上線

serverConfig[“ENV”]的值改成release,然後使用以上同樣方法執行。

如何初始化專案

以當前目錄 /Users/fyonecon/go/src/ 為例

獲取原始碼:
cd go/src
git clone https://github.com/fyonecon/ginlaravel.git

初始化專案:
go mod init

清除不需要的vendor中的第三方擴充套件:
go mod tidy
 重新載入vendor中的第三方擴充套件:
go mod vendor

將專案打包成二進位制檔案:
go build -mod=mod
(執行二進位制檔案需要ginlaravel的檔案的許可權為:chmod 773 ginvel.com)

在/config/mysql.go配置資料庫資訊。
在/config/redis.go配置快取資料庫資訊。

啟動http服務:
go run main.go

或 啟動二進位制檔案http服務:
./ginlaravel

執行fresh熱更服務(Mac環境)

以專案目錄 /Users/fyonecon/go/src/ginlaravel 為例

安裝fresh:
go get github.com/pilu/fresh

去.bash_profile檔案目錄:
cd ~

重新編譯配置檔案:
source ~/.bash_profile

切換到專案目錄:
cd go/src/ginlaravel

開啟熱更:
fresh

退出http服務用快捷鍵:Ctrl + C 。或直接關閉終端視窗。

以上即可專案開啟的fresh熱更服務。
若想一直開啟終端視窗,請使用screen(yum install screen)來保持視窗。

熱更服務文件:github.com/gravityblast/fresh

Swagger介面文件

官方教程:github.com/swaggo/gin-swagger

安裝教程(GinLaravel v1.4已經整合swagger(v1.7開始預設不整合,因為沒什麼卵用),在/routes/must.go路由檔案裡面,不需要再次安裝和引入。)如下:

1。進入專案跟目錄

2。安裝swag命令:
go get -u github.com/swaggo/swag/cmd/swag

3。檢視是否命令是否安裝成功:
swag -v

3.1。安裝docs
swag init

3.2。切換到vendor目錄,將swaggo安裝在vendor目錄下而不是全域性安裝:
cd vendor

4。安裝 gin-swagger:
go get -u github.com/swaggo/gin-swagger
go get -u github.com/swaggo/files
go mod vendor

5。在route裡面import引入swag:
import (
 swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" _ "ginlaravel/docs" // docs is generated by Swag CLI, you have to import it.)

5.1。書寫路由:
url := ginSwagger.URL("http://127.0.0.1:8090/swagger/doc.json") // The url pointing to API definition
route.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler, url))

5.2。啟動http服務:go run main.go

5.3。訪問:http://127.0.0.1:8090/swagger/index.html

將專案打包成二進位制檔案(Mac、Centos環境)

#1。在ginlaravel專案根目錄:
go build -mod=mod

#此時,在專案目錄生成或更新了ginlaravel二進位制檔案。
 #2。開啟檔案的可執行許可權:
chmod 773 ginlaravel
 #3。在專案根目錄執行:
./ginvel.com
 #即可開啟二進位制服務。

將Go專案部署在Centos7上(Go環境搭建、伺服器環境搭建、資料庫環境搭建)

教程:blog.csdn.net/weixin_41827162/arti...

如何將GOPATH裡面的”go get xxx”擴充套件引用到vendor裡面

先執行”go get 擴充套件github地址”,在專案中import引入”xxx”擴充套件

再在專案跟目錄執行”go mod vendor”

這樣就可以將擴充套件自動引用到vendor目錄下而不用govendor。

將go專案部署到centos7的docker中


########### Dockerfile程式碼 ##########

#1.1)docker images檢視製作
FROM golang:latest
# 修改系統為上海時區
RUN echo "Asia/Shanghai" > /etc/timezone
 && rm /etc/localtime && dpkg-reconfigure -f noninteractive tzdata#作者
MAINTAINER fyonecon "2652335796@qq.com"
#設定工作目錄(暫時規定最終資料夾名與module名相同)
WORKDIR $GOPATH/src/ginvel.com
#將伺服器的go工程程式碼加入到docker容器中
ADD . $GOPATH/src/ginvel.com
#修改env引數
RUN go env -w GO111MODULE=on
RUN go env -w GOPROXY=https://goproxy.cn,direct
RUN export GIN_MODE=release
#初始化框架所需擴充套件
RUN go mod vendor
#編譯成二進位制檔案
RUN go build -mod=mod
#暴露埠
EXPOSE 8090
#最終執行docker的命令(必須為module名)
ENTRYPOINT  ["./ginvel.com"]

######### Dockerfile教程 #########

#1.2)製作docker映象,單獨在專案跟目錄執行(這個docker映象名可以自定義,一般與資料夾名或module名一樣即可):
#將Dockfile檔案放置在專案跟目錄,然後執行
#docker build -t ginvel.com .
#檢視映象
#docker images
#檢視docker佔用記憶體大小
#docker ps -as

#2)docker執行映象,執行生成的二進位制檔案(二進位制檔案為專案go.mod裡面的module名,不可更改。及其重啟後,docker的埠對映需要重新執行。)
#第一個埠為宿主機埠,第二個埠為docker埠,注意httpserver的host是0.0.0.0。
#開啟docker(前臺方式)
#docker run -p 8090:8090 ginvel.com
#開啟docker(後臺方式,推薦)
#docker run -p 8090:8090 -d ginvel.com

#2.1)檢視已執行的docker
#docker ps

#3)檢視docker日誌
#docker logs -f ginvel.com

#4)其他(可以使用docker build的名或映象id,用docker images檢視)
#停止服務
#docker stop ginvel.com
#刪除container例項
#docker rm ginvel.com
#刪除container映象
#docker rmi ginvel.com
#強行刪除container映象
#docker rmi -f ginvel.com

#5)進入docker的命令
#檢視正在執行的docker的id(docker images不行)
#sudo docker ps
#進入docker
#sudo docker exec -it 正在執行的docker的id /bin/bash

版權

MIT

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章