1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        這個問題困擾了三歪幾天

        共 4693字,需瀏覽 10分鐘

         ·

        2020-06-05 23:20

        最近在整合各種的系統(tǒng),在這個過程中遇到了各種的問題,三歪今天來分享一下關(guān)于「項目結(jié)構(gòu)」或者說「二方包」的事。

        我們先不聊「二方包」,因為初學(xué)或者還沒工作的同學(xué)可能沒聽過這個詞。

        初學(xué)的時候或者剛做項目的時候,我們的項目架構(gòu)是怎么樣的呢?我翻出了我在大學(xué)的時候?qū)懙男emo:

        86cc17ee454665d3c4de2789a7d53c5e.webp

        可以看到的是,我們的項目只有一個Module,里邊我們分各種的包:dao/service/controller/utils...等等。

        這看起來好像沒啥問題吧?

        我們?nèi)サ焦纠镞叄赡芸吹降捻椖慷挤至硕鄠€Module,比如下圖:

        6dcc60c08e9bdbf1bcb3b46018fd8b08.webp

        有什么區(qū)別呢?我們用一個Module在里邊分各種的子包,看起來也還行。為什么我們要分多個Module呢?

        我個人認(rèn)為原因是這樣的:Maven本身就支持多模塊(Module)的管理,將不同的層分出來,項目看起來更加清晰,在改動的時候針對某個模塊去變更就好了。

        • 比如,我把dao層分成一個模塊,當(dāng)我變更dao這個模塊的時候,我只需要關(guān)心這個模塊就好了,不需要關(guān)心service模塊或者web模塊
        • 舉個例子:每層幾乎都會有自己的配置信息(配置文件),數(shù)據(jù)訪問層會有數(shù)據(jù)庫的配置文件、業(yè)務(wù)層也會有對應(yīng)的配置文件。我們抽出多個Module(不同的Module放屬于自己的配置文件),從代碼結(jié)構(gòu)層面上會顯得更加清晰。

        我們寫完的代碼是需要維護(hù)的,可維護(hù)性很重要。

        很多編程方式客觀上沒有對錯之分,一致性很重要,可讀性很重要,團(tuán)隊溝通效率很重要。程序員天生需要團(tuán)隊協(xié)作,而協(xié)作的正能量要放在問題的有效溝通上。個性化應(yīng)盡量表現(xiàn)在系統(tǒng)架構(gòu)和算法效率的提升上,而不是在合作規(guī)范上進(jìn)行糾纏不休的討論、爭論,最后沒有結(jié)論。

        二方包

        當(dāng)年我看《阿里巴巴開發(fā)手冊》的時候也寫過一篇總結(jié),當(dāng)時的文章也提到了那時候不咋懂二方包,現(xiàn)在我回來填坑了。

        首先來科普一下什么是二方庫?(二方庫也叫二方包)

        • 一方庫指的是本項目中的依賴
        • 二方庫指的是公司內(nèi)部其他項目提供的依賴
        • 三方庫指的是其他組織、公司等來自第三方的依賴

        如果看過我之前文章的同學(xué)都知道,三歪在公司目前維護(hù)的是消息管理平臺,全公司發(fā)送的消息都會經(jīng)過我的系統(tǒng)。

        我會打個「二方包」到公司的Maven倉庫,然后他們引入我的pom依賴,調(diào)用我的接口去下發(fā)消息。

        90c43ff6639cd9891dee908fe9f484a0.webp

        假如我沒有分Module,所有的代碼都寫在同一個Module下,那我發(fā)到公司的Maven倉庫會發(fā)生什么?打包(deploy)這個過程是沒毛病的。

        如果他們依賴了我這個沒有處理過的二方包,相當(dāng)于把我整個工程給依賴進(jìn)去了,這是非??膳?/strong>的。

        7845423bff8827fd778987b41ed5e655.webp

        如果有從零搭過系統(tǒng)或者整合過系統(tǒng)的同學(xué)會知道,這個過程有會有多「版本」的坑。只要版本不一致,就會出現(xiàn)一大堆奇奇怪怪的問題,并且這些問題都不太好解決。

        所以,一般我們的二方包都應(yīng)該是很清爽的。比如我提供的二方包,它就只有接口和接口所需要的實體,沒有雜余的繁瑣依賴。

        業(yè)務(wù)方是不關(guān)心接口的實現(xiàn)的,我們只需要暴露接口就好了。

        三歪一次經(jīng)歷

        最近三歪在整合系統(tǒng)嘛,分享一次經(jīng)歷。

        我負(fù)責(zé)的消息管理平臺系統(tǒng)的架構(gòu)是這樣的:

        fa4a2664b0179ffb833d3ba93a69adee.webp

        可以看到,我所負(fù)責(zé)的系統(tǒng)是分得很細(xì)的(很符合分布式的理念)。從功能上看,這些系統(tǒng)變成一個大工程也不是什么問題,只是這個系統(tǒng)會非常非常大。

        消息管理平臺除了上面的系統(tǒng),還有其他的子系統(tǒng),比如說「ID映射」。這里當(dāng)初設(shè)計的時候也把它當(dāng)做一個系統(tǒng)給抽出去了。

        「ID映射」應(yīng)該不難理解:業(yè)務(wù)方傳入的是站內(nèi)的userId,但要發(fā)的是短信。我這邊要把userId轉(zhuǎn)換成手機(jī)號,可以簡單理解這個系統(tǒng)就做的這么一個ID轉(zhuǎn)換的功能。

        現(xiàn)在要規(guī)劃把這個「ID映射」給整合起來,原有的機(jī)器要下線了,要把這個服務(wù)的功能給整到消息管理平臺的系統(tǒng)中。(為啥要整到我這個架構(gòu)上?因為本身這個系統(tǒng)就只有我這邊在頻繁使用)

        為啥要整合?現(xiàn)在的潮流可能是把單個系統(tǒng)拆出多個系統(tǒng)做”微服務(wù)“,但真正系統(tǒng)多起來未必是一件好事。

        一些小的功能其實沒必要單獨分出來一個系統(tǒng),這是需要成本的,至少我們機(jī)器成本是有的(一個系統(tǒng)我們至少會有四臺機(jī)器)->兩臺線上,一臺預(yù)發(fā),一臺線下

        OK,說完背景了以后,我們再來看看「ID映射」這個系統(tǒng)的代碼架構(gòu):

        c06f7415be73cfbdc18712c5aa460c41.webp

        說白了,就是這個工程下有這三個Module,如果你要問我為什么沒看到dao層的Module,而是直接放到core 層,問就是當(dāng)初設(shè)計不合理。依我的理解,應(yīng)該至少是要把數(shù)據(jù)訪問層抽出一個Module。

        可以看到的是,這個「ID映射」系統(tǒng)其實也是一個完整的系統(tǒng),從后臺管理頁面到數(shù)據(jù)庫都是完整的。

        現(xiàn)在要把這個系統(tǒng)給整到消息管理平臺的架構(gòu)下,如果是你,你會怎么弄呢?

        其實就兩種方式:

        1. 把這個「ID映射」系統(tǒng)整個搬到某一個系統(tǒng)中
        2. 把這個「ID映射」系統(tǒng)通過模塊拆出來,分到各個系統(tǒng)中。

        最簡單的做法肯定是把這個系統(tǒng)的代碼搬到另一個系統(tǒng),然后就可以run起來了。但前人已經(jīng)把系統(tǒng)分得那么干凈了,如果我這樣干了,后面接手的人會不會錘我呢?

        三歪認(rèn)為服務(wù)相關(guān)的代碼,應(yīng)該就整合到專門提供服務(wù)的系統(tǒng)。后臺相關(guān)的代碼,就應(yīng)該整合到后臺相關(guān)的系統(tǒng)。即便我后臺系統(tǒng)發(fā)布了,絲毫不影響對外提供的服務(wù)。

        所以,我決定把「ID映射」的各個Module抽出來,分到不同的系統(tǒng)中。把api層和部分core層的代碼的Module分到service系統(tǒng)中,把web層的Module分到admin系統(tǒng)中。

        1de428cefe4e03765b1bbba95f48e3c4.webp

        看似是挺完美的,我當(dāng)初也是這樣執(zhí)行的,于是我順利把apicore的代碼整合到service系統(tǒng)之后,正打算把web的代碼整合到admin系統(tǒng)中,遇到了一個問題。

        web的代碼是controller層,它顯然會依賴service層的代碼,service層的代碼也顯然會依賴dao的代碼。

        現(xiàn)在我已經(jīng)把api/core層的代碼大多數(shù)已經(jīng)遷到了service系統(tǒng),而admin系統(tǒng)是沒有這些代碼和依賴的,我需要整個系統(tǒng)是能跑通的,我能怎么辦?

        此時能想到的有兩種方案:

        1. service系統(tǒng)的代碼再到admin系統(tǒng)中實現(xiàn)。

        2. 現(xiàn)在service系統(tǒng)已經(jīng)實現(xiàn)好了,打個二方包,然后讓admin系統(tǒng)依賴。這里也有兩個方案:

          1. 二方包不做任何處理,admin系統(tǒng)直接依賴其所有的實現(xiàn)。
          2. admin系統(tǒng)所依賴的接口再出一個api層,admin系統(tǒng)只需要依賴api層,實現(xiàn)遠(yuǎn)程調(diào)用

        如果是你,你會選擇哪種?我們來分析一下:

        • 第一種方案:service系統(tǒng)的代碼再到admin系統(tǒng)實現(xiàn),這肯定會有代碼冗余的情況。畢竟service系統(tǒng)肯定會依賴dao層的,而admin系統(tǒng)最終也是需要依賴dao層。dao層沒有完全抽出,在前期就肯定會有代碼冗余的情況
        • 第二種方案分支①:將service系統(tǒng)已實現(xiàn)的代碼直接打成二方包,admin系統(tǒng)直接引入就沒有任何代碼冗余的問題。但這會引發(fā)其他問題:
          • 直接打成二方包意味著要把所有的實現(xiàn)依賴都打進(jìn)去,admin系統(tǒng)在引入的時候需要針對這個二方包做一系列的排包操作。(這個非常蛋疼)
          • 其實最致命的是我們干不了。我們的系統(tǒng)在發(fā)布的時候是分環(huán)境的(線上、預(yù)發(fā)、線下),我們會在發(fā)布的時候根據(jù)不同的環(huán)境使用不同的配置。如果我們此時直接打個二方包,我們是需要指定環(huán)境的,這說明我們只能用一個環(huán)境的配置,這是行不通的。
        • 第二種方案分支②:把admin系統(tǒng)所依賴的接口再出一個api層,實現(xiàn)遠(yuǎn)程調(diào)用。從字面上,這是最優(yōu)雅的方案,但如果admin系統(tǒng)依賴的接口眾多的時候,實際踐行的時候會發(fā)現(xiàn)這工作量巨大。
          • admin系統(tǒng)所依賴的接口有40+個,這些接口所依賴的實體有80+個。我搞了大半天,發(fā)現(xiàn)完全搞不動,工作量巨大??!這是單純的體力活

        第二個方案的分支①三歪再來聊聊為什么說干不了,首先我們的實現(xiàn)是有配置的

        1967130070711515e4f6cf3312f5144f.webp

        我們在deploy的時候就必須指定一個環(huán)境,比如我們默認(rèn)選擇線上環(huán)境的配置好了。打完包以后,這個包默認(rèn)的環(huán)境就是給線上使用的。但是admin系統(tǒng)他還需要在線下環(huán)境啟動,怎么辦?沒辦法吧?

        假設(shè)環(huán)境配置的問題能解決,等著我們還有各種依賴的問題。admin系統(tǒng)和二方包的依賴沖突了怎么辦?

        比如說:相同的配置項,不同的配置信息。在service系統(tǒng)上能兼容(畢竟代碼都在同一個工程下),但直接打成二方包就沒法跟admin系統(tǒng)兼容了。

        只能刪除沖突的部分,然后再發(fā)包了吧?但沖突是admin系統(tǒng)沖突的,跟我service系統(tǒng)的有啥關(guān)系呢?這我要做成一個完美兼容adminservice系統(tǒng)的Module嗎?老實說,不太現(xiàn)實。

        扯了一大堆,三歪最終選擇的是第一個方案。

        在初期現(xiàn)在dao層的代碼肯定是在adminservice系統(tǒng)上冗余的。service層不好抽取,但dao層還是相對好抽取的啊。

        為什么daoservice層的代碼不一樣?明明我在上面已經(jīng)講了怎么多直接抽取二方包的不可行性了。

        dao層的代碼相較于service層的代碼要簡單多了,一個合格dao層應(yīng)該是只管訪問數(shù)據(jù)庫,不應(yīng)該有dao層的代碼去調(diào)service層的代碼的。

        代碼的簡單意味著依賴會很少,比如我們的dao層就應(yīng)該只有Mybatis和Spring相關(guān)的依賴,其余的就不應(yīng)該有。而前面提到的環(huán)境配置的問題,我們可以交給業(yè)務(wù)方去實現(xiàn),不在dao層上做任何配置信息,開個hook給業(yè)務(wù)方去做。

        像三歪這種”微服務(wù)“系統(tǒng),本應(yīng)該要把dao層給抽出來。再回看我的系統(tǒng)架構(gòu)圖,可以發(fā)現(xiàn)會有幾個系統(tǒng)都需要依賴dao,如果沒有抽出來,這必會冗余,冗余的代碼意味著不好維護(hù)。

        447fb48b4b66a3682b66fb6eebc8381f.webp

        規(guī)范

        之前看不懂的阿里巴巴開發(fā)手冊,現(xiàn)在能看懂了。我建議有空的時候還是可以看看的,都說得挺有道理的。

        阿里大佬們踩了一堆坑,然后總結(jié)出來的規(guī)范。

        【強制】二方庫的新增或升級,保持除功能點之外的其它 jar 包仲裁結(jié)果不變。如果有改變,

        必須明確評估和驗證,建議進(jìn)行 dependency:resolve 前后信息比對,如果仲裁結(jié)果完全不一

        致,那么通過 dependency:tree 命令,找出差異點,進(jìn)行排除 jar 包。

        【參考】為避免應(yīng)用二方庫的依賴沖突問題,二方庫發(fā)布者應(yīng)當(dāng)遵循以下原則:

        1)精簡可控原則。移除一切不必要的 API 和依賴,只包含 Service API、必要的領(lǐng)域模型對

        象、Utils 類、常量、枚舉等。如果依賴其它二方庫,盡量是 provided 引入,讓二方庫使用

        者去依賴具體版本號;無 log 具體實現(xiàn),只依賴日志框架。

        2)穩(wěn)定可追溯原則。每個版本的變化應(yīng)該被記錄,二方庫由誰維護(hù),源碼在哪里,都需要能

        方便查到。除非用戶主動升級版本,否則公共二方庫的行為不應(yīng)該發(fā)生變化。

        ......

        三歪瞎扯

        為什么我們會用多模塊(Module)?其實就是讓我們的項目代碼變得更加清晰,像對外服務(wù)的api層就必須要抽出一個精簡Module給別人使用。

        不知道你們?nèi)绻芸赐赀@篇文章能不能有所啟發(fā),反正我已經(jīng)寫完了。如果你們感興趣的話,等我整合完這些系統(tǒng)我再來寫一篇關(guān)于這段時間的感受。

        我是三歪,一個想要變強的男人,下期見。

        各類知識點總結(jié)

        下面的文章都有對應(yīng)的原創(chuàng)精美PDF,在持續(xù)更新中,可以來找我催更~

        掃碼或者微信搜Java3y?免費領(lǐng)取原創(chuàng)思維導(dǎo)圖、精美PDF。在公眾號回復(fù)「888」領(lǐng)取,PDF內(nèi)容純手打有任何不懂歡迎來問我。


        原創(chuàng)電子書
        8a7f8b8eb24114dceea14b9f98e31d6c.webp

        原創(chuàng)思維導(dǎo)圖

        928159ba6559526f64e0812d94c1f010.webp


        c1590e0222a014f71b262eab59c4d358.webp

        8df337bd4b39a183b3d6ab1c887c4b29.webp

        8df337bd4b39a183b3d6ab1c887c4b29.webp

        瀏覽 65
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

          <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            一级a在线| AV黄色网址| 在线视频99| 亚洲欧美在线视频观看| 97人人爽人人爽人人爽| 成人毛片在线大全免费| 六月丁香久久| 亚洲永久在线| 91视频在线观看网| 国产又粗又大又爽91嫩草| 嫩草在线精品| 伊人久久大香| 成人精品影视| 午夜AV无码| 亚洲成人综合在线| 欧美日逼网站| 精品视频91| 欧美日韩v| 成人性爱在线播放| 亚洲.无码.制服.日韩.中文字幕 | 亚洲欧洲日本在线| 国产操逼网址| 大色鬼在线天堂精品| 96精品久久久久久久久久| 午夜精品成人| 色色视频免费看| 看毛片视频| 中国A级片| 2025最新偷拍| 婷婷开心色四房播播在线| 黄网国产手机在线观看| 中文字幕无码视频| 欧美,日韩,日| 久久久久99精品成人片欧美一区| 南京搡BBBB搡BBBB| 国产成人一区二区| 视频一区中文字幕| 成人做爰A片一区二区| 激情六月婷婷| 玖玖成人| 天天爱夜夜操| 国产无码电影| 一本一道久久a久久精品蜜桃| 日韩精品免费| 欧美三P囗交做爰| 看毛片的网站| 久久久久国产一区二区三区| 欧美日韩国产精品| 韩日一级片| 日韩av在线免费观看| 亚洲av免费| 玖玖在线视频| 国产操逼片| 黄色电影免费看| 日韩中文字幕在线| 日本操骚逼| 操逼三级视频| 999高清无码| 美女视频黄a视频全免费不卡| 无码免费中文字幕| 婷婷视频网站| 久草视频免费在线播放| 中文字幕免费中文| 三级无码视频在线观看| 国产在线视频第一页| 免费观看黄色在线视频| 亚洲AV无码成人H动漫| 亚洲无码av电影| 北条麻妃三区| 最近最经典中文MV字幕| 91亚洲精品国偷拍自产在线观看| 日本韩国无码视频| 一本无码视频| 久操欧美| 永久免费一区二区| 婷婷色网站| 久久国产性爱| 日本精品码喷水在线看| 色婷婷丁香五月天| 国产一级在线| 毛片A级成人片| 熊猫视频91| 91麻豆精品国产91久久久久久久久| 欧美一道本在线| 日韩无码黄色电影| 啊啊啊在线| jizz丝袜| 婷婷综合一区| 黄色视频网站在线看| 北条麻妃毛片| 精品成人一区二区三区| 日本精品在线视频| 97精品综合久久| 日本色色网| 黄色片免费观看| 操逼视频,黄色大全| 三级无码av| 久久精品视频播放| 亚洲综合中文字幕在线播放| 99热播在线| 国产1区2区3区中文字幕| 国产无码小视频| 欧美成人在线视频网站| 欧美黄色免费观看| 人人操人人干人人摸| 成人黄色A片| 日比视频| 在线中文字幕在线观看| 波多野结衣中文字幕久久| 午夜无码福利视频| 中韩日美免费看的电影| 中文一区在线| 免费看黄色一级片| 精品乱子伦一区二区三区免费播成 | 日韩精品成人| 亚洲精品中文字幕在线| 国产精品特级毛片| 一区二区三区四区在线视频| 亚洲免费小黄片| 欧一美一婬一伦一区二区三区黑人-亚 | 国产一区二区不卡亚洲涩情| 韩国一区二区三区| 97精品人妻一区二区三区在线| 国产一卡二卡在线观看| 在线视频亚洲| 亚洲天堂在线免费观看| 色色色色色欧美| 欧美激情伊人| 成人18视频| 色综合久久久| 中文电视剧字幕在线播放免费视频| 99九九久久| 一区二区无码在线| 国产操逼网站| 国产三级黄色片| 国产精品久久一区二区三区影音先锋 | 日韩操操操| 大香蕉人人| 亚洲黄色av| 中文无码日本高潮喷水| 亚洲AV无码成人精品区www| 九色PORNY国产成人| 欧美一级棒| 男人天堂2024| 女人的天堂AV| 欧美亚洲色色网视频| 日韩av电影免费在线观看| 免费一区视频| 亚洲男人天堂视频| 在线有区别亚洲| 99视频内射三四| 中国老太卖婬HD播放| 91久久精品国产91久久公交车| 五月天无码免费视频| 久久人人超碰| 爱爱视频欧美| 五月婷婷五月天| 国产激情欧洲在线观看一区二区三区 | 日韩精品成人电影| 成人黄色网| av资源播放| 一级a免一级a做免费线看内裤| 少妇推油呻吟白浆啪啪成人片| 国产无码免费在线观看| 日韩免费一级片| 亚洲无码AV麻豆| 日韩精品人妻| 天天天天天天天操| 国产原创精品| 在线观看国产黄色| 亚洲精品一区二区二区的游戏情况| 亚洲第一综合网| 国产精品99精品| 黄色电影a片| 成人影音先锋| 青娱乐AV| 亚洲插逼视频| 成功精品影院| 高潮国产视频| 18XXX亚洲HD护士JD| 成人免费区一区二区三区| 免费欧美成人网站| 六月婷婷网| 青娱乐久久| 国产AV影视| 亚洲高清无码在线观看视频| 综合伊人大香蕉| 热久久9| 人人妻人人澡人人爽人人欧美一区 | 91狠狠综| 国产人妖在线| 四虎影院人妻| 青娱乐在线精品| 无码内射在线播放| 国产精品综合激情| 午夜毛片| AV无码人妻| 亚州无码免费| 国产熟妇婬乱A片免费看牛牛| 精品内射| 欧美色逼| 日本一级黄色A片| 亚洲三级视频在线观看| 欧美偷拍| 西西午夜视频| 久操av在线| 亚洲精品97久久中文字幕| 亚洲不卡| 综合自拍偷拍| 中文字幕区| 亚洲无码在线播放| 香蕉漫画在线观看18| 五月婷婷五月丁香| 91人妻综合| 婷婷日韩中文字幕| 青草五月天| 欧美操逼电影| 高清AV在线| 久久免费精品| 亚洲视频入口| 喷水视频在线观看| 一级特黄大片录像i| 日本高清视频网站网wwwwww| 嫩BBB槡BBBB槡BBBB二一| 91在线无码精品秘国产-百度| 国产a片| 麻豆91精品91久久久停运原因| 美女91网站色| 69视频国产| 熟女导航| 深爱五月天| 俺去俺来也WWW色老板| 国产suv精品一区二区6| 丁香五月一区二区| 婷婷五月成人| 婷婷视频在线观看| 亚洲AVA| 亚洲国产另类无码| 色婷婷亚洲婷婷| 一区二区三区欧美| 日韩av在线看| 2025av在线| 日韩精品区| 日日综合网| 久久国产精品一区二区三区| 欧美人人操| 午夜av免费| yjizz视频| 日韩视频免费| 天天操天天干麻豆| 99热免费精品| 亚洲精品无码久久| 久久久久久国产免费A片| 国产精品S色| 黄色国产av| 青草午夜| 欧美亚洲国产日韩| 亚洲欧美日韩国产| 色伊人网| 亚洲操逼电影| 欧美大黑逼| 欧美性爱XXXX| 久操青青| 蜜桃av秘无码一区二区| 国产久久精品视频| 免费三级毛片| 日韩一级a片| 天天夜夜狠狠| 一区二区三区久久久久〖网:.〗 | 久草中文在线视频| 蜜臀久久久| 91精品一区| 免费高清无码视频在线观看| 午夜天堂精品久久| 日韩成人片| 亚洲日韩字幕| www欧美日韩| 影音先锋人妻资源| 亚洲尤物| 伊人99热| 国产一区二区免费在线观看 | 国产成人精品AA毛片| 麻豆精品在线播放| 一级片a片| 婷婷天堂| 欧美香蕉在线| 青娱乐自拍偷拍| 欧美自拍性爱视频| 无码中文一区| 色色欧美| 69精品免费视频| 精品日韩一区二区三区| 欧美成人毛片| 日韩無码专区| www欧美日韩| 看毛片视频| 波多野结衣一级婬片A片免费下载| 91牛| 六十路老熟女码视频| 在线看片你懂的|