簡單介紹一下什么是microservice微服務(wù)
微服務(wù)(microservice)是一種軟件架構(gòu),正得到越來越多的關(guān)注。
但是,它到底是什么意思?什么樣的架構(gòu)可以叫做微服務(wù)?
網(wǎng)上的文章雖然很多,但是都太復(fù)雜,初學(xué)者不容易看懂。我認(rèn)為,這個(gè)概念其實(shí)非常簡單,可以很通俗地說明白。
一、單體軟件
要理解微服務(wù),首先需要理解軟件架構(gòu)的演變。
早期的軟件,所有功能都寫在一起,這稱為單體架構(gòu)(monolithic software)。
整個(gè)軟件就是單一的整體,彷佛一體化的機(jī)器。
可以想到,軟件的功能越多,單體架構(gòu)就會越復(fù)雜,很多缺點(diǎn)也隨之暴露出來。
(1)所有功能耦合在一起,互相影響,最終難以管理。
(2)哪怕只修改一行代碼,整個(gè)軟件就要重新構(gòu)建和部署,成本非常高。
(3)因?yàn)檐浖龀闪艘粋€(gè)整體,不可能每個(gè)功能單獨(dú)開發(fā)和測試,只能整體開發(fā)和測試,導(dǎo)致必須采用瀑布式開發(fā)模型。
以上三個(gè)原因的詳細(xì)分析,可以參考我以前的文章《軟件工程的最大難題》。
總之,單體架構(gòu)的大型軟件,不僅開發(fā)速度慢,而且會形成難以維護(hù)和升級的復(fù)雜代碼,成為程序員的沉重負(fù)擔(dān)。
二、面向服務(wù)架構(gòu)
為了解決上面這些問題,很早就有人提出來,必須打破代碼的耦合,拆分單體架構(gòu),將軟件拆分成一個(gè)個(gè)獨(dú)立的功能單元。
大概在20多年前,隨著互聯(lián)網(wǎng)的出現(xiàn),功能單元可以用遠(yuǎn)程“服務(wù)”的形式提供,就誕生出了“面向服務(wù)架構(gòu)”(service-oriented architecture,簡稱 SOA)。
所謂服務(wù)(service),就是在后臺不間斷運(yùn)行、提供某種功能的一個(gè)程序。最常見的服務(wù)就是 Web 服務(wù),通過80端口向外界提供網(wǎng)頁訪問。
“面向服務(wù)架構(gòu)”就是把一個(gè)大型的單體程序,拆分成一個(gè)個(gè)獨(dú)立服務(wù),也就是較小的程序。每個(gè)服務(wù)都是一個(gè)獨(dú)立的功能單元,承擔(dān)不同的功能,服務(wù)之間通過通信協(xié)議連在一起。
這種架構(gòu)有很多優(yōu)點(diǎn)。
(1)每種服務(wù)功能單一,相當(dāng)于一個(gè)小型軟件,便于開發(fā)和測試。
(2)各個(gè)服務(wù)獨(dú)立運(yùn)行,簡化了架構(gòu),提高了可靠性。
(3)鼓勵(lì)和支持代碼重用,同一個(gè)服務(wù)可以用于多種目的。
(4)不同服務(wù)可以單獨(dú)開發(fā)和部署,便于升級。
(5)擴(kuò)展性好,可以容易地加機(jī)器、加功能,承受高負(fù)載。
(6)不容易出現(xiàn)單點(diǎn)故障。即使一個(gè)服務(wù)失敗了,不會影響到其他服務(wù)。
跟單體架構(gòu)不一樣,面向服務(wù)架構(gòu)是語言不敏感的,不同服務(wù)可以使用不同的語言和工具開發(fā),可能需要部署在不同的系統(tǒng)和環(huán)境。
這意味著,面向服務(wù)架構(gòu)默認(rèn)運(yùn)行在不同服務(wù)器上,每臺服務(wù)器提供一種服務(wù),多臺服務(wù)器共同組成一個(gè)完整的網(wǎng)絡(luò)應(yīng)用。
三、微服務(wù)
2014年,Docker[1] 出現(xiàn)了,徹底改變了軟件開發(fā)的面貌。它讓程序運(yùn)行在容器中,每個(gè)容器可以分別設(shè)定運(yùn)行環(huán)境,并且只占用很少的系統(tǒng)資源。
顯而易見,可以用容器來實(shí)現(xiàn)“面向服務(wù)架構(gòu)”,每個(gè)服務(wù)不再占用一臺服務(wù)器,而是占用一個(gè)容器。
這樣就不需要多臺服務(wù)器了,最簡單的情況下,本機(jī)運(yùn)行多個(gè)容器,只用一臺服務(wù)器就實(shí)現(xiàn)了面向服務(wù)架構(gòu),這在以前是做不到的。這種實(shí)現(xiàn)方式就叫做微服務(wù)。
簡單說,微服務(wù)就是采用容器技術(shù)的面向服務(wù)架構(gòu)。它依然使用“服務(wù)”作為功能單元,但是變成了輕量級實(shí)現(xiàn),不需要新增服務(wù)器,只需要新建容器(一個(gè)進(jìn)程),所以才叫做“微服務(wù)”。
一個(gè)微服務(wù)就是一個(gè)獨(dú)立的進(jìn)程[2]。 這個(gè)進(jìn)程可以運(yùn)行在本機(jī),也可以運(yùn)行在別的服務(wù)器,或者在云端(比如云服務(wù)和云函數(shù) FaaS)。
它的特點(diǎn)與面向服務(wù)架構(gòu)是一樣的,但因?yàn)楦p量級,所以功能的解耦和服務(wù)化可以做得更徹底。而且,它可以標(biāo)準(zhǔn)化,同樣的容器不管在哪里運(yùn)行,結(jié)果都是一樣的,所以市場上有很多 SaaS 產(chǎn)品,提供標(biāo)準(zhǔn)化的微服務(wù)。
正是由于微服務(wù)這些突出的優(yōu)點(diǎn),這幾年才會變得如此流行。它和容器技術(shù)、云服務(wù)一起,一定會在未來的軟件開發(fā)中,扮演越來越重要的角色。
References
[1]
Docker: https://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html[2]
進(jìn)程: https://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
到此這篇關(guān)于簡單介紹一下什么是microservice微服務(wù)的文章就介紹到這了,更多相關(guān)microservice微服務(wù)的定義內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 微服務(wù)Spring Boot 整合 Redis 實(shí)現(xiàn)UV 數(shù)據(jù)統(tǒng)計(jì)的詳細(xì)過程
- go微服務(wù)PolarisMesh源碼解析服務(wù)端啟動流程
- Java Feign微服務(wù)接口調(diào)用方法詳細(xì)講解
- SpringCloud微服務(wù)中跨域配置的方法詳解
- Java微服務(wù)Nacos Config配置中心超詳細(xì)講解
- Java微服務(wù)分布式調(diào)度Elastic-job環(huán)境搭建及配置
- Java微服務(wù)Filter過濾器集成Sentinel實(shí)現(xiàn)網(wǎng)關(guān)限流過程詳解
- 微服務(wù)鏈路追蹤Spring Cloud Sleuth整合Zipkin解析
- 基于jib-maven-plugin插件快速構(gòu)建微服務(wù)docker鏡像的方法
- 簡單介紹一下什么是microservice微服務(wù)
相關(guān)文章
SpringBoot前后端分離項(xiàng)目之打包、部署到服務(wù)器詳細(xì)圖文流程
作為后臺開發(fā),項(xiàng)目打包部署是經(jīng)常性的操作,下面這篇文章主要給大家介紹了關(guān)于SpringBoot前后端分離項(xiàng)目之打包、部署到服務(wù)器的相關(guān)資料,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12Java System類兩個(gè)常用方法代碼實(shí)例
這篇文章主要介紹了Java System類兩個(gè)常用方法代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02web中拖拽排序和java后臺交互實(shí)現(xiàn)方法示例
這篇文章主要給大家介紹了關(guān)于web中拖拽排序和java后臺交互實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12Java動態(tài)線程池插件dynamic-tp集成過程淺析
這篇文章主要介紹了Java動態(tài)線程池插件dynamic-tp集成過程,dynamic-tp是一個(gè)輕量級的動態(tài)線程池插件,它是一個(gè)基于配置中心的動態(tài)線程池,線程池的參數(shù)可以通過配置中心配置進(jìn)行動態(tài)的修改2023-03-03SpringMVC通過Ajax處理Json數(shù)據(jù)的步驟詳解
這篇文章主要介紹了SpringMVC通過Ajax處理Json數(shù)據(jù)的步驟詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Java使用jxl包寫Excel文件適合列寬實(shí)現(xiàn)
用jxl.jar包,讀寫過Excel文件。也沒有注意最適合列寬的問題,但是jxl.jar沒有提供最適合列寬的功能,上次用到寫了一下,可以基本實(shí)現(xiàn)最適合列寬。2013-11-11