現代服務網格架構提供了不少的新功能,基礎設施相關的依賴部分被逐步從代碼中移除,極大的下降了編碼工做量。除此以外,這一架構的智能路由功能還把金絲雀發佈以及相似功能大大的簡化了。git
接下來的內容會探討一下,Istio 路由規則是如何使用 Opentracing Baggage 的。github
想像一個場景,這個場景中咱們須要經過 User-Agent
Header 來鑑別 Safari 用戶,並把它們重定向到服務的一個特定版本去。這是一個典型的金絲雀場景:新版本發佈時,首先開放給一部分用戶。然而很明顯只有第一個服務可以接收到 User-Agent
頭,若是路由規則中涉及到調用關係圖中位置較低(靠後)的服務,就不得不把這個 Header 信息傳播給全部途中通過的服務。這是一個分佈式上下文傳播的典型用例,不少跟蹤系統都有這個功能。咱們接下來會看看 Jaeger 的 OpenTracing 實現。api
Baggage 條目是字符串組成的鍵值對,和 Span/SpanContext
互相關聯,在一個 Trace 的範圍內,會在全部的下游 Span 中進行傳播。微信
若是你的網格中使用的是 OpenTracing,那麼就已經有這個功能了;若是不是,那就有點不幸了:須要經過其餘的 跟蹤 Header 來傳遞 User-Agent
值了,這樣就須要修途經的全部服務。架構
Istio 缺省使用的 B3 傳播是沒有提供 Baggage 頭的。可是能夠用 Brave(Zipkin 的 Java 客戶端)來配置 Baggage 支持。通常會使用 baggage-key:value
的格式。Jaeger 實現了一個 B3 解碼器,也用一樣的格式來處理 Baggage。能夠在這裏查看 B3 Baggage 實現的進度。分佈式
Demo
能夠在當前的活動 Span 中這樣設置 Baggage:編碼
tracer.activeSpan().setBaggageItem(「user-agent」, userAgent);url
這必須在第一個服務中完成。最後一個須要完成的任務就是定義一個識別 Baggage Header 的路由。下面的路由定義會查看請求是否包含了帶有 user-agent:Safari
條目的 Baggage,若是有,就進行轉發:spa
apiVersion: config.istio.io/v1alpha2 kind: RouteRule metadata: name: recommendation-safari spec: destination: namespace: tutorial name: recommendation precedence: 2 match: request: headers: baggage-user-agent: regex: ".*Safari.*" route: - labels: version: v2
若是是新版本的 Istio(0.8.0 之後):.net
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: recommendation-safari spec: hosts: - recommendation http: - match: - headers: baggage-user-agent: regex: ".*Safari.*" route: - destination: host: recommendation subset: v2 --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: recommendation-destination spec: host: recommendation subsets: - name: v2 labels: version: v2
如今全部的配置都已經完成,Safari 用戶會被重定向到推薦的 v2 服務。
相關連接
OpenTracing:
http://opentracing.io/
OpenTracing baggage 規範:
https://github.com/opentracing/specification/blob/master/specification.md#set-a-baggage-item
Jaeger 客戶端的 B3 Baggage 支持:
https://github.com/jaegertracing/jaeger/issues/755#issuecomment-393929718
OpenShift 的 Istio 教程:
https://github.com/redhat-developer-demos/istio-tutorial
Kiali:
https://kiali.org/
本文分享自微信公衆號 - 僞架構師(fake-architect)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。