路由是 Linkerd 的核心功能:接受請求(HTTP,Thrift永罚,Mux或其他協(xié)議)栏饮,并將該請求發(fā)送到正確的目標(biāo)局服。本指南將詳細(xì)解釋 linkerd 如何確定請求應(yīng)該發(fā)送到哪里。這個過程由4個步驟組成:identification/識別浊竟,binding/綁定怨喘,resolution/解析和load balancing/負(fù)載均衡。
識別
Identification/識別 是將一個名稱(也稱為路徑)分派給該請求的動作振定。名稱是斜杠分隔的字符串必怜,表示請求的目的地。默認(rèn)情況下后频,linkerd 使用一個名為 io.l5d.header.token
的identifier梳庆,該 identifier 根據(jù) Host header 為請求命名,如下所示: /svc/<HOST>
卑惜。這意味著GET http://example/hello
的HTTP 請求將被分配名稱 /svc/example
膏执。
(請注意,該URL的路徑, /hello , 在名稱中被刪除露久。它仍將作為請求的一部分被代理轉(zhuǎn)發(fā) -該名稱僅決定請求如何路由更米,而不是發(fā)送到目標(biāo)服務(wù)的內(nèi)容)
當(dāng)然,identifier 是一個可插拔的模塊毫痕,并可以用自定義的 identifier 來替換征峦,這個 identifier 基于你想要的任何邏輯來分配名稱給請求迟几。
identifier 分配給請求的名稱稱為 service name,因為它應(yīng)該編碼應(yīng)用程序指定的目標(biāo)地址眶痰。它通常不編碼群集瘤旨,區(qū)域,環(huán)境或主機(jī)的信息竖伯,因為您的應(yīng)用程序不需要擔(dān)心這些問題存哲。
例如,如果您的應(yīng)用程序想要向 "users" 服務(wù)發(fā)出請求七婴,它可以發(fā)出一個 HTTP GET 請求給linkerd祟偷,以 "users" 作為 Host header。 io.l5d.header.token
identifier將分配 /svc/users
作為該請求的 service name打厘。
綁定
一旦將服務(wù)名稱分配給請求修肠,該名稱將被 dtab(delegation table/委托表的簡稱)進(jìn)行轉(zhuǎn)換。這被稱為 binding/綁定户盯。有關(guān) dtab 轉(zhuǎn)換如何工作的詳細(xì)文檔可以在 Dtabs頁面 中找到嵌施。
Dtabs 編碼描述 service name 如何轉(zhuǎn)換為 client name 的路由規(guī)則。client name 是 replicaset/副本集的名稱莽鸭,通常是服務(wù)發(fā)現(xiàn)條目的名稱吗伤。與service name 不同,client name 通常包含集群硫眨,區(qū)域和/或環(huán)境等細(xì)節(jié)足淆。
client names 通常以 /$
or /#
開頭. (兩個前綴的差別請看下面)
繼續(xù)這個例子,假設(shè)我們有以下 dtab:
/env => /#/io.l5d.serversets/discovery
/svc => /env/prod
service name /svc/users
將像這樣被綁定:
/svc/users
/env/prod/users
/#/io.l5d.serversets/discovery/prod/users
最終 /#/io.l5d.serversets/discovery/prod/users
成為 client name.
解析
解析/Resolution 是將 client name 解析為一組物理端點(IP地址+端口)礁阁。解析是通過稱為namer 的東西來完成的巧号,通常會對某些服務(wù)發(fā)現(xiàn)后端進(jìn)行查找。linkerd 帶有大量內(nèi)建的主流服務(wù)發(fā)現(xiàn)的實現(xiàn)姥闭。請在 linkerd namer文檔 中詳細(xì)了解如何配置它們丹鸿。
以 /$
開頭的 client name 表示應(yīng)該加載 classpath 中的 namer 來綁定該名稱,而以 /# 開頭的 client name 表示加載 linkerd 配置中的 namer 來綁定該名稱泣栈。
例如卜高,假設(shè)我們有一個 client name /#/io.l5d.serversets/discovery/prod/user
。這意味著來自 linkerd 配置的 io.l5d.serversets
namer 應(yīng)該查找 /discovery/prod/users
服務(wù)器集(查找的結(jié)果是一組物理地址)南片。
類似地掺涛,client name /$/inet/users/8888
意味要為 inet namer 的搜索classpath。通過對"users" 進(jìn)行 DNS 查找并使用端8888疼进,該 namer 獲取一組地址薪缆。
負(fù)載均衡
一旦 linkerd 擁有副本集,它使用 負(fù)載平衡算法 來確定發(fā)送請求到哪里。因為 linkerd 在請求層而不是在連接層進(jìn)行負(fù)載平衡拣帽,所以負(fù)載平衡算法可以利用請求延遲信息來減輕慢節(jié)點的負(fù)載疼电,并避開超載下掙扎的主機(jī)。
------- 截取自 Linkerd 官方文檔