[Golang] apifaker 開發(fā)記

最近在準備畢業(yè)設(shè)計,雖然為 Android 項目鞠评,但還是需要一些后端支持,所以我就想能不能有一種方便的方式開發(fā)后端 api 的方式。

在之前 Rails 開發(fā)中畦徘,養(yǎng)成的了“急躁”的好習慣,轉(zhuǎn)到 Go 后抬闯,明顯感覺思維的轉(zhuǎn)變井辆,Go 的思維方式相對 Rails 來說,更注重正交性溶握,清晰度杯缺,KISS。

所以開發(fā)之前睡榆,我明確了這個項目的定位:

  1. 能快速開啟一個符合 Restful 原則的 api 服務器萍肆。
  2. 實現(xiàn) http.Helper 接口袍榆,能組合別的路由,保證擴展性塘揣。
  3. 用 json 文件包雀,不用數(shù)據(jù)庫,降低復雜度亲铡,能回寫到文件馏艾,保證數(shù)據(jù)一致性。
  4. 能實現(xiàn)簡單的數(shù)據(jù)驗證奴愉。

然后琅摩,決定了主要的 struct ApiFaker 的主要成員變量及其對外接口:

type ApiFaker struct {
     // 匿名組合,使用 Engine 的路由
    *gin.Engine

     // json api 文件目錄
    ApiDir string

    // 內(nèi)部路由
    Routers []*Router

    // 外部路由
    TrueMux http.Handler

    // 內(nèi)部路由的前綴
    Prefix string
}

// 創(chuàng)建新的 ApiFaker
func NewWithApiDir(dir string) (*ApiFaker, error)

// 設(shè)置 ApiFaker 前綴并組合其外部路由
func (af *ApiFaker) MountTo(path string, handler http.Handler)

// 將運行事的數(shù)據(jù)回寫到 json 文件中
func (af *ApiFaker) SaveToFile()

// 實現(xiàn) http.Handler 接口
func (af *ApiFaker) ServeHTTP(rw http.ResponseWriter, req *http.Request)

這一步锭硼,非常重要房资,因為它關(guān)系到整個項目的走向,正所謂檀头,選擇比努力重要轰异。然而,大部分項目都不能在一開始就確定所有變量和方法暑始,然后不再改變搭独,所以我們的設(shè)計標準就是KISS,從最核心的功能出發(fā)廊镜,逐步迭代牙肝。

接下來要設(shè)計的就是 Router 及其包含的最復雜的 Model:

  1. 一個 Rouer 應該包含一個資源,可等同于數(shù)據(jù)庫中的 table, 及其一系列 restful 的 path嗤朴。
  2. 資源對應的就是 Model配椭,它應該:
    1. 記錄資源的每一個 table 的 column
    2. 基本的 CRUD
    3. 由于還要回寫到 json 文件,所以應該有一個標示記錄數(shù)據(jù)是否改變
    4. 需要對應 json 文件的結(jié)構(gòu)雹姊,和運行時數(shù)據(jù)的容器
type Router struct {
    Model  *Model
    Routes []Route
    filePath string
}
type Model struct {
    Name string
    Seeds   []map[string]interface{}
    Columns []*Column                
    Set *gset.SetThreadSafe
    dataChanged bool
    sync.Mutex
}

這里用到的我之前的實現(xiàn)的一個集合 gset

到這里股缸,我們已經(jīng)設(shè)計好項目的邊界,和主要的數(shù)據(jù)結(jié)構(gòu)吱雏,當然還有一些細節(jié)沒有設(shè)計敦姻,比如,RouteColmun 還有運行時的數(shù)據(jù)管理歧杏。 然而只要方向確定镰惦,內(nèi)部不斷迭代,一定能到達一個穩(wěn)定的水平得滤。

由于我 Go 開發(fā)經(jīng)驗和設(shè)計能力有限陨献,還請高手可以指點。

源碼:github.com/Focinfi/apifaker

服務器設(shè)計文章:許式偉:服務端開發(fā)那些事兒

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末懂更,一起剝皮案震驚了整個濱河市眨业,隨后出現(xiàn)的幾起案子急膀,更是在濱河造成了極大的恐慌,老刑警劉巖龄捡,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卓嫂,死亡現(xiàn)場離奇詭異,居然都是意外死亡聘殖,警方通過查閱死者的電腦和手機晨雳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奸腺,“玉大人餐禁,你說我怎么就攤上這事⊥徽眨” “怎么了帮非?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長讹蘑。 經(jīng)常有香客問我末盔,道長,這世上最難降的妖魔是什么座慰? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任陨舱,我火速辦了婚禮,結(jié)果婚禮上版仔,老公的妹妹穿的比我還像新娘游盲。我一直安慰自己,他們只是感情好邦尊,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布背桐。 她就那樣靜靜地躺著,像睡著了一般蝉揍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上畦娄,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天又沾,我揣著相機與錄音,去河邊找鬼熙卡。 笑死杖刷,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的驳癌。 我是一名探鬼主播滑燃,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼颓鲜!你這毒婦竟也來了表窘?” 一聲冷哼從身側(cè)響起典予,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乐严,沒想到半個月后瘤袖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡昂验,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年捂敌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片既琴。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡占婉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出甫恩,到底是詐尸還是另有隱情逆济,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布填物,位于F島的核電站纹腌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏滞磺。R本人自食惡果不足惜升薯,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望击困。 院中可真熱鬧涎劈,春花似錦、人聲如沸阅茶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脸哀。三九已至蹦浦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撞蜂,已是汗流浹背盲镶。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蝌诡,地道東北人溉贿。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像浦旱,于是被迫代替她去往敵國和親宇色。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容