1. 程式人生 > >後端初始化 —— Go(全棧)開發企業級後臺管理系統

後端初始化 —— Go(全棧)開發企業級後臺管理系統

Abstract:

終於要跟go語言沾邊了,到此,作者還有點小小的興奮呢,也不知道為啥!
不管你之前是否從事過web相關的開發,相信你一定聽過【框架】這個詞,不為什麼,因為隨著社會的發展進步,被前人總結出來的架構,經驗等等,系統的、可複用的東西,我們都能認為其為框架。既然說到了框架,那麼毫無疑問,我們這裡要用框架了,不要問我為什麼,因為時間寶貴,我們沒有必要重複造輪子,當然如果你想自己寫框架的話,那我這裡要祝你好運!

平時在工作中會同時寫python和go。截止目前, 用python的時間要比用go的時間要長,各種python框架如django、flask、tornado、scrapy等都有所涉獵。而go的web框架用的還不多,所以在這裡我對go的幾種框架做一個簡單的調研與比較,然後做一個產品選型。

框架特性:

  • 簡單化:RESTful 支援、MVC 模型,可以使用 bee工具快速地開發應用,包括監控程式碼修改進行熱編譯、自動化測試程式碼以及自動化打包部署。
  • 智慧化:支援智慧路由、智慧監控,可以監控 QPS、記憶體消耗、CPU 使用,以goroutine 的執行狀況,讓您的線上應用盡在掌握。
  • 模組化:beego 內建了強大的模組,包括 Session、快取操作、日誌記錄、配置解析、效能監控、上下文操作、ORM模組、請求模擬等強大的模組,足以支撐你任何的應用。
  • 高效能:beego 採用了 Go 原生的 http 包來處理請求,goroutine 的併發效率足以應付大流量的 Web 應用和 API應用,目前已經應用於大量高併發的產品中。

框架特性:

  • 熱編譯:編輯, 儲存, 和 重新整理時,Revel自動編譯程式碼和模板,如果程式碼編譯錯誤,會給出一個 錯誤提示,同時捕捉 執行期錯誤。
  • 全棧功能: Revel 支援: 路由, 引數解析, 驗證, session/flash, 模板, 快取, 計劃任務, 測試, 國際化等功能。
  • 高效能:Revel 基於 Go HTTP server 構建。 這是techempower釋出的 最新評測結果 。在各種不同的場景下進行了多達三到十次的請求負載測試。
  • 模組化:Revel框架由被稱為 過濾器 的中介軟體組成,它實現了幾乎所有的請求處理功能。 開發者可以自由地使用自定義的過濾器,比如如自定義的路由器,用以替換Revel預設的路由過濾器。

其他還有類似Goji,Gin,Traffic,Faygo,essgo, Macaron, GoInk, Baa等等,如果大家有感興趣的可以自己搜來看看。
在本文中,綜合考慮文件使用廣泛度,文件的完整度,以及其他各種說不清道不明的原因,本文決定使用Beego框架

安裝: 需要安裝Beego和Bee的開發工具 
go get -u github.com/astaxie/beego 
go get -u github.com/beego/bee

安裝完成之後,在命令列中輸入bee 會有如下輸出:
這裡寫圖片描述

建立一個新的web專案,專案名稱就簡單叫systemAdmin吧!
這裡寫圖片描述

看提示可以知道我們已經成功建立了名字叫systemAdmin 的專案,我們來看看初始化的專案的目錄結構:
這裡寫圖片描述

看這個目錄結構是不是覺得很清晰?是的,確實很清晰,也比較乾淨,不像之前我們初始化的前端程式碼,有很多東西。

接下來我們同bee run 執行專案看看:
這裡寫圖片描述

這裡寫圖片描述

開啟瀏覽器,我們可以看到,專案已經在http://localhost:8080/ 地址啟動了,接下來我們來看看beego的MVC架構,為我們接下來的開發打好基礎,同時也瞭解一下如果要想實現一個自己的框架,或許我們能從中瞭解到一個架構的設計。這裡寫圖片描述

文字描述如下:

  1. 在監聽的埠接收資料,預設監聽在 8080 埠。

  2. 使用者請求到達 8080 埠之後進入 beego 的處理邏輯。

  3. 初始化 Context 物件,根據請求判斷是否為 WebSocket 請求,如果是的話設定 Input,同時判斷請求的方法是否在標準請求方法中(GET、POST、PUT、DELETE、PATCH、OPTIONS、HEAD),防止使用者的惡意偽造請求攻擊造成不必要的影響。

  4. 執行 BeforeRouter 過濾器,當然在 beego 裡面有開關設定。如果使用者設定了過濾器,那麼該開關開啟,這樣可以提高在沒有開啟過濾器的情況下提高執行效率。如果在執行過濾器過程中,responseWriter 已經有資料輸出了,那麼就提前結束該請求,直接跳轉到監控判斷。

  5. 開始執行靜態檔案的處理,檢視使用者的請求 URL 是否和註冊在靜態檔案處理 StaticDir 中的 prefix 是否匹配。如果匹配的話,採用 http包中預設的 ServeFile 來處理靜態檔案。

  6. 如果不是靜態檔案開始初始化 session 模組(如果開啟 session 的話),這個裡面大家需要注意,如果你的 BeforeRouter 過濾器用到了 session 就會報錯,你應該把它加入到 AfterStatic 過濾器中。

  7. 開始執行 AfterStatic 過濾器,如果在執行過濾器過程中,responseWriter 已經有資料輸出了,那麼就提前結束該請求,直接跳轉到監控判斷。

  8. 執行過過濾器之後,開始從固定的路由規則中查詢和請求 URL 相匹配的物件。這個匹配是全匹配規則,即如果使用者請求的 URL 是 /hello/world,那麼固定規則中 /hello 是不會匹配的,只有完全匹配才算匹配。如果匹配的話就進入邏輯執行,如果不匹配進入下一環節的正則匹配。

  9. 正則匹配是進行正則的全匹配,這個正則是按照使用者新增 beego 路由順序來進行匹配的,也就是說,如果你在新增路由的時候你的順序影響你的匹配。和固定匹配一樣,如果匹配的話就進行邏輯執行,如果不匹配進入 Auto 匹配。

  10. 如果使用者註冊了 AutoRouter,那麼會通過 controller/method 這樣的方式去查詢對應的 Controller 和他內建的方法,如果找到就開始執行邏輯,如果找不到就跳轉到監控判斷。

  11. 如果找到 Controller 的話,那麼就開始執行邏輯,首先執行 BeforeExec 過濾器,如果在執行過濾器過程中,responseWriter 已經有資料輸出了,那麼就提前結束該請求,直接跳轉到監控判斷。

  12. Controller 開始執行 Init 函式,初始化基本的一些資訊,這個函式一般都是 beego.Controller 的初始化,不建議使用者繼承的時候修改該函式。

  13. 是否開啟了 XSRF,開啟的話就呼叫 Controller 的 XsrfToken,然後如果是 POST 請求就呼叫 CheckXsrfCookie 方法。

  14. 繼續執行 Controller 的 Prepare 函式,這個函式一般是預留給使用者的,用來做 Controller 裡面的一些引數初始化之類的工作。如果在初始化中 responseWriter 有輸出,那麼就直接進入 Finish 函式邏輯。

  15. 如果沒有輸出的話,那麼根據使用者註冊的方法執行相應的邏輯,如果使用者沒有註冊,那麼就呼叫 http.Method 對應的方法(Get/Post 等)。執行相應的邏輯,例如資料讀取,資料賦值,模板顯示之類的,或者直接輸出 JSON 或者 XML。

  16. 如果 responseWriter 沒有輸出,那麼就呼叫 Render 函式進行模板輸出。

  17. 執行 Controller 的 Finish 函式,這個函式是預留給使用者用來重寫的,用於釋放一些資源。釋放在 Init 中初始化的資訊資料。

  18. 執行 AfterExec 過濾器,如果有輸出的話就跳轉到監控判斷邏輯。

  19. 執行 Controller 的 Destructor,用於釋放 Init 中初始化的一些資料。

  20. 如果這一路執行下來都沒有找到路由,那麼會呼叫 404 顯示找不到該頁面。

  21. 最後所有的邏輯都匯聚到了監控判斷,如果使用者開啟了監控模組(預設是開啟一個 8088 埠用於程序內監控),這樣就會把訪問的請求連結扔給監控程式去記錄當前訪問的 QPS,對應的連結訪問的執行時間,請求連結等。

既然瞭解完了整個框架的結構,那麼接下來,我們簡單的實現一下GET/POST請求,作為我們整個專案初始化的練手:

     GET /POST:   
    從前面瞭解到整個框架的入口函式為main.go   路由函式為router.go   
    所以我們首先需要在router.go中設定好路由 程式碼如下:
package routers

import (
    "github.com/astaxie/beego"
    "systemAdmin/controllers"
)

func init() {

    beego.Router("/", &controllers.MainController{})

    beego.Router("/username", &controllers.UserController{})

    beego.Router("/login", &controllers.LoginController{})

}

設定好了路由,接下來需要去實現Controller,分別為UserController與LoginController,程式碼如下:

package controllers

import (
    "github.com/astaxie/beego"
    "strconv"
    "strings"
)

type MainController struct {
    beego.Controller
}

func (c *MainController) Get() {
    c.Data["Website"] = "magic.chen"
    c.Data["Email"] = "[email protected]"
    c.TplName = "index.tpl"
}

// 基本的GET請求獲取使用者名稱
type UserController struct {
    beego.Controller
}

type Date struct {
    name string
    age  int
    sex  string
}

func (c *UserController) Get() {
    data := Date{"magic", 24, "男"}
    content := strings.Join([]string{"姓名:" + data.name, "性別:" + data.sex, "年齡:" + strconv.Itoa(data.age)}, " ")
    c.Ctx.WriteString(content)
}

// 基本的Post請求
type LoginController struct {
    beego.Controller
}

func (c *LoginController) Post() {
    username := c.GetString("username")
    password := c.GetString("password")
    content := strings.Join([]string{"使用者名稱:" + username, "密碼:" + password}, " ")
    c.Ctx.WriteString(content)
}

檢視訪問結果:
GET:
這裡寫圖片描述

POST:
post我們用postman工具來測試:
這裡寫圖片描述

可以看到輸出結果跟我們的輸入一致。ok,這裡簡單的介紹了利用Beego框架初始化一個專案,並簡單實現了兩種最常見的web請求,GET/POST,到此,我們的後端專案初始化工作就算基本完成了,既然前後端的專案都已經搭建ok了,接下來的工作也就真正步入正軌了,在接下來的一系列課程中,我們會詳細的看到,如果進行前後端互動,如何一步步的開發一個完善的企業後臺管理系統。

那麼,盡情期待吧!

參考目錄:

相關推薦

初始 —— Go開發企業級後臺管理系統

Abstract: 終於要跟go語言沾邊了,到此,作者還有點小小的興奮呢,也不知道為啥! 不管你之前是否從事過web相關的開發,相信你一定聽過【框架】這個詞,不為什麼,因為隨著社會的發展進步,被前人總結出來的架構,經驗等等,系統的、可複用的東西,我

React開發企業級後臺管理系統筆記一環境配置

主要介紹安裝node環境和react環境依賴安裝 node環境安裝 1,官網下載node安裝包。安裝完成後可以通過以下命令查詢安裝版本號 node -v ,只要安裝成功便會自動安裝npm 依賴包管理工

keepalived 代理數據庫雙主基本配置註解

keepalived AA復制 高可用 keepalived 代理後端服務器基本配置1.環境後端兩臺服務器有雙主數據庫環境2.配置Keepalived主配置文件(/etc/keepalived/keepalived.conf) :keepalived 代理後端數據庫(雙主)基本配置註解

CentOS7.5安裝與初始配置做標準化

分配 同步服務 == ulimit 默認 ipad get aos ssa 本文分享CentOS的標準化安裝配置方法,方便集群批量裝機配置 ------------------------- 完美的分割線 ---------------------------- 1.安

初始引數Initialization Parameter知識合集 based on 11g

初始化引數檔案分為: 1)pfile 靜態引數檔案 2)spfile 動態伺服器引數檔案 作用:儲存建立例項、啟動後臺程序所需引數值。 呼叫:例項啟動時,按如下順序調取初始化引數檔案 linux: $ORACLE_HOME/dbs/spfile<SID>.ora $ORACLE

java定時任務框架org.quartz

//從排程程式工廠獲取一個排程程式的例項 Scheduler scheduler = null; try { scheduler = StdSchedulerFactory.getDefaultScheduler();

大前端學習路線指南

第一部分:前端頁面重構 一:pc端網站佈局專案 html基礎,css基礎,css核心屬性 css樣式層疊,繼承,盒模型 容器,溢位及元素型別 瀏覽器相容與寬高自適應 定位,錨點與透明 圖片整合 表格,css屬性與濾鏡 二:html5+css3基礎專案 html5新增元

根據輸入list來初始tablejs實現

通過js動態生成表格並初始化,最近正好做了一個點選按鈕彈出日誌表格的功能,獻上一個例子給大家。 首先是動態生成表頭 function createDivHtml(){ if($('#logTable').length == 0){ var aHtml="<ta

window764bit環境下安裝基於TensorFlow的Keras 教程CPU版

本教程是基於windows7 64位系統 使用anaconda的方法安裝TensorFlow,並且安裝keras的教程 教程主要面向:初學者和Windows重度使用者。背景介紹:Keras將會成為第一個被新增到TensorFlow核心中的高級別框架,這會讓Keras變成Ten

STM32初識——中斷初始過程by woody

在庫函式中,配置 GPIO 與中斷線的對映關係的函式 GPIO_EXTILineConfig()來實現的: void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) 該函式將 GPIO

Mybatis總結SqlSessionFactory初始過程原始碼分析

SqlSessionFactoryBuilder根據傳入的資料流生成Configuration物件,然後根據Configuration物件建立預設的SqlSessionFactory例項。Mybatis初始化要經過簡單的以下幾步:1. 呼叫SqlSessionFactoryB

rocketmq之原始碼分析broker入口BrokerController初始過程十六

接著上一章的BrokerController的基礎功能講,本章主要介紹的是BrokerController的初始化操作,在初始化的

4W字的面試知識點總結持續更新

點贊再看,養成習慣,微信搜尋【三太子敖丙】關注這個網際網路苟且偷生的工具人。 本文 GitHub https://github.com/JavaFamily 已收錄,有一線大廠面試完整考點、資料以及我的系列文章。 前言 前段時間敖丙不是在複習嘛,很多小夥伴也想要我的複習路線,以及我自己筆記裡面的一些知識點

工程師開發手冊原創工程師,前端工程師,工程師,架構師,爬蟲工程師,資料分析師,大資料工程師,資料探勘工程師,機器學習工程師,欒鵬

matlab2c資料分析 原創開發matlab2c動態連結庫,使用c++實現matlab函式,包含matlab中函式的使用,c++的實現原始碼,函式的呼叫示例。對於資料分析,機器學習有很大幫助

MikroTik RouterOS安裝初始配置PPPOE撥號上網

sts 瀏覽器 表示 完成 src dash allow 撥號上網 dia 1、修改登入密碼 路由器默認登入賬號為admin,密碼為空,強烈建議修改登入密碼保證安全: 2、修改接口名稱 選擇Interface,切換到Ethernet標簽,找到狀態是R(ru

Eureka客戶初始4

10. 上接RetryableEurekaHttpClient#execute,繼續執行clientFactory.newClient(currentEndpoint);返回的是new RedirectingEurekaHttpClient(endpoint.getServi

Eureka服務初始1

1. 服務啟動時會執行ServletContextListener即EurekaBootStrap,初始化通用配置的屬性,再初始化服務上下文initEurekaServerContext,最後儲存在ServletContext中 public void contextIni

Eureka服務初始2

4. 註冊中心初始化registry.init(peerEurekaNodes); public void init(PeerEurekaNodes peerEurekaNodes) throws Exception { this.numberOfRepli

easyui dialog遠端載入內容完成,進行對話內容表單初始

通過檢視easyui的幫助文件,dialog繼承於window,window繼承於panel,panel中有個onLoad事件,也就是當遠端資料載入完成後,觸發此事件。因此只要在此事件中對對話方塊中的內容進行初始化就可以了。 var $addEvent = $("#add

Eureka客戶初始3

6. 根據配置clientConfig.shouldRegisterWithEureka()生成eurekaTransport的註冊客戶端工廠newRegistrationClientFactory static EurekaHttpClientFactory canoni