當(dāng)今的微服務(wù)架構(gòu)還需要指定端口嗎?
在當(dāng)今的技術(shù)環(huán)境下,微服務(wù)架構(gòu)已經(jīng)廣泛流行并深刻地改變了應(yīng)用程序的構(gòu)建和交互方式。
傳統(tǒng)上,應(yīng)用程序之間的通信往往依賴于明確指定 IP 地址與端口號的組合,然而隨著微服務(wù)理念的推進(jìn),服務(wù)名稱調(diào)用逐漸成為主流,這使得我們不得不重新審視應(yīng)用程序是否還需要指定端口這一問題。
傳統(tǒng)架構(gòu)
圖片
從傳統(tǒng)的單體應(yīng)用架構(gòu)來看,指定端口是實現(xiàn)網(wǎng)絡(luò)通信的關(guān)鍵步驟。
例如,一個基于 Java 的 Web 應(yīng)用程序部署在服務(wù)器上,開發(fā)人員需要為其指定一個特定的端口,如 8080,這樣客戶端才能通過訪問服務(wù)器的 IP 地址加上該端口號來請求相應(yīng)的資源。
在這種模式下,端口的指定明確了應(yīng)用程序在網(wǎng)絡(luò)中的接入點,就如同給一座房子確定了一個獨一無二的門牌號,方便外界與之進(jìn)行交互。它使得網(wǎng)絡(luò)請求能夠準(zhǔn)確地找到對應(yīng)的應(yīng)用程序?qū)嵗?,從而實現(xiàn)數(shù)據(jù)的傳輸與處理。
然而,微服務(wù)架構(gòu)帶來了全新的思路。在微服務(wù)架構(gòu)中,眾多小型的、獨立的服務(wù)相互協(xié)作以構(gòu)建復(fù)雜的應(yīng)用系統(tǒng)。如果依然采用傳統(tǒng)的 IP + 端口的調(diào)用方式,會面臨諸多問題。
首先,微服務(wù)的數(shù)量眾多且動態(tài)變化,服務(wù)的啟動、停止、更新以及擴展都可能頻繁發(fā)生。這意味著需要不斷地管理和協(xié)調(diào)大量的端口分配,以避免端口沖突,這無疑是一項復(fù)雜且容易出錯的任務(wù)。
其次,在一個復(fù)雜的微服務(wù)集群中,服務(wù)的 IP 地址可能由于容器編排、自動伸縮等機制而動態(tài)變化,依賴固定的 IP + 端口進(jìn)行調(diào)用會使整個系統(tǒng)變得脆弱且難以維護。
微服務(wù)架構(gòu)
圖片
隨著系統(tǒng)架構(gòu)升級進(jìn)化,當(dāng)大家來到微服務(wù)的時代中,服務(wù)名稱調(diào)用機制就展現(xiàn)出了諸多優(yōu)勢。
借助于服務(wù)發(fā)現(xiàn)組件,如 Consul、Eureka 、Nacos 等,每個微服務(wù)在注冊中心注冊自身時,使用一個具有語義的服務(wù)名稱而非具體的 IP 和端口。
當(dāng)一個服務(wù)需要調(diào)用另一個服務(wù)時,它只需向服務(wù)發(fā)現(xiàn)組件查詢目標(biāo)服務(wù)的名稱,服務(wù)發(fā)現(xiàn)組件就會返回可用的服務(wù)實例的實際網(wǎng)絡(luò)地址信息(包括 IP 和端口),然后進(jìn)行調(diào)用。
這種方式將服務(wù)的網(wǎng)絡(luò)細(xì)節(jié)進(jìn)行了抽象和封裝,使得服務(wù)之間的調(diào)用更加靈活和可靠。開發(fā)人員無需關(guān)注具體的端口分配情況,降低了系統(tǒng)的復(fù)雜性和維護成本,提高了系統(tǒng)的可擴展性和彈性。
但這并不意味著端口在當(dāng)今的應(yīng)用程序中就完全失去了作用。盡管在微服務(wù)內(nèi)部的服務(wù)間調(diào)用可以通過服務(wù)名稱來實現(xiàn),但是端口仍然不可或缺。
例如,在微服務(wù)架構(gòu)中,我們通常都會有一個網(wǎng)關(guān)服務(wù)對外提供服務(wù),而這個網(wǎng)關(guān)服務(wù)通常跟流量入口綁定,比如 Nginx、K8s 里的 Ingress、阿里云的 SLB 等。而這些流量入口將流量轉(zhuǎn)到網(wǎng)關(guān)服務(wù)時,就需要網(wǎng)關(guān)服務(wù)提供明確的端口了。
在 SpringBoot 應(yīng)用中如何啟動隨機端口?
其實很簡單,大家都知道 SpringBoot 中可以通過 server.port 指定端口,如果要啟動隨機端口,將 server.port 設(shè)置為 0 即可。
server.port 設(shè)置為 0 后,可以讓操作系統(tǒng)為我們動態(tài)分配一個可用的端口無需我們在手動指定。
最后
OK,傳統(tǒng)架構(gòu)中,大家可能還需要用服務(wù)的 ip + 端口來進(jìn)行通信,在微服務(wù)架構(gòu)中,除了網(wǎng)關(guān)應(yīng)用還需要提供明確的端口號外,業(yè)務(wù)應(yīng)用的 ip + 端口號已經(jīng)被服務(wù)發(fā)現(xiàn)、注冊組件所隱去,大家基本已經(jīng)不再關(guān)心業(yè)務(wù)應(yīng)用的端口號了。
在這里也是做一個投票,問一下大家是否愿意在自己的項目中將 server.port設(shè)置為0。