Zuul閘道器路由管理實踐

2021-09-10 17:03:30 字數 2797 閱讀 4129

閘道器的核心功能之一是路由**,為此,閘道器需要獲取並維護一張路由表,這個路由表簡單可以理解為乙個服務名<>服務位址的對映表,有了這張路由表,閘道器就可以根據請求路徑或者http頭中的服務資訊,將請求**到對應的目標服務位址。

zuul[附錄1]是netflix開源的微服務閘道器,在netflix經過大規模生產級驗證,最新的資料表明netflix每天有近千億級流量要經過zuul閘道器。另外,zuul也是spring cloud全家桶的核心元件。本文介紹zuul閘道器路由管理的一些常用方案,可供準備在生產環境使用zuul的企業參考。

這個也是netflix的做法,zuul閘道器借助eureka[附錄2]服務註冊中心獲取路由表,簡述步驟如下:

內部微服務(前端聚合服務或者後台基礎服務)啟動時,自動註冊到eureka服務註冊中心,並定期向註冊中心報心跳,表明自己的存活狀態。例如,上圖中,svcx在eureka上有一組對應的ip:port對,表示svc服務對應的存活服務例項位址列表。

當zuul閘道器接收到外部請求,它根據某種規則從請求中獲取服務名,例如,假設第一級path就是服務名,那麼 api.***.com/svcx 中的svcx就是服務名。解析獲取服務名後,zuul將服務名傳給ribbon,ribbon通過查詢快取的路由表獲取服務例項位址列表,再根據某種路由策略(例如,隨機或者roundrobin等),選擇乙個目標例項位址發起呼叫。

該方法相對簡單,部署eureka服務註冊中心即可實現。同時也比較靈活,內部服務可以自註冊自發現,研發人員可以自助完成服務上下線,更貼合devops研發模式,不太需要運維配合介入。

該方案的問題是,目前很多企業內部還有很多歷史遺留服務,這些服務基本上還是基於傳統網域名稱進行管理的,如果公升級到eureka的自註冊自發現方式,遷移和改造成本不小。

對於內部遺留系統較多,服務主要基於傳統網域名稱方式管理,暫時還不具備條件採用上述第一種方案的企業,可以採用基於服務治理中心+網域名稱的做法,如上圖所示。

該方案需要開發一套服務治理中心,用來集中管理路由等服務元資料資訊,同時企業內部需要dns網域名稱服務支援。採用該方案的流程簡述如下:

研發人員通過運維申請部署服務所需的機器,ip和內部網域名稱等相關資訊,完成服務開發和部署,通過內部網域名稱測試服務正常。

研發人員通過服務治理中心註冊服務,提供相應的服務名和網域名稱資訊,也提供一些額外的元資料資訊,如該服務對哪些閘道器可見(即要通過哪些閘道器將該服務暴露出去),該服務目前是否在生產環境可訪問(是否已經過qa流程公升級到生產環境)。

zuul閘道器定期從服務治理中心拉取服務路由表(注意,這裡只需要拉取對該閘道器可見的路由表,例如無線閘道器只拉取對無線閘道器可見的服務,不需要拉取全部路由表),並快取在本地記憶體。

當zuul閘道器接收到外部請求,它根據某種規則從請求中解析出服務名,再通過查詢記憶體中的路由表找到目標服務的內部網域名稱,最後對目標網域名稱發起呼叫。通過網域名稱呼叫時,底層http客戶端會自動通過dns服務解析並獲取對應的ip位址。注意,在實際場景中,這裡解析到的ip一般是乙個vip,真實的服務例項一般躲在乙個內部的負載均衡器lb(例如f5+nginx)後面,這個vip指向lb,lb會對後台服務做負載均衡和**。

該方案複雜度適中,內部的網域名稱和負載均衡系統一般由運維支援,服務治理中心的研發門檻和成本不高,基本上就是乙個簡單的資料庫應用。該方案的靈活性和自動化程度沒有第一種方案好,需要一些人工配置,但是可以在運維和服務治理中心層面按需增加一些治理環節,可治理性會更好一點。

對於一些初創公司,剛開始什麼都缺的情況下,最簡單的路由管理的方式就是直接把路由配置在zuul閘道器的本地配置檔案中。但是這種做法很不靈活,每次修改路由都需要重啟閘道器集群。所有建議可以部署一套配置中心,例如apollo,把路由資訊簡單配置在apollo配置中心中,然後讓閘道器定期從apollo獲取路由配置並做本地快取,該方案如上圖所示。

apollo支援xml格式的配置,下面是乙個路由配置案例:

>

>

>

svc1name

>

>

192.168.100.1:8080endpoint

>

>

192.168.100.2:8080endpoint

>

>

192.168.100.3:8080endpoint

>

svc_route

>

>

>

svc2name

>

>

192.168.101.1:8080endpoint

>

>

192.168.101.2:8080endpoint

>

>

192.168.101.3:8080endpoint

>

svc_route

>

zuul_route

>

路由**是閘道器的核心功能,為此閘道器需要維護和管理一張路由表,常見做法有基於eureka自發現,基於服務治理中心和網域名稱,或者最簡單的基於配置中心。

波波在極客時間的課程《微服務架構和實踐160講》,第三模組《微服務閘道器zuul架構和實踐》,會對zuul閘道器的架構、原始碼和生產實踐等內容進行深度剖析,歡迎關注。

zuul

eureka

ribbon

Zuul路由閘道器

zuul路由閘道器 概述 1.zuul提供外部的請求 到具體的微服務例項中的服務 2.路由 zuul可以對外部訪問實現統一的入口 3.過濾 zuul可以對外部訪問進行干預,如請求校驗 服務聚合等 4.zuul需要配合eureka使用,需要在eureka中註冊並獲得其他微服務的資訊 5.理解 zuul...

Zuul路由閘道器

1.1 什麼是zuul zuul包含了對請求的路由和過濾這兩個主要的功能 zuul和eureka進行整合,將zuul自身註冊為eureka服務治理下的應用,同時從eureka中獲得其他微服務的訊息,也就是說以後訪問微服務都是通過zuul跳轉後獲得 1.2 zull簡單使用 編寫服務,匯入依賴 org...

Zuul路由閘道器

首先還是導包 需要eureka zuul的包 org.springframework.cloudgroupid spring cloud starter netflix eurekaartifactid dependency org.springframework.cloudgroupid spri...