从零开始写GO-API框架 一 [重复造轮子 - Golang]

先嘚啵几句

大家好,Golang这么棒的语言学习的人越来越多,github上的轮子也是逐渐多起来,但很多刚学的朋友没有深入理解轮子的原理,看轮子使用手册直接就用,每个人轮子的规则策略基本都有自己的特性,我们不能每次都跟重新学本书一样,人脑有限是学不过来的

俗话说:『知其然知其所以然』。为了不让每个轮子都重新学一遍,最好的办法把轮子的核心思想掌握,这样拿过来一个同样属性的轮子,你就能从上层一眼看透整体轮子的架构,稍微学学就知道好处和痛点在什么地方。

不管API框架轮子有多少,但核心思想基本一致,就拿php/java/go,他们三者的web框架核心思想也大致相同,不相信可以去尝试找3个框架读一读,读完你不会失望的

我个人本身是一位phper,虽说语言只是工具,但职场上需要我们掌握更多的工具才能发挥自己的潜能,于是我就开始各种吸收go相关知识,看书、看源码、碎片时间读简书。最后为了检验自己的学习成果动手写了一套简易版的API框架,一切的学习只有动手的时候才知道自己知多少。

嘚啵玩,准备进入正题

构思

简版框架为了掌握核心思想,我们先列出来想要这个框架实现的特性

  1. 支持静态路由、参数路由、组路由
  2. 组件式可扩展的 JSON/TEXT/JSONP/XML等输出格式
  3. 支持依赖注入
  4. 支持中间件编写
  5. 统一日志管理
  6. HTTP上下文处理
  7. 内置一些可扩展的标准化组件

差不多这些,这套简易框架为了路由操作速度快,把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()

zhangliang@zhangliang:~***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:

  1. http处理程序使用ResponseWriter接口
  2. 接口包含: Header、Writer、WriterHeader

req *http.Request:

  1. 接收到一个http请求后,解析相应的报文信息,均会解析为http.Request结构体字段,例如:Method、URL、Header、Body、Host、Form等相关结构体字段

koala *Koala:

  1. 框架核心引擎,结构体我这里贴出来

// 定义 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引擎结构讲起,您真正想看的马上开始。 晓亮期待您的关注

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容