中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

個推微服務網關架構實踐

發布時間:2020-08-05 13:03:49 來源:網絡 閱讀:363 作者:個推 欄目:云計算

作者:個推應用平臺基礎架構高級研發工程師 阿飛

在微服務架構中,不同的微服務可以有不同的網絡地址,各個微服務之間通過互相調用完成用戶請求,客戶端可能通過調用N個微服務的接口完成一個用戶請求。因此,在客戶端和服務端之間增加一個API網關成為多數微服務架構的必然選擇。

在個推的微服務實踐中,API網關也起著至關重要的作用。一方面,API網關是個推微服務體系對外的唯一入口;另一方面,API網關中實現了很多后端服務的共性需求,避免了重復建設

個推微服務網關的設計與實現

個推微服務主要是基于Docker和Kubernetes進行實踐的。在整個微服務架構中,最底層的是個推私有部署的Kubernetes集群,在集群之上,部署了應用服務。

個推的應用服務體系共分為三層,最上一層是網關層,接著是業務層,最下面是基礎層服務。在部署應用服務時,我們使用了Kubernetes的命名空間對不同產品線的產品進行隔離。除了應用服務外, Kubernetes集群上還部署了Consul來實現配置的管理、Kube-DNS實現服務注冊與發現,以及一些輔助系統來進行應用和集群的管理。

下圖是個推微服務體系的架構圖。
個推微服務網關架構實踐

個推對API網關的功能需求主要有以下幾方面:

  1. 要支持配置多個產品,為不同的產品提供不同的端口;

  2. 動態路由;

  3. URI的重寫;

  4. 服務的注冊與發現;

  5. 負載均衡

  6. 安全相關的需求,如session校驗等;

  7. 流量控制;

  8. 鏈路追蹤;

  9. A/B Testing。

在對市面上已有的網關產品進行調研后,我們的技術團隊發現,它們并不太適合應用于個推的微服務體系。第一,個推配置的管理都是基于Consul實現的,而大部分網關產品都需要基于一些DB存儲,來進行配置的管理;第二,大部分的網關產品提供的功能比較通用,也比較完善,這同時也降低了配置的復雜度以及靈活性;第三,大部分的網關產品很難直接融入到個推的微服務架構體系中。

最終,個推選擇使用了OperResty和Lua進行自研網關,在自研的過程中,我們也借鑒了其他網關產品的一些設計,如Kong和Orange的插件機制等。

個推的API網關的插件設計如下圖所示。
個推微服務網關架構實踐

OpenResty對請求的處理分為多個階段。個推API網關的插件主要是在Set、Rewrite、Access、Header_filter、Body_filter、Log這六個階段做相應的處理,其中,每一個插件都可以在一個或多個階段起到相應的作用。在一個請求到達API網關之后,網關會根據配置為該請求選擇插件,然后根據每個插件的規則,進一步過濾出匹配規則的插件,最后對插件進行實例化,對流量進行相應的處理。
個推微服務網關架構實踐

我們可以通過舉例來理解這個過程,如上圖所示,localhost:8080/api/demo/test/hello這個請求到達網關后,網關會根據host和端口確定產品信息,并提取出URI(/api/demo/test/hello),然后根據產品的具體配置,篩選出需要使用的插件——Rewrite_URI、Dyups和Auth,接下來根據每個插件的規則配置進行過濾,過濾后,只有Rewrite_URI和Dyups兩個插件被選中。之后實例化這兩個插件,在各個階段對請求進行處理。請求被轉發到后端服務時,URI就被rewrite為“/demo/test/hello”,upstream也被設置為“prod1-svc1”。請求由后端服務處理之后,響應會經網關返回給客戶端,這就是整個插件的設計和工作的流程。為了優化性能,我們將插件的實例化延緩到了請求真正開始處理時,在此之前,網關會通過產品配置和規則,過濾掉不需要執行的插件。從圖中也可以看出,每個插件的規則配置都很簡單,并且沒有統一的格式,這也確保了插件配置的簡單靈活。

網關的配置均為熱更新,通過Consul和Consul-Template來實現,配置在Consul上進行更新后,Consul-Template會將其實時地拉取下來,然后通過以下兩種方式進行更新。

(1)通過調用Update API,將配置更新到shared-dict中。

(2)更新配置文件,利用Reload OpenResty實現配置文件的更新。

個推微服務網關提供的主要功能

1.動態路由

動態路由主要涉及到三個方面:服務注冊、服務發現和請求轉發。

如下圖所示,服務的注冊和發現是基于Kubernetes的Service和Kube-DNS實現的,在Consul中,會維持一個服務的映射表,應用的每一個微服務都對應Kubernetes上的一個Service,每創建一個Service都會在Consul上的服務映射表中添加一項(會被實時更新到網關的共享內存中)。網關每收到一個請求都會從服務映射表中查詢到具體的后端服務(即Kubernetes中的Service名),并進行動態路由。Kube-DNS可以將Service的域名解析成Kubernetes內部的ClusterIP,而Service代理了多個Pod,會將流量均衡地轉發到不同的Pod上。

個推微服務網關架構實踐

2.流量控制

流量控制主要是通過一個名為“Counter”的后端服務和網關中的流控插件實現的。Counter負責存儲請求的訪問次數和限值,并且支持按時間維度進行計數。流控插件負責攔截流量,調用Counter的接口進行超限查詢,如果Counter返回請求超限,網關就會直接拒絕訪問,實現限次的功能,再結合時間維度就可以實現限頻的需求。同時流控插件通過輸出日志信息到fluent-bit,由fluent-bit聚合計次來更新Counter中的計數。
個推微服務網關架構實踐

3.鏈路追蹤

整個微服務體系的鏈路追蹤是基于分布式的鏈路追蹤系統Zipkin來實現的。通過在網關安裝Zipkin插件和在后端服務中引入Zipkin中間件,實現最終的鏈路追蹤功能。具體架構如下圖所示。
個推微服務網關架構實踐

4. A/B測試

在A/B測試的實現中,有以下幾個關鍵點:

(1)所有的策略信息都配置在Consul上,并通過Consul-Template實時生效到各個微服務的內存中;

(2)每條策略均有指明,調用一個微服務時應調用A還是B(默認為A);

(3)網關中實現A/B插件,在請求到達網關時,通過A/B插件配置的規則,即可確定請求適用的A/B策略;

(4)網關會將請求適用的A/B策略通過URL參數傳遞下去;

(5)每個微服務通過傳遞下來的策略,選擇正確的服務進行訪問。

下圖給出了兩種場景下的調用鏈路。
個推微服務網關架構實踐

總結

以上就是個推微服務網關的設計和主要功能的實現。之后,個推的技術團隊會不斷提升API網關的彈性設計,使其能夠在故障出現時,縮小故障的影響范圍;同時,我們也會繼續將網關與DevOps平臺做進一步地結合,以確保網關在迭代更新時,能夠有更多的自動化測試來保證質量,實現更快速地部署。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

哈尔滨市| 阿图什市| 赣州市| 阿勒泰市| 新蔡县| 梨树县| 永昌县| 舒兰市| 淅川县| 海伦市| 文登市| 延津县| 庄浪县| 天镇县| 上栗县| 四川省| 民勤县| 威宁| 崇义县| 青川县| 青海省| 将乐县| 泸西县| 弥勒县| 成武县| 莱西市| 临汾市| 武功县| 瑞金市| 开平市| 庆阳市| 江西省| 阜康市| 浦县| 乾安县| 甘泉县| 台安县| 通山县| 浮山县| 木兰县| 西峡县|