十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶(hù) + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂(yōu)售后,網(wǎng)站問(wèn)題一站解決
我們?cè)陂_(kāi)發(fā)軟件的時(shí)候,為了能夠更有效的進(jìn)行系統(tǒng)架構(gòu),一般會(huì)使用分層架構(gòu)的形式來(lái)進(jìn)行搭建。
成都創(chuàng)新互聯(lián)公司專(zhuān)注于色尼企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計(jì),商城網(wǎng)站定制開(kāi)發(fā)。色尼網(wǎng)站建設(shè)公司,為色尼等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站策劃,專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)公司專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)
下面江蘇電腦培訓(xùn)就一起來(lái)了解一下關(guān)于分層架構(gòu)的優(yōu)缺點(diǎn)都有哪些。
什么是分層架構(gòu)?分層架構(gòu)是將軟件模塊按照水平切分的方式分成多個(gè)層。
一個(gè)系統(tǒng)由多層組成,每層由多個(gè)模塊組成。
那么到底分幾層合適?我認(rèn)為根據(jù)不同的復(fù)雜度分成不同的層次,基本的是分層架構(gòu)是三層,即表現(xiàn)層,領(lǐng)域?qū)雍蛿?shù)據(jù)持久層。
而《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》EricEvans建議分四層分別是表現(xiàn)層,應(yīng)用層、領(lǐng)域?qū)雍突A(chǔ)層,業(yè)務(wù)邏輯在領(lǐng)域?qū)?,基礎(chǔ)層比持久層的范圍更大,不僅可以提供持久層服務(wù),還可以提供緩存等服務(wù)。
四層中的應(yīng)用層是對(duì)三層架構(gòu)中領(lǐng)域?qū)舆M(jìn)行進(jìn)一步拆分。
但是無(wú)論怎么分層,業(yè)務(wù)邏輯永遠(yuǎn)在領(lǐng)域?qū)印?/p>
分層架構(gòu)的好處分層架構(gòu)的目的是通過(guò)關(guān)注點(diǎn)分離來(lái)降低系統(tǒng)的復(fù)雜度,同時(shí)滿(mǎn)足單一職責(zé)、高內(nèi)聚、低耦合、提高可復(fù)用性和降低維護(hù)成本。
單一職責(zé):每一層只負(fù)責(zé)一個(gè)職責(zé),職責(zé)邊界清晰,如持久層只負(fù)責(zé)數(shù)據(jù)查詢(xún)和存儲(chǔ),領(lǐng)域?qū)又回?fù)責(zé)處理業(yè)務(wù)邏輯。
高內(nèi)聚:分層是把相同的職責(zé)放在同一個(gè)層中,所有業(yè)務(wù)邏輯內(nèi)聚在領(lǐng)域?qū)印?/p>
這樣做有什么好處呢?試想一下假如業(yè)務(wù)邏輯分散在每一層,修改功能需要去各層修改,測(cè)試業(yè)務(wù)邏輯需要測(cè)試所有層的代碼,這樣增加了整個(gè)軟件的復(fù)雜度和測(cè)試難度。
低耦合:依賴(lài)關(guān)系非常簡(jiǎn)單,上層只能依賴(lài)于下層,沒(méi)有循環(huán)依賴(lài)。
可復(fù)用:某項(xiàng)能力可以復(fù)用給多個(gè)業(yè)務(wù)流程。
比如持久層提供按照還款狀態(tài)查詢(xún)信用卡的服務(wù),既可以給申請(qǐng)信用卡做判斷使用,也可以給展示未還款信用卡使用。
易維護(hù):面對(duì)變更容易修改。
把所有對(duì)外接口都放在對(duì)外接口層,一旦外部依賴(lài)的接口被修改,只需要改這個(gè)層的代碼即可。
以上這些既是分層的好處也是分層的原則,大家在分層時(shí)需要遵循以上原則,不恰當(dāng)?shù)姆謱訒?huì)違背了分層架構(gòu)的初衷。
分層架構(gòu)的缺點(diǎn)分層架構(gòu)也有幾個(gè)缺點(diǎn)開(kāi)發(fā)成本高:因?yàn)槎鄬臃謩e承擔(dān)各自的職責(zé),增加功能需要在多個(gè)層增加代碼,這樣難免會(huì)增加開(kāi)發(fā)成本。
但是合理的能力抽象可以提高了復(fù)用性,又能降低開(kāi)發(fā)成本。
性能略低:業(yè)務(wù)流需要經(jīng)過(guò)多層代碼的處理,性能會(huì)有所消耗。
可擴(kuò)展性低:因?yàn)樯舷聦又g存在耦合度,所有有些功能變化可能涉及到多層的修改。
分層的好處就在于代碼清晰,結(jié)構(gòu)分明,有利于修改和維護(hù)。增加代碼的可讀性。我6層的都用過(guò)。
java的某些項(xiàng)目為什么要采用分布式開(kāi)發(fā),分布式開(kāi)發(fā)
在數(shù)據(jù)庫(kù)應(yīng)用程序的開(kāi)發(fā)過(guò)程中,網(wǎng)絡(luò)已走到社會(huì)的各個(gè)角落。從金融行業(yè)的銀行聯(lián)網(wǎng)、交通行業(yè)的售票系統(tǒng)、公安系統(tǒng)的全國(guó)戶(hù)籍管理等等,這些企業(yè)或行業(yè)單位之間地理分布性或業(yè)務(wù)分布性,使得一個(gè)企業(yè)或行業(yè)擁有多個(gè)網(wǎng)絡(luò)服務(wù)器,如何在這種分布式的網(wǎng)絡(luò)環(huán)境下實(shí)現(xiàn)高效的數(shù)據(jù)庫(kù)應(yīng)用程序的開(kāi)發(fā)是一個(gè)重要的問(wèn)題。
分布式應(yīng)用開(kāi)發(fā)簡(jiǎn)單的說(shuō),是指將用戶(hù)界面、控制臺(tái)服務(wù)、數(shù)據(jù)庫(kù)管理三個(gè)層次部署在不同的位置上。其中用戶(hù)界面是客戶(hù)端實(shí)現(xiàn)的功能,控制臺(tái)服務(wù)是一個(gè)專(zhuān)門(mén)的服務(wù)器,數(shù)據(jù)管理是在一個(gè)專(zhuān)門(mén)的數(shù)據(jù)庫(kù)服務(wù)器上實(shí)現(xiàn)的。
提示:這里的Web服務(wù)器,都是指軟件(如IIS等Web服務(wù)器軟件),它和Web服務(wù)器應(yīng)用以及其它程序等,共同存在于服務(wù)器計(jì)算機(jī)上。
控制臺(tái)CGI應(yīng)用:是一個(gè)獨(dú)立的控制臺(tái)EXE。它在一個(gè)標(biāo)準(zhǔn)輸入設(shè)備上接收客戶(hù)端的請(qǐng)求信息,在標(biāo)準(zhǔn)輸出設(shè)備上將結(jié)果返回給服務(wù)器。
分布式數(shù)據(jù)庫(kù)系統(tǒng)已經(jīng)成為信息處理學(xué)科的重要領(lǐng)域,正在迅速發(fā)展之中,原因是什么?
1、它可以解決組織機(jī)構(gòu)分散而數(shù)據(jù)需要相互聯(lián)系的問(wèn)題。比如銀行系統(tǒng),總行與各分行處于不同的城市或城市中的各個(gè)地區(qū),在業(yè)務(wù)上它們需要處理各自的數(shù)據(jù),也需要彼此之間的交換和處理,這就需要分布式的系統(tǒng)。
2、如果一個(gè)組織機(jī)構(gòu)需要增加新的相對(duì)自主的組織單位來(lái)擴(kuò)充機(jī)構(gòu),則分布式數(shù)據(jù)庫(kù)系統(tǒng)可以在對(duì)當(dāng)前機(jī)構(gòu)影響最小的情況下進(jìn)行擴(kuò)充。
3、均衡負(fù)載的需要。數(shù)據(jù)的分解采用使局部應(yīng)用達(dá)到最大,這使得各處理機(jī)之間的相互干擾降到最低。負(fù)載在各處理機(jī)之間分擔(dān),可以避免臨界瓶頸。
4、當(dāng)現(xiàn)有機(jī)構(gòu)中已存在幾個(gè)數(shù)據(jù)庫(kù)系統(tǒng),而且實(shí)現(xiàn)全局應(yīng)用的必要性增加時(shí),就可以由這些數(shù)據(jù)庫(kù)自下而上構(gòu)成分布式數(shù)據(jù)庫(kù)系統(tǒng)。
5、相等規(guī)模的分布式數(shù)據(jù)庫(kù)系統(tǒng)在出現(xiàn)故障的幾率上不會(huì)比集中式數(shù)據(jù)庫(kù)系統(tǒng)低,但由于其故障的影響僅限于局部數(shù)據(jù)應(yīng)用,因此就整個(gè)系統(tǒng)來(lái)講它的可靠性是比較高的。
在進(jìn)行軟件開(kāi)發(fā)過(guò)程中,為了能夠更有效的執(zhí)行系統(tǒng)架構(gòu),一般情況下需要進(jìn)行分層結(jié)構(gòu)的形式來(lái)構(gòu)成。
那么在使用分層架構(gòu)的過(guò)程中有哪些優(yōu)缺點(diǎn)呢?下面電腦培訓(xùn)為大家具體介紹。
一、什么是分層架構(gòu)分層體系結(jié)構(gòu)主要是根據(jù)水平分割將軟件模塊劃分為多個(gè)層次。
系統(tǒng)由多層組成,每一層由多個(gè)模塊組成。
那么多少層才是合適的呢?IT培訓(xùn)認(rèn)為,根據(jù)不同的復(fù)雜性分為不同的層次,基本的層次結(jié)構(gòu)是三個(gè)層次,即表示層、域?qū)雍蛿?shù)據(jù)持久層。
二、分層架構(gòu)的好處1、單一職責(zé):每層只負(fù)責(zé)一個(gè)角色,責(zé)任邊界清晰。
如果持久層只負(fù)責(zé)數(shù)據(jù)查詢(xún)和存儲(chǔ),則字段級(jí)別僅負(fù)責(zé)處理業(yè)務(wù)邏輯。
2、高內(nèi)聚:分層是在相同的層中放置相同的責(zé)任,并且所有業(yè)務(wù)邏輯在領(lǐng)域?qū)又卸际且恢碌摹?/p>
做這個(gè)的好處是什么?貴陽(yáng)北大青鳥(niǎo)設(shè)想如果業(yè)務(wù)邏輯分散在每層上,則修改功能需要修改為各層,測(cè)試業(yè)務(wù)邏輯需要測(cè)試所有層的代碼,從而增加了整個(gè)軟件的復(fù)雜度和測(cè)試難度。
3、易維護(hù)將面對(duì)變更且容易修正的所有對(duì)外界面放入對(duì)外界面層中,如果外部依存的界面被修改的話(huà),只要變更該層的代碼即可。
三、分層架構(gòu)的缺點(diǎn)1、開(kāi)發(fā)成本高由于多層承擔(dān)著各自的任務(wù),因此需要在多個(gè)級(jí)別上追加代碼,以添加功能。
這樣,開(kāi)發(fā)成本就會(huì)增加。
但是,北大青鳥(niǎo)認(rèn)為合理的能力抽象化可以提高多重性,降低開(kāi)發(fā)成本。
2、可擴(kuò)展性低:由于在上下層之間存在結(jié)合度,所以所有的功能變化都有可能參與多層的修正。
分層就是把代碼按照邏輯,分成多個(gè)不同的層次。
分層的目的是讓結(jié)構(gòu)更清晰,代碼編寫(xiě)的時(shí)候也更好管理。
比如三層的MVC,分為model業(yè)務(wù)層,view展示層,control控制層。
更個(gè)部分的代碼相對(duì)獨(dú)立,層次的關(guān)系也很明了。有的會(huì)把model層再細(xì)分。。。
代碼詳解就算了吧。
你了解這個(gè)還是通過(guò)項(xiàng)目了解的好,這種分層思想也是從實(shí)際工作中總結(jié)出來(lái)的。不是憑空想象的、。
首先讓我們坐著時(shí)光機(jī)回到n年前的web開(kāi)發(fā)。
那個(gè)時(shí)候最早都是靜態(tài)的html頁(yè)面,后來(lái)有了數(shù)據(jù)庫(kù),有了所謂的動(dòng)態(tài)頁(yè)面,
然后程序猿在編碼的時(shí)候,會(huì)把所有的代碼都寫(xiě)在頁(yè)面上,包括數(shù)據(jù)庫(kù)連接,包括事務(wù)控制,接收參數(shù),各種校驗(yàn),各種邏輯,各種html/js/css代碼等等
怎么樣?夠亂吧?像一坨那什么一樣,這個(gè)頁(yè)面可能有成千上萬(wàn)行?
那么好,問(wèn)題來(lái)了,回頭需要修改的時(shí)候,你怎么辦?
你找個(gè)東西找半天,好不容易找到了,還不敢改,怕被其他地方用了,改出連帶問(wèn)題。
頁(yè)面一出錯(cuò),定位不準(zhǔn)到底是哪里的問(wèn)題,從頭到尾的挨個(gè)排查。
等等等等。
這就是大家常說(shuō)的什么叫可維護(hù)性,這也是為什么越來(lái)越多的公司的規(guī)范要求不能寫(xiě)復(fù)雜sql。
還記得之前在東軟的時(shí)候,一哥們寫(xiě)了一個(gè)80多行的大sql來(lái)完成一個(gè)核心的查詢(xún)。
試問(wèn)這個(gè)大sql天天在數(shù)據(jù)庫(kù)里run,還有性能可言?
再試問(wèn)誰(shuí)敢改?
后來(lái)項(xiàng)目要改需求還是出現(xiàn)bug了,那個(gè)sql要改動(dòng),寫(xiě)sql的哥們改了好久才改好,因?yàn)闀r(shí)間長(zhǎng)他也忘了,
再后來(lái)他離職了。。。
有人問(wèn),那簡(jiǎn)單sql實(shí)現(xiàn)不了我的功能呀,怎么辦?
從數(shù)據(jù)庫(kù)設(shè)計(jì)層面開(kāi)始下手,要允許適當(dāng)?shù)娜哂啵驯砼?,就迎刃而解了,這也是數(shù)據(jù)庫(kù)層面的一種解耦吧。
后來(lái)。。。
進(jìn)入第二階段,大家痛定思痛,決定要把頁(yè)面和邏輯拆開(kāi),頁(yè)面只是負(fù)責(zé)顯示,邏輯都在后臺(tái)。
這就出現(xiàn)了短暫的,在jsp里使用標(biāo)簽調(diào)用bean的用法。bean里耦合了除了頁(yè)面之外的所有東西。
再后來(lái)。。。
進(jìn)入了第三階段,大家又痛定思痛,決定要拆成三部分,就是大名鼎鼎的MVC。
再再后來(lái)。。。
衍生出來(lái)了類(lèi)似于struts/springmvc等等的mvc框架
---------------
JavaWeb項(xiàng)目的層有2個(gè)維度。
第一個(gè)維度是MVC的三層:
M:model,模型層,包括了你的業(yè)務(wù)邏輯和數(shù)據(jù)庫(kù)操作,封裝好給視圖層使用的。
V:view,視圖層,僅僅做的是展示數(shù)據(jù),不包含業(yè)務(wù)邏輯,主要是jsp/html等等
C:controller,控制層,負(fù)責(zé)接收請(qǐng)求,調(diào)用模型層處理業(yè)務(wù)邏輯并返回給視圖層。
第二個(gè)維度是java代碼里的三層:
controller:控制層,負(fù)責(zé)接收參數(shù)/解析參數(shù)/封裝參數(shù),調(diào)用serivce,將service方法的返回值進(jìn)行封裝(如果需要),返回?cái)?shù)據(jù)/返回頁(yè)面,路由。
service:負(fù)責(zé)業(yè)務(wù)邏輯,事務(wù)控制在這層里做,被controller調(diào)用,以及調(diào)用dao。
dao:持久層,負(fù)責(zé)數(shù)據(jù)庫(kù)交互,被service調(diào)用。
這2個(gè)維度別弄混了喲。我今天主要說(shuō)的是第二個(gè)維度的層喲。
我認(rèn)為,第二個(gè)維度是第一個(gè)維度的延伸,其實(shí)第二個(gè)維度再加上一個(gè)表現(xiàn)層就完美了,這就為什么有人說(shuō)是4層架構(gòu)。
---------------
前戲結(jié)束,步入正題:
有些學(xué)生朋友可能會(huì)問(wèn)為什么要分層呢?我本來(lái)可以在一個(gè)地方寫(xiě)完的東西,非要散落在各個(gè)層中,都在一起不是挺好的嗎?
開(kāi)發(fā)效率高呀~
跳來(lái)跳去的我腦子都暈啦。。。
這就是為什么有人會(huì)把所有的東西都扔在一個(gè)層里,比如controller層。。。
其實(shí)我們可以在jsp上把所有的邏輯以及數(shù)據(jù)庫(kù)操作,數(shù)據(jù)展示全部寫(xiě)在一起,耦合在一起,這樣開(kāi)發(fā)起來(lái)貌似更快,
但是維護(hù)性非常差,有朝一日想改一個(gè)小地方,牽一發(fā)而動(dòng)全一身,隱患很高,無(wú)法快速定位問(wèn)題。
因此我們需要分層。
分層了之后,你理論上改了持久層的東西,邏輯層是不用變動(dòng)的。
每個(gè)Dao類(lèi)是跟每個(gè)表走,Dao的每個(gè)方法里就一個(gè)個(gè)的簡(jiǎn)單sql,不包含任何業(yè)務(wù)邏輯,可以被不同的service復(fù)用和調(diào)用。
經(jīng)過(guò)抽象后基本上都是通用的,因而我們?cè)诙xDAO層的時(shí)候可以將相關(guān)的方法定義完畢,
這樣的好處是在對(duì)Service進(jìn)行擴(kuò)展的時(shí)候不需要再對(duì)DAO層進(jìn)行修改,提高了程序的可擴(kuò)展性。
提高了程序的可擴(kuò)展性。具體什么時(shí)候做這些操作,怎么做這些操作都由Service來(lái)處理。
(就像郭德綱的相聲里的一句話(huà):“行了,你甭管了”)
而Service則不是,一個(gè)Service里可以會(huì)調(diào)用多個(gè)不同的dao,完成特定的業(yè)務(wù)邏輯,事務(wù)控制,
封裝Service層的業(yè)務(wù)邏輯有利于通用的業(yè)務(wù)邏輯的獨(dú)立性和重復(fù)利用性
同時(shí),一個(gè)Service的方法也有可能被多個(gè)Controller的方法來(lái)調(diào)用。
邏輯出問(wèn)題就在Service找問(wèn)題,數(shù)據(jù)庫(kù),sql有問(wèn)題就在Dao層找問(wèn)題,
參數(shù)解析錯(cuò)誤,跳轉(zhuǎn)錯(cuò)誤,就在Controller上找問(wèn)題。
這樣快速定位問(wèn)題,互不干擾。
---------------
分層架構(gòu)(這里會(huì)延伸到更廣闊的架構(gòu)):
回頭項(xiàng)目玩大了,怎么辦?拆?。?!
具體可以搜一下:maven分模塊開(kāi)發(fā),怎么玩代碼依賴(lài),怎么玩微服務(wù),怎么玩SOA,怎么玩RPC,怎么玩dubbo。
web項(xiàng)目發(fā)展有幾個(gè)階段啊
第一個(gè)階段(單一應(yīng)用架構(gòu)):
所有代碼都耦合在一個(gè)項(xiàng)目里,放在一臺(tái)服務(wù)器上,這種all in one的方式是有好處的。
創(chuàng)業(yè)初期,不用什么架構(gòu),走敏捷開(kāi)發(fā),最快速的實(shí)現(xiàn)需求才是王道。
你甭管我有多爛,我至少能跑起來(lái),我至少能在外網(wǎng)上讓你訪(fǎng)問(wèn),讓你使用。
當(dāng)然了,初期的訪(fǎng)問(wèn)量很少,節(jié)省部署和運(yùn)維成本才是王道呀。
聽(tīng)阿里的講座,說(shuō)淘寶的前期的版本用的就是一臺(tái)PC機(jī)作為服務(wù)器,所有的功能耦合在一個(gè)項(xiàng)目里,
每次往生產(chǎn)環(huán)境上發(fā)版本,要上傳一個(gè)600mb的包,呵呵。
第二個(gè)階段(垂直應(yīng)用架構(gòu)):
哎喲,不錯(cuò)哦。自己的兒子被越來(lái)越多的人訪(fǎng)問(wèn),訪(fǎng)問(wèn)量激增,一臺(tái)服務(wù)器扛不住了,
沒(méi)事,我們可以玩負(fù)載均衡,玩集群。
但是!這種性能加速度其實(shí)會(huì)變得越來(lái)越小,因?yàn)槟愕捻?xiàng)目是耦合在一起的。
這時(shí),我們需要拆分項(xiàng)目,這里又有2個(gè)維度,按層拆,按模塊拆。
將拆好的不同項(xiàng)目分別部署在不同的服務(wù)器上,并且再分不同的小集群。
第三個(gè)階段(分布式服務(wù)架構(gòu)):
唉呀媽呀,訪(fǎng)問(wèn)量陡增,到這步你創(chuàng)業(yè)應(yīng)該算成功了,開(kāi)始燒投資人的錢(qián)了吧。
經(jīng)過(guò)上面拆成了越來(lái)越多的模塊,模塊與模塊交互越來(lái)越多,怎么辦?
這個(gè)時(shí)候我們需要把核心的業(yè)務(wù)抽出來(lái),作為獨(dú)立的服務(wù),慢慢發(fā)展成穩(wěn)定的服務(wù)中心,
用來(lái)提升業(yè)務(wù)復(fù)用和整合。
就像阿里的大牛說(shuō)過(guò),沒(méi)有淘寶的積累,天貓能那么快的出來(lái)嗎?
這個(gè)時(shí)候,你的緩存,數(shù)據(jù)庫(kù),消息隊(duì)列等服務(wù)都應(yīng)該是分布式的。
第四個(gè)階段(流動(dòng)計(jì)算架構(gòu))
哎呀媽呀,訪(fǎng)問(wèn)量又上了一個(gè)臺(tái)階,翻了好幾百倍吖,腫么辦?
這個(gè)時(shí)候服務(wù)越來(lái)越多,一些容量和資源的浪費(fèi)問(wèn)題凸顯出來(lái),
這時(shí)我們需要一個(gè)調(diào)度中心來(lái)基于訪(fǎng)問(wèn)壓力動(dòng)態(tài)的管理集群容量,
提高利用率。
第五個(gè)階段(云計(jì)算架構(gòu))
抱歉,作者正在學(xué)習(xí)中,未完待續(xù)。