如果團(tuán)隊(duì)正在使用微服務(wù)架構(gòu)搭建服務(wù)體系,或者正在考慮向微服務(wù)架構(gòu)轉(zhuǎn)型,那么應(yīng)該熟悉網(wǎng)關(guān),至少應(yīng)該了解網(wǎng)關(guān)模式,網(wǎng)上有關(guān)于API gateway pattern模式的詳細(xì)描述。微服務(wù)架構(gòu)的API 網(wǎng)關(guān)作為服務(wù)的單一入口,集成許多API管理和監(jiān)控層面問題,比如api路由、api鑒權(quán)、api監(jiān)控、灰度發(fā)布等典型互聯(lián)網(wǎng)應(yīng)用問題。
網(wǎng)關(guān)應(yīng)用的選擇非常廣泛,開發(fā)中最為常見Nginx就是一種網(wǎng)關(guān)應(yīng)用,其中功能非常強(qiáng)大,不過一般情況下我們僅僅應(yīng)用Nginx來做請求路由。網(wǎng)關(guān)應(yīng)用還有Kong、HAProxy等網(wǎng)關(guān)應(yīng)用,以及Netflix開源的網(wǎng)關(guān)Zuul。
Spring Cloud Gateway旨在提供一種簡單而有效的路由到API的方法。gateway收到請求時(shí),Spring Cloud Gateway會將其轉(zhuǎn)發(fā)到網(wǎng)關(guān)處理程序映射,該映射確定應(yīng)該對匹配特定路由的請求執(zhí)行的操作。
前段時(shí)間為公司做網(wǎng)關(guān)平臺項(xiàng)目,在zuul和gateway中選擇gateway作為二次元的base,zuul是有netflix公司開源捐獻(xiàn)給spring體系的開源網(wǎng)關(guān),其服務(wù)功能非常全面,前幾年在微服務(wù)架構(gòu)體系中非常活躍,被廣大互聯(lián)網(wǎng)企業(yè)應(yīng)用;官方借鑒于zuul的成功推出了spring-cloud-gateway,其功能體系與zuul非常一致,最關(guān)鍵的不同是gateway是基于spring-cloud-webflux打造的異步高性能框架,底層采用高性能Netty-IO框架作為http-server(這也是目前gateway無法集成hystrix-dashboard等工具原因,相信官方會推動完善),處理性能優(yōu)于jetty的同步框架;借助于spring-cloud的活躍社區(qū)推廣,目前也有許多企業(yè)網(wǎng)關(guān)由zuul升級至gateway。
網(wǎng)關(guān)在微服務(wù)架構(gòu)中處于最上層應(yīng)用,作為微服務(wù)架構(gòu)流量的入口,而應(yīng)用服務(wù)作為網(wǎng)關(guān)的下游業(yè)務(wù)服務(wù),不需要關(guān)心流量的接入層,只需專注與業(yè)務(wù)本身;一些通用的功能統(tǒng)一切換至上層網(wǎng)關(guān)代為處理,不需要向公網(wǎng)暴露自己的服務(wù)地址,使得服務(wù)更加安全可靠。

spring-cloud-gateway的架構(gòu)設(shè)計(jì)很多地方有spring框架設(shè)計(jì)的影子,官方給出一張其功能設(shè)計(jì)架構(gòu)圖。

網(wǎng)關(guān)的可以作為一個中臺應(yīng)用,為下游業(yè)務(wù)做路由,網(wǎng)關(guān)的功能設(shè)計(jì)包括:
其次根據(jù)服務(wù)需求和應(yīng)用場景,可以在gateway原有功能的基礎(chǔ)之上,通過其Filter機(jī)制來擴(kuò)展所需的功能,例如請求日志記錄,報(bào)文轉(zhuǎn)換,請求權(quán)限認(rèn)證,以及其他場景需求。不過必須要注意,gateway是基于webflux開發(fā)的,采用的是異步非阻塞模型,在對請求過濾的過程當(dāng)中不允許blocked的代碼,否則請求會拋出處理異常而不可用;其次在處理請求的過程當(dāng)中最好不要出現(xiàn)阻塞操作,例如db操作或者其他io類型操作,容易造成網(wǎng)關(guān)處理異常,對于不可避免的同步操作盡量做到代碼解偶,比如采用事件訂閱或者消息通知等模式來實(shí)現(xiàn)。
關(guān)于網(wǎng)關(guān)的系列文章會按照本文的功能點(diǎn)來做進(jìn)一步講解,希望能夠與讀者相互學(xué)習(xí)開源作者的優(yōu)秀思想。這里有一個增強(qiáng)版的gateway實(shí)現(xiàn),感興趣的讀者可以選擇性查看。