先嘚啵幾句
大家好,Golang這麼棒的語言學習的人越來越多,github上的輪子也是逐漸多起來,但很多剛學的朋友沒有深入了解輪子的原理,看輪子使用手冊直接就用,每個人輪子的規則政策基本都有自己的特性,我們不能每次都跟重新學本書一樣,人腦有限是學不過來的
俗話說:『知其然知其是以然』。為了不讓每個輪子都重新學一遍,最好的辦法把輪子的核心思想掌握,這樣拿過來一個同樣屬性的輪子,你就能從上層一眼看透整體輪子的架構,稍微學學就知道好處和痛點在什麼地方。
不管API架構輪子有多少,但核心思想基本一緻,就拿php/java/go,他們三者的web架構核心思想也大緻相同,不相信可以去嘗試找3個架構讀一讀,讀完你不會失望的
我個人本身是一位phper,雖說語言隻是工具,但職場上需要我們掌握更多的工具才能發揮自己的潛能,于是我就開始各種吸收go相關知識,看書、看源碼、碎片時間讀簡書。最後為了檢驗自己的學習成果動手寫了一套簡易版的API架構,一切的學習隻有動手的時候才知道自己知多少。
嘚啵玩,準備進入正題
構思
簡版架構為了掌握核心思想,我們先列出來想要這個架構實作的特性
- 支援靜态路由、參數路由、組路由
- 元件式可擴充的 JSON/TEXT/JSONP/XML等輸出格式
- 支援依賴注入
- 支援中間件編寫
- 統一日志管理
- HTTP上下文處理
- 内置一些可擴充的标準化元件
差不多這些,這套簡易架構為了路由操作速度快,把gin架構的節點tree拿過來直接使用,這樣可以讓我們更快的搭建核心的功能(除了tree.go),其餘代碼簡易全部手寫,隻有這樣才能明白golang的真正吸引力
幹貨,整就完了哈
源碼介紹
package main
import (
"koala/v1"
)
func main() {
// 執行個體koala
app := koala.New()
// ** ctx *koala.Context 這裡是重點
app.Add("GET", "/member/:name/:age", func(ctx *koala.Context) {
type ss struct {
Name string `json:"name"`
Age int `json:"age"`
}
test := ss{"xiaoliang", 32}
ctx.Json(test)
})
// 運作http server 端口 :8080
app.Run(":8080")
}
1、主函數main中執行個體化 koala.New()
[email protected]:~***koala$ go run test.go
[KOALA-DEBUG][啟動中]
Add GET /member/:id
[KOALA-DEBUG]監聽端口[:8080]
[KOALA-DEBUG][服務啟動成功]
2、當請求 http://127.0.0.1:8080/member/10
3、HTTP傳回
{
name: "xiaoliang",
age: 32
}
API架構重點在上下文處理
app.Add("GET", "/member/:name/:age", func(ctx *koala.Context) {
重點在HTTP上下文處理上,為了使用者更簡易的操作,不需要知道核心如何實作,所有操作均可在Context中拿到(ctx *koala.Context)
API架構上下文結構體說明
// 上下文
type Context struct {
rw http.ResponseWriter
req *http.Request
koala *Koala
routerName string
method string
Param Params
}
rw http.ResponseWriter:
- http處理程式使用ResponseWriter接口
- 接口包含: Header、Writer、WriterHeader
req *http.Request:
- 接收到一個http請求後,解析相應的封包資訊,均會解析為http.Request結構體字段,例如:Method、URL、Header、Body、Host、Form等相關結構體字段
koala *Koala:
- 架構核心引擎,結構體我這裡貼出來
// 定義 koala引擎結構
type Koala struct {
// 調試模式
debug bool
// 版本号
version string
// 節點樹
trees map[string]*node
// 臨時對象池
pool sync.Pool
// 單例注入
di DIer
}
method string
請求方式,例如: get/post/delete/connect/put等
Param Params
繼承一些擷取參數相關函數
曉亮 - 期待您的關注
我也是golang初學者,寫這篇文章也是為了給自己學習過程做個記錄,能讓寫過的每一行代碼了解的更深。
我的學習過程也是看很多開源代碼結合而來,開源精神需要(貢獻、付出),我從其他大牛代碼吸取很多知識,也希望通過自己的了解将知識轉化成通俗易懂的語言把這份知識貢獻正在看這篇文章的您。
Koala API架構目前狀态是文章和開發同步進行,估計會有很多問題,希望您對新手文章能給予體諒,也麻煩您狠狠的指出缺點BUG等,您的鞭策就是學習動力,萬分感謝。
關注我吧,您不會失望,後面會陸續更新,保證您看完所有文章能寫一套自己的輪子,同樣能看懂别人的輪子。
下一遍将從kola引擎結構講起,您真正想看的馬上開始。 曉亮期待您的關注