日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dubbo-go 中如何实现路由策略功能

發布時間:2024/8/23 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dubbo-go 中如何实现路由策略功能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

可在控制面對服務的路由進行精細控制,是一個成熟 RPC 系統必備的能力之一。作為一個逐步走向成熟的 RPC 系統,Apache/dubbo-go(以下簡稱 dubbo-go )的最新版本 v1.4 中已經實現了?Condition Router 和 Health Instance First Router 等路由。

實現一個功能,首先要清楚其本質。那到底什么是路由規則,我們為什么需要路由規則?設想這么一個場景:現在要對某服務的新版本進行一次灰度發布,需要將一些對實驗流量進行引流到灰度機器,其余流量依舊使用正常服務。此時就可以考慮使用路由策略達到目的。

路由規則( routing rule )是為了改變網絡流量所經過的途徑而修改路由信息的技術,通過改變路由屬性(包括可達性)達到引流的目的。在發起一次 RPC 調用前,它會過濾目標服務器地址,將消費端最終發起 RPC 調用的目標范圍限定在過濾后的地址列表。

目標

路由策略的關鍵點在于:

  • 設定規則:用戶可通過什么方式把路由規則傳遞給使用方;
  • 解析規則:涉及到的路由規則的語法,以及對語法的解析。比如,要考慮規則是否支持邏輯運算;
  • 規則匹配:如何判斷一個服務實例是否匹配某條路由規則。
  • 綜上,可以總結出 dubbo-go 路由規則的目標有:

    • 支持從多個地方,如本地文件、遠程配置中心,讀取路由規則信息;
    • 設計一套定義路由規則的簡單語法;
    • 保持與 Dubbo 的兼容,降低學習成本;

    總體設計

    首先要考慮的是:路由規則應該放在整個服務治理周期的哪個階段呢?dubbo-go 的架構圖如下:

    可以看到圖中的 Router 介于 Cluster 和 LB(load balance) 之間,這就意味著一個請求被發送到哪個服務器,是經過了 Cluster - Router - LB 三層處理的。可以將 Router 看做是一種較小范圍的邏輯分組。

    而在 Router 內部,將經歷三個步驟:讀取路由規則,解析路由規則,執行匹配。為了提高程序效率,路由規則的讀取和解析都是可以提前完成的,比如在應用啟動的時候。

    根據上面圖中流程,可清楚地明晰 Router 的路由流程。

    接口設計

    根據前面的目標和總體設計,我們很容易地設計出 Router 的接口。

    路由規則接口

    Router 是 dubbo-go 路由最核心的接口。它可以理解為,當一個請求(或者說一次調用)過來的時候,判斷哪些實例是滿足該規則的抽象。其實際代碼定義如下:

    其核心在于 Route 方法,執行匹配邏輯。目前該接口的實現有:

    • ListenableRouter
    • AppRouter
    • ConditionRouter
    • HealthCheckRouter
    • FileConditionRouter

    在現實實現中,不同的不同的路由規則是有優先級的,即 Router 的另一個重要特性:Priority 。它決定了的是路由規則的組織方式。

    路由規則鏈式接口

    除了優先級,多個路由規則的執行是有順序的。有路由規則的 Chain 接口如下:

    Chain 實現了對不同路由規則的組織。從命名也可以看出,它是責任鏈模式的一種應用,通過該接口可將路由規則組成一條鏈,鏈中每條規則的輸出都是下一條規則的輸入。至于整個鏈路中不同規則的順序,取決于每個規則的 Priority ,它決定了每條路由規則的排序。

    讀取路由規則接口

    讀取路由規則對應 FileRouterFactory 和 RouterFactory 兩個接口。一般地,只需要一個 RouterFactory 接口就可以,但考慮到路由規則的不同來源,比如規則可能是從配置文件里面讀取過來,也可能是直接在服務的 URL 解析而來,所以我們抽象出來了兩個接口:

    FileRouterFactory

    RouterFactory

    我們一般將這兩個接口對應本地和遠程兩種情況:

    • 本地路由規則配置:在原配置加載階段,新增讀取路由配置文件步驟。使用 FileRouterFactory?解析后,生成對應路由規則,然后加載到緩存中。
    • 遠程路由規則配置:讀取遠程配置并且監聽其變化,篩選符合路由規則配置信息,通過 RouterFactory 生成對應路由規則,同樣加載到緩存中備用。

    實現

    從圖里面可以看出,實現路由規則以兼容 dubbo 為首要目標,降低使用者的學習成本為輔助目標。與配置中心模塊相結合,實現路由規則遠程統一管理與下發。

    規則類型

    下面介紹一下 dubbo-go 現有的路由規則實現。

    條件路由

    Condition Router 作為 dubbo-go 中第一個支持的路由規則實現,允許用戶通過配置文件及配置中心管理路由規則。與之相似的一個概念是 dubbo-go 的 group,但是條件路由提供了更加細粒度的控制手段和更加豐富的表達語義。比較典型的使用場景是黑白名單設置,灰度以及測試等。

    健康檢查路由

    在 RPC 調用中,如果希望盡可能地將請求命中到那些處理能力快、處于健康狀態的實例,即可以考慮該路由。該路由判定斷定某個服務提供者的不健康度,優先調用那些健康的服務實例。對 "健康" 度的判定,dubbo-go 默認的實現策略是:某服務的錯誤比例到達某一個閾值或者請求活躍數大于上限,則認為其不健康,頗類似于服務熔斷。dubbo-go 當然亦允許用戶擴展其健康檢測策略。

    標簽路由

    以 Provider 為維度,將某一個或多個服務的提供者劃分到同一個分組,約束流量只在指定分組中流轉,從而實現流量隔離的目的,即為標簽路由。它可以作為藍綠發布、灰度發布等場景的能力基礎。

    • 靜態打標:根據配置文件所配置的標簽,固定給 Provider 設置標簽。
    • 動態打標:基于健康檢查路由,根據服務不同時刻,不同狀態,動態在 Provider 設置適合的標簽。

    示例

    下面以條件路由在 zookeeper 實現為例,對服務提供者與服務消費者進行整體流程分析。

    如何配置條件路由規則

    可以直接通過 dubbo-admin進行配置:

    這些配置可以分成全局配置和服務配置兩類。

    全局配置

    對應應用級全局路由規則配置。例如:

    /dubbo/config/dubbo/user-info-server(應用名).condition-router

    上面 schema 配置中,應用名配置為為 user-info-server,即該條規則只對該應用生效。后綴 ".condition-router" 表明該條規則為條件路由。除此之外,還可用 ".tag-router" 表示標簽路由。

    服務配置

    對應服務級所有路由規則配置。例如有如下規則 schema:

    /dubbo/ com.ikurento.user.UserProvider(服務名) /routers

    該規則中服務名為 com.ikurento.user.UserProvider。

    除了在控制面板 Dubbo Admin 中下發路由規則外,還可以在本地文件中配置相應的規則。比如說在文件?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 整體路由規則功能實現,已基本對齊 dubbo 2.7.x 版本,目前上文中描述過的條件路由、標簽路由與健康檢測路由,且支持本地及遠端配置路由規則,能滿足基本使用場景,但距離完善還有還長遠的路。dubbo-go 未來路由功能計劃如下:

  • 更多的配置中心【如 etcd/consul 等】支持,理論上已經支持,但還沒測試;
  • service-router(未支持);
  • 標簽路由-配置中心(未支持);
  • 目前路由與配置中心結合的代碼,對新增路由規則并不友好,有一定接入成本。
  • 本文對 dubbo-go 已有的路由功能進行了總結,至于源碼級的分析,本文不作展開。歡迎大家持續關注 dubbo-go 項目【https://github.com/apache/dubbo-go】。

    本文作者:
    鄒毅賢,Github ID @zouyx,開源愛好者,就職于 SheIn 供應鏈部門,負責供應鏈開放平臺。

    原文鏈接
    本文為云棲社區原創內容,未經允許不得轉載。

    總結

    以上是生活随笔為你收集整理的dubbo-go 中如何实现路由策略功能的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。