天天寫(xiě)CRUD的你,到了該給系統(tǒng)接入API網(wǎng)關(guān)的時(shí)候了!
今天給大家分享一個(gè) API 網(wǎng)關(guān)的知識(shí),很多兄弟可能平時(shí)經(jīng)常搞的都是一些 CRUD 的業(yè)務(wù)系統(tǒng)開(kāi)發(fā),從來(lái)沒(méi)接觸過(guò) API 網(wǎng)關(guān)。
那今天來(lái)講講,API 網(wǎng)關(guān)是啥,到底能對(duì)我們起到什么作用呢?這個(gè)一般面試的時(shí)候也很可能會(huì)問(wèn)到這個(gè)知識(shí)點(diǎn)的。
先來(lái)看看業(yè)務(wù)系統(tǒng)技術(shù)棧
平時(shí)咱們可能寫(xiě)系統(tǒng)的時(shí)候,往往就是基于 SpringBoot+Spring MVC+Spring+Mybatis 這套技術(shù)棧來(lái)開(kāi)發(fā)業(yè)務(wù)代碼,然后連接一個(gè) MySQL 就行了。
你調(diào)用別的系統(tǒng)往往就是基于 Dubbo,注冊(cè)中心可能是 Zookeeper 也可能是 Nacos。
就類(lèi)似下面的這個(gè)圖,對(duì)不對(duì)?
網(wǎng)關(guān)路由請(qǐng)求轉(zhuǎn)發(fā)功能
好,那么現(xiàn)在給大家講第一個(gè)痛點(diǎn),那就是你們公司可能存在 n 多個(gè)業(yè)務(wù)系統(tǒng),那琳瑯滿(mǎn)目的,可能有幾十個(gè)系統(tǒng)。
此時(shí)對(duì)于前端/APP 端他們還能知道哪個(gè)請(qǐng)求發(fā)送給哪個(gè)系統(tǒng)嗎,這真的是太麻煩了,對(duì)不對(duì)?所以說(shuō),此時(shí)一般會(huì)引入一個(gè) API 網(wǎng)關(guān)。
你每個(gè)業(yè)務(wù)系統(tǒng)吧,在 API 網(wǎng)關(guān)里配置一下,自己要處理什么樣的請(qǐng)求 url,然后 API 網(wǎng)關(guān)收到請(qǐng)求以后,根據(jù)請(qǐng)求 url 路徑判斷一下,就知道應(yīng)該把請(qǐng)求轉(zhuǎn)發(fā)給哪個(gè)業(yè)務(wù)系統(tǒng)了,完美,對(duì)不對(duì)?
看看下圖吧:
網(wǎng)關(guān)統(tǒng)一授權(quán)和鑒權(quán)功能
下一個(gè)問(wèn)題來(lái)了,你這個(gè)系統(tǒng)能允許別人誰(shuí)來(lái)都隨便調(diào)用你嗎?你不得搞一個(gè)授權(quán)和鑒權(quán)的過(guò)程?你不得甄別甄別發(fā)送請(qǐng)求來(lái)的這個(gè)人是好人壞人?
你不得想想發(fā)送過(guò)來(lái)的這個(gè)請(qǐng)求到底應(yīng)該不應(yīng)該處理嗎?所以這個(gè)時(shí)候這個(gè)鑒權(quán)的事情你自己搞嗎?那太麻煩了吧,你也鑒權(quán),別的系統(tǒng)自己也鑒權(quán),那真的是麻煩大了。
所以這個(gè)時(shí)候,我們就直接在 API 網(wǎng)關(guān)里加入鑒權(quán)功能不就完了,一個(gè)請(qǐng)求過(guò)來(lái)是好人還是壞人,API 網(wǎng)關(guān)就幫你鑒權(quán)了,通過(guò)鑒權(quán)的請(qǐng)求才能往后端發(fā)送。
如下圖:
API 網(wǎng)關(guān)層流控功能
再下一個(gè)痛點(diǎn)來(lái)了,那就是假設(shè)咱們系統(tǒng)一共就部署了幾臺(tái)機(jī)器,總共每秒幾千請(qǐng)求了不得了,結(jié)果有一天運(yùn)營(yíng)搞了一個(gè)特別棒的活動(dòng),每秒來(lái)了幾萬(wàn)流量和請(qǐng)求,一下子給你擊垮了,你說(shuō)你怎么辦,你扛不住啊?
所以這個(gè)時(shí)候啊,還得在 API 網(wǎng)關(guān)層加入流控的功能,每個(gè)業(yè)務(wù)系統(tǒng)可以配置自己能抗的 QPS,他根據(jù)這個(gè)來(lái)限制每秒轉(zhuǎn)發(fā)給你的請(qǐng)求不就完了。
如下圖:
API 網(wǎng)關(guān)層灰度發(fā)布功能
然后呢,還有一個(gè)經(jīng)常遇到的痛點(diǎn),那就是咱們每次系統(tǒng)上線(xiàn)部署,如果一下子把新的版本部署到所有機(jī)器里去,就怕新版本上線(xiàn)就掉倆字,直接就崩潰,這可怎么辦。
所以一般來(lái)說(shuō),可以引入一個(gè)灰度發(fā)布,這個(gè)灰度發(fā)布意思就是說(shuō),假設(shè)你系統(tǒng)部署了 3 臺(tái)機(jī)器,每次上線(xiàn)先部署 1 臺(tái)機(jī)器,然后線(xiàn)上的流量里劃分 5% 給這個(gè)新部署的灰度版本機(jī)器,先觀(guān)察一下咋樣,要是沒(méi)問(wèn)題,再把后續(xù)兩臺(tái)機(jī)器給部署了,這就是灰度發(fā)布。
灰度發(fā)布也可以叫做金絲雀發(fā)布,這個(gè)金絲雀發(fā)布是啥意思呢,就是以前古代有盜版的人下墓的時(shí)候先把金絲雀扔進(jìn)去看看,如果他不叫了,說(shuō)明墓里有毒氣,現(xiàn)在這個(gè)灰度發(fā)布也是一個(gè)意思,先把新版本部署到一臺(tái)機(jī)器里去,觀(guān)察一下,要是他崩了,就說(shuō)明代碼有問(wèn)題。
所以此時(shí)就可以基于 API 網(wǎng)關(guān)來(lái)實(shí)現(xiàn)灰度發(fā)布了,每次部署了灰度版本以后,讓 API 網(wǎng)關(guān)就劃分 5% 的流量給這個(gè)灰度版本,一切正常了再全量部署。
如下圖:
好了,到這里為止,就給大家把這個(gè) API 網(wǎng)關(guān)的作用講清楚了,大家平時(shí)不要老是埋頭寫(xiě) crud 代碼啊,對(duì) API 網(wǎng)關(guān)這些東西,也是要了解一下的,別啥都不知道。