现代服务网格架构提供了不少的新功能,基础设施相关的依赖部分被逐步从代码中移除,极大的下降了编码工做量。除此以外,这一架构的智能路由功能还把金丝雀发布以及相似功能大大的简化了。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源创计划”,欢迎正在阅读的你也加入,一块儿分享。