摘要:一方面,網(wǎng)關(guān)是個(gè)推微服務(wù)體系對(duì)外的唯一入口另一方面,網(wǎng)關(guān)中實(shí)現(xiàn)了很多后端服務(wù)的共性需求,避免了重復(fù)建設(shè)。個(gè)推微服務(wù)網(wǎng)關(guān)的設(shè)計(jì)與實(shí)現(xiàn)個(gè)推微服務(wù)主要是基于和進(jìn)行實(shí)踐的。下圖是個(gè)推微服務(wù)體系的架構(gòu)圖。
作者:個(gè)推應(yīng)用平臺(tái)基礎(chǔ)架構(gòu)高級(jí)研發(fā)工程師 阿飛
在微服務(wù)架構(gòu)中,不同的微服務(wù)可以有不同的網(wǎng)絡(luò)地址,各個(gè)微服務(wù)之間通過(guò)互相調(diào)用完成用戶請(qǐng)求,客戶端可能通過(guò)調(diào)用N個(gè)微服務(wù)的接口完成一個(gè)用戶請(qǐng)求。因此,在客戶端和服務(wù)端之間增加一個(gè)API網(wǎng)關(guān)成為多數(shù)微服務(wù)架構(gòu)的必然選擇。
在個(gè)推的微服務(wù)實(shí)踐中,API網(wǎng)關(guān)也起著至關(guān)重要的作用。一方面,API網(wǎng)關(guān)是個(gè)推微服務(wù)體系對(duì)外的唯一入口;另一方面,API網(wǎng)關(guān)中實(shí)現(xiàn)了很多后端服務(wù)的共性需求,避免了重復(fù)建設(shè)。
個(gè)推微服務(wù)網(wǎng)關(guān)的設(shè)計(jì)與實(shí)現(xiàn)個(gè)推微服務(wù)主要是基于Docker和Kubernetes進(jìn)行實(shí)踐的。在整個(gè)微服務(wù)架構(gòu)中,最底層的是個(gè)推私有部署的Kubernetes集群,在集群之上,部署了應(yīng)用服務(wù)。
個(gè)推的應(yīng)用服務(wù)體系共分為三層,最上一層是網(wǎng)關(guān)層,接著是業(yè)務(wù)層,最下面是基礎(chǔ)層服務(wù)。在部署應(yīng)用服務(wù)時(shí),我們使用了Kubernetes的命名空間對(duì)不同產(chǎn)品線的產(chǎn)品進(jìn)行隔離。除了應(yīng)用服務(wù)外, Kubernetes集群上還部署了Consul來(lái)實(shí)現(xiàn)配置的管理、Kube-DNS實(shí)現(xiàn)服務(wù)注冊(cè)與發(fā)現(xiàn),以及一些輔助系統(tǒng)來(lái)進(jìn)行應(yīng)用和集群的管理。
下圖是個(gè)推微服務(wù)體系的架構(gòu)圖。
個(gè)推對(duì)API網(wǎng)關(guān)的功能需求主要有以下幾方面:
要支持配置多個(gè)產(chǎn)品,為不同的產(chǎn)品提供不同的端口;
動(dòng)態(tài)路由;
URI的重寫(xiě);
服務(wù)的注冊(cè)與發(fā)現(xiàn);
負(fù)載均衡;
安全相關(guān)的需求,如session校驗(yàn)等;
流量控制;
鏈路追蹤;
A/B Testing。
在對(duì)市面上已有的網(wǎng)關(guān)產(chǎn)品進(jìn)行調(diào)研后,我們的技術(shù)團(tuán)隊(duì)發(fā)現(xiàn),它們并不太適合應(yīng)用于個(gè)推的微服務(wù)體系。第一,個(gè)推配置的管理都是基于Consul實(shí)現(xiàn)的,而大部分網(wǎng)關(guān)產(chǎn)品都需要基于一些DB存儲(chǔ),來(lái)進(jìn)行配置的管理;第二,大部分的網(wǎng)關(guān)產(chǎn)品提供的功能比較通用,也比較完善,這同時(shí)也降低了配置的復(fù)雜度以及靈活性;第三,大部分的網(wǎng)關(guān)產(chǎn)品很難直接融入到個(gè)推的微服務(wù)架構(gòu)體系中。
最終,個(gè)推選擇使用了OperResty和Lua進(jìn)行自研網(wǎng)關(guān),在自研的過(guò)程中,我們也借鑒了其他網(wǎng)關(guān)產(chǎn)品的一些設(shè)計(jì),如Kong和Orange的插件機(jī)制等。
個(gè)推的API網(wǎng)關(guān)的插件設(shè)計(jì)如下圖所示。
OpenResty對(duì)請(qǐng)求的處理分為多個(gè)階段。個(gè)推API網(wǎng)關(guān)的插件主要是在Set、Rewrite、Access、Header_filter、Body_filter、Log這六個(gè)階段做相應(yīng)的處理,其中,每一個(gè)插件都可以在一個(gè)或多個(gè)階段起到相應(yīng)的作用。在一個(gè)請(qǐng)求到達(dá)API網(wǎng)關(guān)之后,網(wǎng)關(guān)會(huì)根據(jù)配置為該請(qǐng)求選擇插件,然后根據(jù)每個(gè)插件的規(guī)則,進(jìn)一步過(guò)濾出匹配規(guī)則的插件,最后對(duì)插件進(jìn)行實(shí)例化,對(duì)流量進(jìn)行相應(yīng)的處理。
我們可以通過(guò)舉例來(lái)理解這個(gè)過(guò)程,如上圖所示,localhost:8080/api/demo/test/hello這個(gè)請(qǐng)求到達(dá)網(wǎng)關(guān)后,網(wǎng)關(guān)會(huì)根據(jù)host和端口確定產(chǎn)品信息,并提取出URI(/api/demo/test/hello),然后根據(jù)產(chǎn)品的具體配置,篩選出需要使用的插件——Rewrite_URI、Dyups和Auth,接下來(lái)根據(jù)每個(gè)插件的規(guī)則配置進(jìn)行過(guò)濾,過(guò)濾后,只有Rewrite_URI和Dyups兩個(gè)插件被選中。之后實(shí)例化這兩個(gè)插件,在各個(gè)階段對(duì)請(qǐng)求進(jìn)行處理。請(qǐng)求被轉(zhuǎn)發(fā)到后端服務(wù)時(shí),URI就被rewrite為“/demo/test/hello”,upstream也被設(shè)置為“prod1-svc1”。請(qǐng)求由后端服務(wù)處理之后,響應(yīng)會(huì)經(jīng)網(wǎng)關(guān)返回給客戶端,這就是整個(gè)插件的設(shè)計(jì)和工作的流程。為了優(yōu)化性能,我們將插件的實(shí)例化延緩到了請(qǐng)求真正開(kāi)始處理時(shí),在此之前,網(wǎng)關(guān)會(huì)通過(guò)產(chǎn)品配置和規(guī)則,過(guò)濾掉不需要執(zhí)行的插件。從圖中也可以看出,每個(gè)插件的規(guī)則配置都很簡(jiǎn)單,并且沒(méi)有統(tǒng)一的格式,這也確保了插件配置的簡(jiǎn)單靈活。
網(wǎng)關(guān)的配置均為熱更新,通過(guò)Consul和Consul-Template來(lái)實(shí)現(xiàn),配置在Consul上進(jìn)行更新后,Consul-Template會(huì)將其實(shí)時(shí)地拉取下來(lái),然后通過(guò)以下兩種方式進(jìn)行更新。
(1)通過(guò)調(diào)用Update API,將配置更新到shared-dict中。
(2)更新配置文件,利用Reload OpenResty實(shí)現(xiàn)配置文件的更新。
個(gè)推微服務(wù)網(wǎng)關(guān)提供的主要功能 1.動(dòng)態(tài)路由動(dòng)態(tài)路由主要涉及到三個(gè)方面:服務(wù)注冊(cè)、服務(wù)發(fā)現(xiàn)和請(qǐng)求轉(zhuǎn)發(fā)。
如下圖所示,服務(wù)的注冊(cè)和發(fā)現(xiàn)是基于Kubernetes的Service和Kube-DNS實(shí)現(xiàn)的,在Consul中,會(huì)維持一個(gè)服務(wù)的映射表,應(yīng)用的每一個(gè)微服務(wù)都對(duì)應(yīng)Kubernetes上的一個(gè)Service,每創(chuàng)建一個(gè)Service都會(huì)在Consul上的服務(wù)映射表中添加一項(xiàng)(會(huì)被實(shí)時(shí)更新到網(wǎng)關(guān)的共享內(nèi)存中)。網(wǎng)關(guān)每收到一個(gè)請(qǐng)求都會(huì)從服務(wù)映射表中查詢到具體的后端服務(wù)(即Kubernetes中的Service名),并進(jìn)行動(dòng)態(tài)路由。Kube-DNS可以將Service的域名解析成Kubernetes內(nèi)部的ClusterIP,而Service代理了多個(gè)Pod,會(huì)將流量均衡地轉(zhuǎn)發(fā)到不同的Pod上。
2.流量控制流量控制主要是通過(guò)一個(gè)名為“Counter”的后端服務(wù)和網(wǎng)關(guān)中的流控插件實(shí)現(xiàn)的。Counter負(fù)責(zé)存儲(chǔ)請(qǐng)求的訪問(wèn)次數(shù)和限值,并且支持按時(shí)間維度進(jìn)行計(jì)數(shù)。流控插件負(fù)責(zé)攔截流量,調(diào)用Counter的接口進(jìn)行超限查詢,如果Counter返回請(qǐng)求超限,網(wǎng)關(guān)就會(huì)直接拒絕訪問(wèn),實(shí)現(xiàn)限次的功能,再結(jié)合時(shí)間維度就可以實(shí)現(xiàn)限頻的需求。同時(shí)流控插件通過(guò)輸出日志信息到fluent-bit,由fluent-bit聚合計(jì)次來(lái)更新Counter中的計(jì)數(shù)。
整個(gè)微服務(wù)體系的鏈路追蹤是基于分布式的鏈路追蹤系統(tǒng)Zipkin來(lái)實(shí)現(xiàn)的。通過(guò)在網(wǎng)關(guān)安裝Zipkin插件和在后端服務(wù)中引入Zipkin中間件,實(shí)現(xiàn)最終的鏈路追蹤功能。具體架構(gòu)如下圖所示。
在A/B測(cè)試的實(shí)現(xiàn)中,有以下幾個(gè)關(guān)鍵點(diǎn):
(1)所有的策略信息都配置在Consul上,并通過(guò)Consul-Template實(shí)時(shí)生效到各個(gè)微服務(wù)的內(nèi)存中;
(2)每條策略均有指明,調(diào)用一個(gè)微服務(wù)時(shí)應(yīng)調(diào)用A還是B(默認(rèn)為A);
(3)網(wǎng)關(guān)中實(shí)現(xiàn)A/B插件,在請(qǐng)求到達(dá)網(wǎng)關(guān)時(shí),通過(guò)A/B插件配置的規(guī)則,即可確定請(qǐng)求適用的A/B策略;
(4)網(wǎng)關(guān)會(huì)將請(qǐng)求適用的A/B策略通過(guò)URL參數(shù)傳遞下去;
(5)每個(gè)微服務(wù)通過(guò)傳遞下來(lái)的策略,選擇正確的服務(wù)進(jìn)行訪問(wèn)。
下圖給出了兩種場(chǎng)景下的調(diào)用鏈路。
以上就是個(gè)推微服務(wù)網(wǎng)關(guān)的設(shè)計(jì)和主要功能的實(shí)現(xiàn)。之后,個(gè)推的技術(shù)團(tuán)隊(duì)會(huì)不斷提升API網(wǎng)關(guān)的彈性設(shè)計(jì),使其能夠在故障出現(xiàn)時(shí),縮小故障的影響范圍;同時(shí),我們也會(huì)繼續(xù)將網(wǎng)關(guān)與DevOps平臺(tái)做進(jìn)一步地結(jié)合,以確保網(wǎng)關(guān)在迭代更新時(shí),能夠有更多的自動(dòng)化測(cè)試來(lái)保證質(zhì)量,實(shí)現(xiàn)更快速地部署。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/102389.html
摘要:個(gè)推整體的微服務(wù)架構(gòu),主要是基于和進(jìn)行實(shí)踐的。在構(gòu)建整個(gè)微服務(wù)體系時(shí),個(gè)推選擇了研發(fā)自己的網(wǎng)關(guān)。在研發(fā)方面,也能夠使中間數(shù)據(jù)可見(jiàn)能力增強(qiáng)。 對(duì)于架構(gòu)師而言,技術(shù)的發(fā)展是無(wú)盡的,在搭建和實(shí)踐智能數(shù)據(jù)架構(gòu)的過(guò)程中,架構(gòu)師們都會(huì)或多或少地遇到一些疑惑和挑戰(zhàn),如何解決在架構(gòu)建設(shè)中遇到的某些問(wèn)題?架構(gòu)建設(shè)的領(lǐng)域又有什么新的行業(yè)動(dòng)態(tài)和技術(shù)方法? 近日,在個(gè)推TechDay全國(guó)沙龍北京站的現(xiàn)場(chǎng),幾位...
摘要:個(gè)推整體的微服務(wù)架構(gòu),主要是基于和進(jìn)行實(shí)踐的。在構(gòu)建整個(gè)微服務(wù)體系時(shí),個(gè)推選擇了研發(fā)自己的網(wǎng)關(guān)。在研發(fā)方面,也能夠使中間數(shù)據(jù)可見(jiàn)能力增強(qiáng)。 對(duì)于架構(gòu)師而言,技術(shù)的發(fā)展是無(wú)盡的,在搭建和實(shí)踐智能數(shù)據(jù)架構(gòu)的過(guò)程中,架構(gòu)師們都會(huì)或多或少地遇到一些疑惑和挑戰(zhàn),如何解決在架構(gòu)建設(shè)中遇到的某些問(wèn)題?架構(gòu)建設(shè)的領(lǐng)域又有什么新的行業(yè)動(dòng)態(tài)和技術(shù)方法? 近日,在個(gè)推TechDay全國(guó)沙龍北京站的現(xiàn)場(chǎng),幾位...
閱讀 5030·2021-09-07 09:58
閱讀 781·2019-08-30 15:55
閱讀 2909·2019-08-30 15:55
閱讀 915·2019-08-30 15:53
閱讀 1549·2019-08-29 12:57
閱讀 1796·2019-08-26 13:46
閱讀 559·2019-08-26 11:00
閱讀 3658·2019-08-23 15:42