面向過程(函數(shù))、面向?qū)ο?、面向接口、面向組件、面向服務(wù)、面向微服務(wù),這幾個(gè)詞,好多人傻傻分不清楚。讓俺來(lái)回歸原教旨主義,給大家析辨析辨。正好這些階段咱都親身經(jīng)歷過,沒有從90年代初期開始編程的人,可能沒啥切膚體會(huì)到。
一、面向過程(函數(shù))
我們發(fā)現(xiàn),一個(gè)函數(shù)的輸入輸出變化了,很多關(guān)聯(lián)調(diào)用都要修改。所以我們提出面向過程(函數(shù)),好好的設(shè)計(jì)函數(shù)的輸入輸出。
二、面向?qū)ο?/b>
我們發(fā)現(xiàn),不少函數(shù)其實(shí)是有一定組織關(guān)系的,但是在面向過程(函數(shù))編程過程中,這些函數(shù)都是平行排列的,沒有顯性化組織。
所以我們發(fā)明面向?qū)ο?,同一個(gè)對(duì)象關(guān)聯(lián)的函數(shù)組織在一起,并且哪些函數(shù)是私有的,哪些是公有的,哪些是親兄弟才能半公開調(diào)用的。
三、面向接口
我們發(fā)現(xiàn)有以下變化:
1、架構(gòu)師這一個(gè)崗位被提出來(lái)了,專門用于框架性代碼的設(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)用我的類,但是我不想給你這個(gè)類的源代碼實(shí)現(xiàn),因?yàn)槲业倪@個(gè)類的源代碼的所有權(quán)歸我,我可能需要隨時(shí)變化它,但我和你商定好的調(diào)用接口,我們保持穩(wěn)定,我只需要給你合規(guī)的輸入輸出,你別管我內(nèi)部代碼怎么改。
因而,面向接口編程出現(xiàn)了。它既是類特征,又做到了定義和實(shí)現(xiàn)的分離。
四、面向組件
組件比對(duì)象更進(jìn)一步。這里面關(guān)鍵的差異就是:組件是有容器的,對(duì)象和類是沒有容器的。組件的生命周期是由容器來(lái)決定的,而對(duì)象,需要程序員自己管理對(duì)象的生死創(chuàng)建與回收。
顯然,組件更讓程序員省心。因?yàn)閮?nèi)存管理,對(duì)于大量的程序員都是個(gè)挑戰(zhàn)。這又把編程難度拉下一個(gè)門檻。
小結(jié):這里出現(xiàn)了組件容器中間件服務(wù)器
五、面向服務(wù)
服務(wù)比接口更進(jìn)一步。
雖然組件編程已經(jīng)具備了容器化,雖然面向接口編程已經(jīng)做到了定義和具體實(shí)現(xiàn)的分離。
但我們還差一步,就是接口應(yīng)該和開發(fā)語(yǔ)言無(wú)關(guān)。所謂的接口,不外乎就是參數(shù)的輸入輸出。但輸入輸出是有類型的。比如說,有的語(yǔ)言是面向?qū)ο蟮?,你定義了一個(gè)輸出參數(shù)是個(gè)對(duì)象的,當(dāng)然這沒問題。但如果調(diào)用方是不面向?qū)ο蟮恼Z(yǔ)言,你咋辦?
這就是面向接口編程當(dāng)年留下的后遺癥,和開發(fā)語(yǔ)言強(qiáng)相關(guān)。
如何和開發(fā)語(yǔ)言不強(qiáng)相關(guān),這就是面向服務(wù)要解決的。
所以,面向服務(wù)在輸入輸出參數(shù)方面利用了結(jié)構(gòu)化文本這一東西,在參數(shù)傳遞方面利用了文本傳輸協(xié)議。比如說:XML/JSON、HTTP REST/WebService。當(dāng)然,怎么傳數(shù)據(jù)也可以隨便,可以用消息隊(duì)列(同步異步皆可),也可以用TCP等等。只不過協(xié)議需要定義好怎么建立握手、怎么響應(yīng)、怎么處理容錯(cuò)、怎么處理安全等等,這都是需要協(xié)議定義好的。
現(xiàn)在有企業(yè)服務(wù)總線,你想用啥輸入輸出表示格式都行,你想用啥傳輸協(xié)議都行,根據(jù)你組件的質(zhì)量保證要求就OK。當(dāng)然,你說你的代碼簡(jiǎn)單,不需要企業(yè)服務(wù)總線,兩個(gè)組件之間通過服務(wù)直接調(diào)用了,那也OK,那就不需要企業(yè)服務(wù)總線了。
小結(jié):這里出現(xiàn)了企業(yè)服務(wù)總線中間件。
六、面向微服務(wù)
我們解決了接口與開發(fā)語(yǔ)言的無(wú)關(guān)性,我們的組件就可以由不同語(yǔ)言來(lái)實(shí)現(xiàn),而且之間能通暢調(diào)用,通過各種近程遠(yuǎn)程協(xié)議我們還能實(shí)現(xiàn)跨進(jìn)程跨服務(wù)器之間的調(diào)用。
當(dāng)時(shí)我們這時(shí)又遇到了一個(gè)棘手問題,就是各個(gè)語(yǔ)言實(shí)現(xiàn)的組件,需要依賴的框架和庫(kù)越來(lái)越多,而且這些框架和庫(kù)的版本還有時(shí)候打架。你經(jīng)常會(huì)發(fā)現(xiàn),你用的這個(gè)框架要依賴2.3版本,另外一個(gè)東西非要依賴2.2版本(可能作者懶了不更新了)。而如果2.3和2.2之間的函數(shù)接口不一致了,而且作者也沒保證平滑升級(jí),那就不能升級(jí)統(tǒng)一版本。
咋辦?為了防止版本打架,只能把這些組件隔離開。幸好現(xiàn)在出現(xiàn)了Docker技術(shù),可以在一臺(tái)物理機(jī)上不用安裝N個(gè)笨重的虛擬機(jī)(虛擬機(jī)要操作系統(tǒng)一堆東西),只需要安裝好Docker,組件以及組件關(guān)聯(lián)的各種框架類庫(kù)就被隔離開了。
小結(jié):這里出現(xiàn)了Docker容器中間件。