通过Istio提供的服务路由功能,我们可以根据请求的信息轻松实现A/B测试。本节演示根据用户使用的浏览器来展示不同版本的Web界面。当用户使用Firefox浏览器访问时,会得到Vue版本实现的前端界面;当用户使用其他浏览器访问时,会得到React版本实现的前端界面。配置示例如下:
1 apiVersion: networking.istio.io/v1alpha3 2 kind: Gateway 3 metadata: 4 name: istio-lab-gateway 5 spec: 6 selector: 7 istio: ingressgateway # use Istio default gateway implementation 8 servers: 9 - port: 10 number: 80 11 name: http 12 protocol: HTTP 13 hosts: 14 - "*" 15 --- 16 apiVersion: networking.istio.io/v1alpha3 17 kind: DestinationRule 18 metadata: 19 name: service-js 20 spec: 21 host: service-js 22 subsets: 23 - name: v1 24 labels: 25 version: v1 26 - name: v2 27 labels: 28 version: v2 29 --- 30 apiVersion: networking.istio.io/v1alpha3 31 kind: VirtualService 32 metadata: 33 name: istio-lab 34 spec: 35 hosts: 36 - "*" 37 gateways: 38 - istio-lab-gateway 39 http: 40 - match: 41 - uri: 42 prefix: /env 43 route: 44 - destination: 45 host: service-python 46 - match: 47 - uri: 48 prefix: / 49 headers: 50 user-agent: 51 regex: ".*?(Firefox).*?" 52 route: 53 - destination: 54 host: service-js 55 subset: v2 56 - route: 57 - destination: 58 host: service-js 59 subset: v1
第46~55行定义的路由规则表明,当用户的请求携带的user-agent请求头正则匹配Firefox时,转发请求到sevice-js服务的v2版本。
第56~59行定义了默认的路由规则,当上面的条件都不符合时,把请求转发到sevice-js服务的v1版本。
通过上面的路由规则就会实现,当用户使用Chrome浏览器访问时,会得到React版本实现的前端界面;当用户使用Firefox浏览器访问时,会得到Vue版本实现的前端界面。这样就轻松实现用户界面的A/B版本测试。
【实验】
1)创建A/B测试路由规则:
$ kubectl apply -f istio/route/gateway-js-user-agent-v1-v2.yaml
2)浏览器访问。
通过浏览器访问地址http://11.11.11.112:31380/ ,并多次点击“发射”按钮。
使用Chrome浏览器会得到如图7-4所示的界面。
使用Firefox浏览器会得到如图7-5所示的界面。
3)清理:
$ kubectl delete -f istio/route/gateway-js-user-agent-v1-v2.yaml
图7-4 Chrome浏览器访问
图7-5 Firefox浏览器访问