我們該如何讓代理將請求均衡至全部實例當(dāng)中?答案是不用——我們并不需要執(zhí)行特別的操作。
正常來講,如果我們不使用Docker Swarm功能,則可使用以下配置方式:
backend go-demo-be server instance_1 <INSTANCE_1_IP>:<INSTANCE_1_PORT> server instance_2 <INSTANCE_2_IP>:<INSTANCE_2_PORT> server instance_3 <INSTANCE_3_IP>:<INSTANCE_3_PORT> server instance_4 <INSTANCE_4_IP>:<INSTANCE_4_PORT> server instance_5 <INSTANCE_5_IP>:<INSTANCE_5_PORT>
然而在新的Docker網(wǎng)絡(luò)當(dāng)中,我們將不再需要進行上述配置。原本的作法只會在新副本添加或者刪除時,給我們的實例監(jiān)控與代理更新工作造成麻煩。
現(xiàn)在,Docker會幫助我們完成全部負(fù)載均衡工作。更準(zhǔn)確地講,當(dāng)該代理將某條請求重新定向至go-demo時,其實際將其發(fā)送至Docker網(wǎng)絡(luò)并由后者執(zhí)行跨越全部服務(wù)副本(實例)的負(fù)載均衡。這套方案的意義在于,代理負(fù)責(zé)將端口80(或者443)重新定向至網(wǎng)絡(luò)中的正確服務(wù)處,其它任務(wù)則全部由Docker完成。
大家可以隨意向該服務(wù)發(fā)送更多請求,并檢查其中一套副本的日志記錄。在這里,大家會發(fā)現(xiàn)其接收到的請求約為總體請求數(shù)量的五分之一——與我們的服務(wù)實例數(shù)量恰好吻合。
總結(jié)
Docker網(wǎng)絡(luò)與Docker 1.12及更高版本提供的Swarm相結(jié)合,無疑開啟了一道通向更多新機遇的大門。不同容器與負(fù)載均衡之間的內(nèi)部通信只是其中的一小部分,我們亦可以更為輕松地配置公開代理。另外,我們需要確保面向API進行公開的全部服務(wù)皆以代理形式接入同一網(wǎng)絡(luò)。在此之后,我們要做的就是進行配置以將所有請求重新定向至目標(biāo)服務(wù)名稱。這樣所有來自代理的請求都將指向Docker網(wǎng)絡(luò),并由后者跨越全部實例執(zhí)行負(fù)載均衡。
但新的問題在于,這套方案的具體效率是否理想。畢竟我們在體系中引入了新的層。盡管過去我們也會使用代理以及服務(wù),但現(xiàn)在Docker網(wǎng)絡(luò)會在二者之間建立負(fù)載均衡機制。答案是,由此帶來的運行負(fù)擔(dān)非常有限。Docker利用Linux IPVS實現(xiàn)負(fù)載均衡,其作為Linux內(nèi)核的組成部分已經(jīng)擁有超過15年歷史,而且事實證明其是一種極為高效的負(fù)載均衡實現(xiàn)方式。事實上,其速度表現(xiàn)遠遠優(yōu)于nginx或者HAProxy。
下一個問題是,我們是否需要代理機制。是的,當(dāng)然需要。DOcker所使用的IPVS只負(fù)責(zé)實現(xiàn)負(fù)載均衡。我們還需要一套代理以接收來自端口80與443的請求,并根據(jù)其實際路徑將其重新定向至各目標(biāo)服務(wù)。在此基礎(chǔ)之上,我們還可以利用它執(zhí)行多種任務(wù),包括SSL握手以及驗證等等。
那么這種作法存在哪些缺點?首先想到的肯定是粘性會話。如果我們希望同一用戶向同一實例發(fā)送請求,那么這套方案顯然并不適用。另一個問題是,我們是否應(yīng)當(dāng)在服務(wù)之內(nèi)實現(xiàn)粘性會話,或者應(yīng)該將其作為獨立實體。這個問題我們在本文中暫時不作討論,只需要明確這里提到的方案并不適用于粘性會話即可。
那么其具備哪些優(yōu)勢?首先,整個實現(xiàn)過程非常簡單。我們用不著在部署新副本時對代理進行重新配置。如此一來,整個流程將非常便捷。由于我們不需要包含全部端口IP及端口的列表,因此也就無需使用Registrator以及Consul Template之類的工具。過去,我們需要利用Registrator以監(jiān)控Docker事件,并將IP及端口保存在鍵值存儲方案(例如Consul)當(dāng)中。信息存儲完成后,我們會利用Consul Template重新創(chuàng)建代理配置。雖然不少項目都能簡化這一流程,但Docker Swarm與Docker網(wǎng)格的再現(xiàn)從根本上降低了其實施難度。