面向過(guò)程(函數(shù))痒钝、面向?qū)ο蟆⒚嫦蚪涌谠位弧⒚嫦蚪M件午乓、面向服務(wù)、面向微服務(wù)闸准,這幾個(gè)詞益愈,好多人傻傻分不清楚。讓俺來(lái)回歸原教旨主義,給大家析辨析辨蒸其。正好這些階段咱都親身經(jīng)歷過(guò)敏释,沒(méi)有從90年代初期開(kāi)始編程的人,可能沒(méi)啥切膚體會(huì)到摸袁。
一钥顽、面向過(guò)程(函數(shù))
我們發(fā)現(xiàn),一個(gè)函數(shù)的輸入輸出變化了靠汁,很多關(guān)聯(lián)調(diào)用都要修改蜂大。所以我們提出面向過(guò)程(函數(shù)),好好的設(shè)計(jì)函數(shù)的輸入輸出蝶怔。
二奶浦、面向?qū)ο?/b>
我們發(fā)現(xiàn),不少函數(shù)其實(shí)是有一定組織關(guān)系的踢星,但是在面向過(guò)程(函數(shù))編程過(guò)程中澳叉,這些函數(shù)都是平行排列的,沒(méi)有顯性化組織沐悦。
所以我們發(fā)明面向?qū)ο蟪上矗粋€(gè)對(duì)象關(guān)聯(lián)的函數(shù)組織在一起,并且哪些函數(shù)是私有的藏否,哪些是公有的瓶殃,哪些是親兄弟才能半公開(kāi)調(diào)用的。
三秕岛、面向接口
我們發(fā)現(xiàn)有以下變化:
1碌燕、架構(gòu)師這一個(gè)崗位被提出來(lái)了,專(zhuān)門(mén)用于框架性代碼的設(shè)計(jì)继薛。架構(gòu)師和程序員是兩個(gè)崗位了。架構(gòu)師他們不關(guān)心具體實(shí)現(xiàn)愈捅,他們特別關(guān)心對(duì)象和對(duì)象之間的關(guān)系遏考、層與層之間的關(guān)系。這樣蓝谨,定義和實(shí)現(xiàn)要求分離灌具。
2、我們也發(fā)現(xiàn)譬巫,我和你不是一個(gè)項(xiàng)目組的咖楣,你想調(diào)用我的類(lèi),但是我不想給你這個(gè)類(lèi)的源代碼實(shí)現(xiàn)芦昔,因?yàn)槲业倪@個(gè)類(lèi)的源代碼的所有權(quán)歸我诱贿,我可能需要隨時(shí)變化它,但我和你商定好的調(diào)用接口,我們保持穩(wěn)定珠十,我只需要給你合規(guī)的輸入輸出料扰,你別管我內(nèi)部代碼怎么改。
因而焙蹭,面向接口編程出現(xiàn)了晒杈。它既是類(lèi)特征,又做到了定義和實(shí)現(xiàn)的分離孔厉。
四拯钻、面向組件
組件比對(duì)象更進(jìn)一步。這里面關(guān)鍵的差異就是:組件是有容器的撰豺,對(duì)象和類(lèi)是沒(méi)有容器的粪般。組件的生命周期是由容器來(lái)決定的,而對(duì)象郑趁,需要程序員自己管理對(duì)象的生死創(chuàng)建與回收刊驴。
顯然,組件更讓程序員省心寡润。因?yàn)閮?nèi)存管理捆憎,對(duì)于大量的程序員都是個(gè)挑戰(zhàn)。這又把編程難度拉下一個(gè)門(mén)檻梭纹。
小結(jié):這里出現(xiàn)了組件容器中間件服務(wù)器
五躲惰、面向服務(wù)
服務(wù)比接口更進(jìn)一步。
雖然組件編程已經(jīng)具備了容器化变抽,雖然面向接口編程已經(jīng)做到了定義和具體實(shí)現(xiàn)的分離础拨。
但我們還差一步,就是接口應(yīng)該和開(kāi)發(fā)語(yǔ)言無(wú)關(guān)绍载。所謂的接口诡宗,不外乎就是參數(shù)的輸入輸出。但輸入輸出是有類(lèi)型的击儡。比如說(shuō)塔沃,有的語(yǔ)言是面向?qū)ο蟮模愣x了一個(gè)輸出參數(shù)是個(gè)對(duì)象的阳谍,當(dāng)然這沒(méi)問(wèn)題蛀柴。但如果調(diào)用方是不面向?qū)ο蟮恼Z(yǔ)言,你咋辦矫夯?
這就是面向接口編程當(dāng)年留下的后遺癥鸽疾,和開(kāi)發(fā)語(yǔ)言強(qiáng)相關(guān)。
如何和開(kāi)發(fā)語(yǔ)言不強(qiáng)相關(guān)训貌,這就是面向服務(wù)要解決的制肮。
所以,面向服務(wù)在輸入輸出參數(shù)方面利用了結(jié)構(gòu)化文本這一東西,在參數(shù)傳遞方面利用了文本傳輸協(xié)議弄企。比如說(shuō):XML/JSON超燃、HTTP REST/WebService。當(dāng)然拘领,怎么傳數(shù)據(jù)也可以隨便意乓,可以用消息隊(duì)列(同步異步皆可),也可以用TCP等等约素。只不過(guò)協(xié)議需要定義好怎么建立握手届良、怎么響應(yīng)、怎么處理容錯(cuò)圣猎、怎么處理安全等等士葫,這都是需要協(xié)議定義好的。
現(xiàn)在有企業(yè)服務(wù)總線送悔,你想用啥輸入輸出表示格式都行慢显,你想用啥傳輸協(xié)議都行,根據(jù)你組件的質(zhì)量保證要求就OK欠啤。當(dāng)然荚藻,你說(shuō)你的代碼簡(jiǎn)單,不需要企業(yè)服務(wù)總線洁段,兩個(gè)組件之間通過(guò)服務(wù)直接調(diào)用了应狱,那也OK,那就不需要企業(yè)服務(wù)總線了祠丝。
小結(jié):這里出現(xiàn)了企業(yè)服務(wù)總線中間件疾呻。
六、面向微服務(wù)
我們解決了接口與開(kāi)發(fā)語(yǔ)言的無(wú)關(guān)性写半,我們的組件就可以由不同語(yǔ)言來(lái)實(shí)現(xiàn)岸蜗,而且之間能通暢調(diào)用,通過(guò)各種近程遠(yuǎn)程協(xié)議我們還能實(shí)現(xiàn)跨進(jìn)程跨服務(wù)器之間的調(diào)用叠蝇。
當(dāng)時(shí)我們這時(shí)又遇到了一個(gè)棘手問(wèn)題散吵,就是各個(gè)語(yǔ)言實(shí)現(xiàn)的組件,需要依賴(lài)的框架和庫(kù)越來(lái)越多蟆肆,而且這些框架和庫(kù)的版本還有時(shí)候打架。你經(jīng)常會(huì)發(fā)現(xiàn)晦款,你用的這個(gè)框架要依賴(lài)2.3版本炎功,另外一個(gè)東西非要依賴(lài)2.2版本(可能作者懶了不更新了)。而如果2.3和2.2之間的函數(shù)接口不一致了缓溅,而且作者也沒(méi)保證平滑升級(jí)蛇损,那就不能升級(jí)統(tǒng)一版本。
咋辦?為了防止版本打架淤齐,只能把這些組件隔離開(kāi)股囊。幸好現(xiàn)在出現(xiàn)了Docker技術(shù),可以在一臺(tái)物理機(jī)上不用安裝N個(gè)笨重的虛擬機(jī)(虛擬機(jī)要操作系統(tǒng)一堆東西)更啄,只需要安裝好Docker稚疹,組件以及組件關(guān)聯(lián)的各種框架類(lèi)庫(kù)就被隔離開(kāi)了。
小結(jié):這里出現(xiàn)了Docker容器中間件祭务。