dubbo-go 中如何实现路由策略功能
可在控制面對服務的路由進行精細控制,是一個成熟 RPC 系統(tǒng)必備的能力之一。作為一個逐步走向成熟的 RPC 系統(tǒng),Apache/dubbo-go(以下簡稱 dubbo-go )的最新版本 v1.4 中已經(jīng)實現(xiàn)了?Condition Router 和 Health Instance First Router 等路由。
實現(xiàn)一個功能,首先要清楚其本質。那到底什么是路由規(guī)則,我們?yōu)槭裁葱枰酚梢?guī)則?設想這么一個場景:現(xiàn)在要對某服務的新版本進行一次灰度發(fā)布,需要將一些對實驗流量進行引流到灰度機器,其余流量依舊使用正常服務。此時就可以考慮使用路由策略達到目的。
路由規(guī)則( routing rule )是為了改變網(wǎng)絡流量所經(jīng)過的途徑而修改路由信息的技術,通過改變路由屬性(包括可達性)達到引流的目的。在發(fā)起一次 RPC 調用前,它會過濾目標服務器地址,將消費端最終發(fā)起 RPC 調用的目標范圍限定在過濾后的地址列表。
目標
路由策略的關鍵點在于:
綜上,可以總結出 dubbo-go 路由規(guī)則的目標有:
- 支持從多個地方,如本地文件、遠程配置中心,讀取路由規(guī)則信息;
- 設計一套定義路由規(guī)則的簡單語法;
- 保持與 Dubbo 的兼容,降低學習成本;
總體設計
首先要考慮的是:路由規(guī)則應該放在整個服務治理周期的哪個階段呢?dubbo-go 的架構圖如下:
可以看到圖中的 Router 介于 Cluster 和 LB(load balance) 之間,這就意味著一個請求被發(fā)送到哪個服務器,是經(jīng)過了 Cluster - Router - LB 三層處理的。可以將 Router 看做是一種較小范圍的邏輯分組。
而在 Router 內部,將經(jīng)歷三個步驟:讀取路由規(guī)則,解析路由規(guī)則,執(zhí)行匹配。為了提高程序效率,路由規(guī)則的讀取和解析都是可以提前完成的,比如在應用啟動的時候。
根據(jù)上面圖中流程,可清楚地明晰 Router 的路由流程。
接口設計
根據(jù)前面的目標和總體設計,我們很容易地設計出 Router 的接口。
路由規(guī)則接口
Router 是 dubbo-go 路由最核心的接口。它可以理解為,當一個請求(或者說一次調用)過來的時候,判斷哪些實例是滿足該規(guī)則的抽象。其實際代碼定義如下:
其核心在于 Route 方法,執(zhí)行匹配邏輯。目前該接口的實現(xiàn)有:
- ListenableRouter
- AppRouter
- ConditionRouter
- HealthCheckRouter
- FileConditionRouter
在現(xiàn)實實現(xiàn)中,不同的不同的路由規(guī)則是有優(yōu)先級的,即 Router 的另一個重要特性:Priority 。它決定了的是路由規(guī)則的組織方式。
路由規(guī)則鏈式接口
除了優(yōu)先級,多個路由規(guī)則的執(zhí)行是有順序的。有路由規(guī)則的 Chain 接口如下:
Chain 實現(xiàn)了對不同路由規(guī)則的組織。從命名也可以看出,它是責任鏈模式的一種應用,通過該接口可將路由規(guī)則組成一條鏈,鏈中每條規(guī)則的輸出都是下一條規(guī)則的輸入。至于整個鏈路中不同規(guī)則的順序,取決于每個規(guī)則的 Priority ,它決定了每條路由規(guī)則的排序。
讀取路由規(guī)則接口
讀取路由規(guī)則對應 FileRouterFactory 和 RouterFactory 兩個接口。一般地,只需要一個 RouterFactory 接口就可以,但考慮到路由規(guī)則的不同來源,比如規(guī)則可能是從配置文件里面讀取過來,也可能是直接在服務的 URL 解析而來,所以我們抽象出來了兩個接口:
FileRouterFactory
RouterFactory
我們一般將這兩個接口對應本地和遠程兩種情況:
- 本地路由規(guī)則配置:在原配置加載階段,新增讀取路由配置文件步驟。使用 FileRouterFactory?解析后,生成對應路由規(guī)則,然后加載到緩存中。
- 遠程路由規(guī)則配置:讀取遠程配置并且監(jiān)聽其變化,篩選符合路由規(guī)則配置信息,通過 RouterFactory 生成對應路由規(guī)則,同樣加載到緩存中備用。
實現(xiàn)
從圖里面可以看出,實現(xiàn)路由規(guī)則以兼容 dubbo 為首要目標,降低使用者的學習成本為輔助目標。與配置中心模塊相結合,實現(xiàn)路由規(guī)則遠程統(tǒng)一管理與下發(fā)。
規(guī)則類型
下面介紹一下 dubbo-go 現(xiàn)有的路由規(guī)則實現(xiàn)。
條件路由
Condition Router 作為 dubbo-go 中第一個支持的路由規(guī)則實現(xiàn),允許用戶通過配置文件及配置中心管理路由規(guī)則。與之相似的一個概念是 dubbo-go 的 group,但是條件路由提供了更加細粒度的控制手段和更加豐富的表達語義。比較典型的使用場景是黑白名單設置,灰度以及測試等。
健康檢查路由
在 RPC 調用中,如果希望盡可能地將請求命中到那些處理能力快、處于健康狀態(tài)的實例,即可以考慮該路由。該路由判定斷定某個服務提供者的不健康度,優(yōu)先調用那些健康的服務實例。對 "健康" 度的判定,dubbo-go 默認的實現(xiàn)策略是:某服務的錯誤比例到達某一個閾值或者請求活躍數(shù)大于上限,則認為其不健康,頗類似于服務熔斷。dubbo-go 當然亦允許用戶擴展其健康檢測策略。
標簽路由
以 Provider 為維度,將某一個或多個服務的提供者劃分到同一個分組,約束流量只在指定分組中流轉,從而實現(xiàn)流量隔離的目的,即為標簽路由。它可以作為藍綠發(fā)布、灰度發(fā)布等場景的能力基礎。
- 靜態(tài)打標:根據(jù)配置文件所配置的標簽,固定給 Provider 設置標簽。
- 動態(tài)打標:基于健康檢查路由,根據(jù)服務不同時刻,不同狀態(tài),動態(tài)在 Provider 設置適合的標簽。
示例
下面以條件路由在 zookeeper 實現(xiàn)為例,對服務提供者與服務消費者進行整體流程分析。
如何配置條件路由規(guī)則
可以直接通過 dubbo-admin進行配置:
這些配置可以分成全局配置和服務配置兩類。
全局配置
對應應用級全局路由規(guī)則配置。例如:
/dubbo/config/dubbo/user-info-server(應用名).condition-router上面 schema 配置中,應用名配置為為 user-info-server,即該條規(guī)則只對該應用生效。后綴 ".condition-router" 表明該條規(guī)則為條件路由。除此之外,還可用 ".tag-router" 表示標簽路由。
服務配置
對應服務級所有路由規(guī)則配置。例如有如下規(guī)則 schema:
/dubbo/ com.ikurento.user.UserProvider(服務名) /routers該規(guī)則中服務名為 com.ikurento.user.UserProvider。
除了在控制面板 Dubbo Admin 中下發(fā)路由規(guī)則外,還可以在本地文件中配置相應的規(guī)則。比如說在文件?router_config.yml?中配置:
# dubbo router yaml configure file priority: 1 force: true conditions : ["host = 1.1.1.1 => host = 192.168.199.214"]更多配置方式請參考?條件路由配置。使用 dubbo-go 的路由功能時,注意以以下方式?引入對應的包:
總結
dubbo-go 整體路由規(guī)則功能實現(xiàn),已基本對齊 dubbo 2.7.x 版本,目前上文中描述過的條件路由、標簽路由與健康檢測路由,且支持本地及遠端配置路由規(guī)則,能滿足基本使用場景,但距離完善還有還長遠的路。dubbo-go 未來路由功能計劃如下:
本文對 dubbo-go 已有的路由功能進行了總結,至于源碼級的分析,本文不作展開。歡迎大家持續(xù)關注 dubbo-go 項目【https://github.com/apache/dubbo-go】。
本文作者:
鄒毅賢,Github ID @zouyx,開源愛好者,就職于 SheIn 供應鏈部門,負責供應鏈開放平臺。
原文鏈接
本文為云棲社區(qū)原創(chuàng)內容,未經(jīng)允許不得轉載。
總結
以上是生活随笔為你收集整理的dubbo-go 中如何实现路由策略功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美甲帮:数加平台打造大数据架构
- 下一篇: 从图森未来的数据处理平台,看Server