Go項(xiàng)目結(jié)構(gòu)設(shè)計(jì)與實(shí)踐(多存儲(chǔ)下)

Golang項(xiàng)目結(jié)構(gòu)設(shè)計(jì)(雙存儲(chǔ)下)

目錄

  1. 總要
  2. 結(jié)構(gòu)設(shè)計(jì)
  3. 控制層和服務(wù)層設(shè)計(jì)
  4. 服務(wù)層設(shè)計(jì)
  5. 數(shù)據(jù)訪問(wèn)層設(shè)計(jì)
  6. 數(shù)據(jù)倉(cāng)庫(kù)層設(shè)計(jì)

前要

我為什么會(huì)寫這篇文章?

避免調(diào)用鏈混亂,代碼可視性差等尷尬問(wèn)題

包結(jié)構(gòu)解釋

|
|--routers     路由層
|--controllers 控制器層,負(fù)責(zé)邏輯判斷和返回結(jié)果
|--service     服務(wù)層,主要是處理控制層傳入的數(shù)據(jù)并進(jìn)行業(yè)務(wù)處理
|--Dao         數(shù)據(jù)訪問(wèn)層 是服務(wù)層獲取數(shù)據(jù)的接口包
|--repository  數(shù)據(jù)倉(cāng)庫(kù)層,把數(shù)據(jù)庫(kù)和redis和其他存儲(chǔ)都放在這個(gè)包下
|--component   組件包,是主要四層的補(bǔ)充,里面一般放不確定那層需要調(diào)用的東西
|--conf        配置包
|--conn        連接包,包括redis菲语、mysql秀姐、id生成器的初始化鏈接
|--constname   常量包,包括默認(rèn)值,業(yè)務(wù)響應(yīng)碼,業(yè)務(wù)響應(yīng)信息,redis的Key
|--filter      過(guò)濾器,負(fù)責(zé)非法請(qǐng)求的攔截、非法詞匯攔截邑雅、接口基本鑒權(quán)嗦玖、身份鑒權(quán)等
|--initialize  初始化包,當(dāng)使用多存儲(chǔ)的時(shí)候患雇,需要先把數(shù)據(jù)庫(kù)的基本數(shù)據(jù)初始化內(nèi)存數(shù)據(jù)庫(kù)中,比如redis
|--middleware  中間件包踏揣,比如jwt等
|--util        工具包,主要是一些小工具的包

組件包和工具包的區(qū)別?

有人可能會(huì)在使用中對(duì)組件包和工具包有困惑庆亡,他們好像有共同之處,其實(shí)不然,對(duì)比而言的話。

不同之處:

 組件的體積更為大一些捞稿,組件有可能有自己的結(jié)構(gòu)體和方法,比如你需要定義一個(gè)set數(shù)據(jù)結(jié)構(gòu),除了本身Set數(shù)據(jù)結(jié)構(gòu)以外,還有關(guān)于Set的方法.

 工具的體積更為小一些,他可能只是一個(gè)小方法,比較小巧,而且比較零散又谋。

相同之處

 他們的共同之處在于:為了讓代碼更好的復(fù)用。

路由層

路由層的作用

供外部訪問(wèn),不多說(shuō)

結(jié)構(gòu)設(shè)計(jì)

路由最好是分組設(shè)計(jì),這樣有比較好的邏輯邊界,并且同一組的路由在一起,看代碼可以一目了然娱局。一般理由的分組按照模型分組即可彰亥。

控制層

控制層的作用:

1、負(fù)責(zé)獲取和反解析前端發(fā)來(lái)的數(shù)據(jù)
2衰齐、做基本的邏輯判斷,傳入的數(shù)據(jù)是否正確和合法
3任斋、將獲取的數(shù)據(jù)傳給服務(wù)層
4、把結(jié)果返回給前端
5耻涛、可能還開始和結(jié)束還包含日志記錄

結(jié)構(gòu)設(shè)計(jì):

在這一層功能相對(duì)來(lái)說(shuō)比較單一,比較簡(jiǎn)單,但是兩點(diǎn)需要注意
    1废酷、視圖模型VO(ViewModel)的定義,所以在控制器下應(yīng)該有一個(gè)vo包專門存儲(chǔ)視圖模型
    2、控制層的通用或者基礎(chǔ)方法,比如需要有一個(gè)通用的反解析json方法和通用返回結(jié)果方法,這個(gè)可以放在base.go里面
    3抹缕、上面說(shuō)到了視圖模型和基礎(chǔ)方法的設(shè)計(jì),具體的控制器和vo澈蟆、base.go平級(jí)即可.

服務(wù)層

服務(wù)層的作用:

1、接收控制層傳入的數(shù)據(jù)
2卓研、對(duì)傳入的數(shù)據(jù)進(jìn)行業(yè)務(wù)判斷,比如能否兌換禮品等
3趴俘、把視圖模型的數(shù)據(jù)賦值給數(shù)據(jù)庫(kù)模型
4睹簇、把業(yè)務(wù)處理結(jié)果返回給控制層

結(jié)構(gòu)設(shè)計(jì):

 相對(duì)于其他層來(lái)說(shuō),服務(wù)層的處理邏輯相對(duì)復(fù)雜寥闪,需要注意以下:
    1太惠、你可能有通用方法封裝,但是在封裝時(shí),對(duì)于復(fù)雜的操作應(yīng)該單獨(dú)封裝,然后使用組合的方式二次封裝疲憋。
    2凿渊、對(duì)于服務(wù)層的返回值。在服務(wù)層應(yīng)該至少有兩個(gè)返回值(res string,err error),為什么要這么做呢,
        對(duì)于res,這是業(yè)務(wù)返回結(jié)果,也就是用戶看到的,這樣控制層得到后可以大膽的直接返回給前端柜某。
        對(duì)于err,這是服務(wù)為什么得到res這個(gè)結(jié)果的原因,在最后統(tǒng)一記錄日志幫助很大,并且日志代碼并不污染業(yè)務(wù)代碼嗽元。

DAO層

DAO層的作用:

1、從數(shù)據(jù)倉(cāng)庫(kù)中獲取數(shù)據(jù)庫(kù)
2喂击、將獲取到的數(shù)據(jù)返回給服務(wù)層

結(jié)構(gòu)設(shè)計(jì):

 DAO層比較簡(jiǎn)單,可能并沒(méi)有通用方法,在這里有一個(gè)點(diǎn)需要注意:
    應(yīng)為Go是面向組合開發(fā),所以在DAO的結(jié)構(gòu)設(shè)計(jì)的時(shí)候剂癌,我覺(jué)得這樣是比較合理的:
    
    Type UserDAO struct{
        userRds *cache.UserRds
        user    *models.User
    }
    
    因?yàn)檫@里是兩個(gè)數(shù)據(jù)倉(cāng)庫(kù),一個(gè)redis,一個(gè)mysql,所以這里有兩個(gè)字段,對(duì)應(yīng)了兩個(gè)數(shù)據(jù)倉(cāng)庫(kù)的操作,擴(kuò)展的時(shí)候也比較方便

repository層(數(shù)據(jù)倉(cāng)庫(kù)層)

數(shù)據(jù)倉(cāng)庫(kù)層的作用:

1、從數(shù)據(jù)庫(kù)倉(cāng)庫(kù)獲取數(shù)據(jù),redis翰绊、mysql等
2佩谷、向DAO層提供數(shù)據(jù)

結(jié)構(gòu)設(shè)計(jì):

 數(shù)據(jù)倉(cāng)庫(kù)層功能單一,但是有兩點(diǎn)需要注意:
    1、多數(shù)據(jù)倉(cāng)庫(kù)的初始化連接部分并不應(yīng)該出現(xiàn)在這個(gè)包,這個(gè)包只獲取連接,操作數(shù)據(jù)即可监嗜。
    2谐檀、當(dāng)使用多數(shù)據(jù)倉(cāng)庫(kù)時(shí),多個(gè)數(shù)據(jù)參考并不是你想象的那么界限分明,所以不要強(qiáng)制讓他們邊界,你可能寫不下去代碼。
    3裁奇、在這個(gè)結(jié)構(gòu)下的包設(shè)計(jì)是以數(shù)據(jù)倉(cāng)庫(kù)為基本標(biāo)準(zhǔn)的.比如你有redis和mysql,那么你應(yīng)該有兩個(gè)包

多層之間如何調(diào)用

你看到主要有路由層,控制層,服務(wù)層,DAO層,數(shù)據(jù)倉(cāng)庫(kù)層,這里面的調(diào)用關(guān)系是:
路由調(diào)用->控制層->服務(wù)層->DAO層->數(shù)據(jù)倉(cāng)庫(kù)層桐猬,不可以越級(jí)調(diào)用和相互調(diào)用,因?yàn)檫@樣調(diào)用會(huì)導(dǎo)致調(diào)用鏈混亂,最后review代碼的時(shí)候,苦不堪言.

conn包

連接包的作用

  主要是管理初始化鏈接供外部調(diào)用,比如數(shù)據(jù)庫(kù)初始化鏈接,redis初始化鏈接,以及id生成器初始化鏈接等。

結(jié)構(gòu)設(shè)計(jì)

在這個(gè)包,基本都是平級(jí)關(guān)系,所以只需要?jiǎng)?chuàng)建對(duì)應(yīng)的go文件即可刽肠。

在代碼方面

1溃肪、被調(diào)用方法盡量不進(jìn)行錯(cuò)誤處理和判斷,你的錯(cuò)誤判斷和處理可能是多余的,因?yàn)槟阍谡{(diào)用這個(gè)方法的時(shí)候,你會(huì)再次判斷,存在重復(fù)判斷的可能
2、不要強(qiáng)行使用具名返回值,這可能會(huì)讓你的代碼難看,尤其是在DAO層,你會(huì)發(fā)現(xiàn)使用具名返回值可能會(huì)讓你無(wú)所適從音五。
3惫撰、具名返回值有個(gè)明顯的優(yōu)點(diǎn):調(diào)用方能清楚看到這個(gè)返回值具體是什么含義,這是一個(gè)很重要的優(yōu)點(diǎn),尤其對(duì)于協(xié)作開發(fā)而言。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末躺涝,一起剝皮案震驚了整個(gè)濱河市厨钻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坚嗜,老刑警劉巖夯膀,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異苍蔬,居然都是意外死亡棍郎,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門银室,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事蜈敢」架” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵抓狭,是天一觀的道長(zhǎng)伯病。 經(jīng)常有香客問(wèn)我,道長(zhǎng)否过,這世上最難降的妖魔是什么午笛? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮苗桂,結(jié)果婚禮上药磺,老公的妹妹穿的比我還像新娘。我一直安慰自己煤伟,他們只是感情好癌佩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著便锨,像睡著了一般围辙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上放案,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天姚建,我揣著相機(jī)與錄音,去河邊找鬼吱殉。 笑死掸冤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的考婴。 我是一名探鬼主播贩虾,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼沥阱!你這毒婦竟也來(lái)了缎罢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤考杉,失蹤者是張志新(化名)和其女友劉穎策精,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體崇棠,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咽袜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了枕稀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片询刹。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谜嫉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凹联,到底是詐尸還是另有隱情沐兰,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布蔽挠,位于F島的核電站住闯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏澳淑。R本人自食惡果不足惜比原,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杠巡。 院中可真熱鬧量窘,春花似錦、人聲如沸忽孽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)兄一。三九已至厘线,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間出革,已是汗流浹背造壮。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留骂束,地道東北人耳璧。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像展箱,于是被迫代替她去往敵國(guó)和親旨枯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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