前言已经部署好了微服务bookinfo,下面开始配置请求路由。

请求路由

首先一共4个微服务,分别是productpage(version=v1)、ratings(version=v1)、reviews(version=v1 v2 v3)、details(version=v1),我们需要先应用一个默认的目标规则。

定义DestinationRule

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: productpage
spec:
host: productpage
subsets:
- name: v1
labels:
version: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: details
spec:
host: details
subsets:
- name: v1
labels:
version: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v3
labels:
version: v3
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: ratings
spec:
host: ratings
subsets:
- name: v1
labels:
version: v1

我们在应用一个流量策略,控制所有的流量走v1版本的reviews

定义VirtualService

kind: VirtualService
metadata:
name: details
spec:
hosts:
- details
http:
- route:
- destination:
host: details
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- route:
- destination:
host: ratings
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1

浏览器访问http://192.168.1.110:31514/productpage,多次刷新页面,可以发现,reviews都是显示的v1版本

基于用户身份的路由

productpage服务请求reviews服务时,会在请求中自定义一个end-user,可以模拟下面这个场景的实验

我们模拟一个场景,当jason用户访问,将所有流量路由到v2版本的reviews,其他路由到v1版本的reviews

定义VirtualService

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- match:
- headers:
end-user:
exact: jason
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v1

我们验证一下,当不登陆的时候,始终请求的是v1版本的reviews

点击右上角Sign in,username填jason,password可以不填,右上角显示jason后,一直刷新页面,发现一直请求的确实是v2版本的reviews