上一篇容器实践的结果是,4个client容器可以访问到服务grpc-server-svc.grpc-best.svc.cluster.local
,且该服务按负载均衡路由到4个版本的server容器。本篇将以此为基础,进行2个流量管理的实践。
1 按版本切流
按版本切流是使用ServiceMesh的常见场景。这里以100%流量路由到Java版本服务作为示例(拓扑如下图所示),演示基于GRPC服务的按版本流量管理。
DestinationRule
首先我们进入服务网格(ASM)实例,定义GRPC服务的DestinationRule
,将如下内容复制到页面。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
namespace: grpc-best
name: grpc-server-dr
spec:
host: grpc-server-svc
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v3
labels:
version: v3
- name: v4
labels:
version: v4
保存后结果示意如下。
VirtualService
接下来我们定义一个VirtualService
实现100%流量路由到Java版本服务。新建VirtualService,将如下内容复制保存。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
namespace: grpc-best
name: grpc-server-vs
spec:
hosts:
- "*"
gateways:
- grpc-gateway
http:
- match:
- port: 9996
route:
- destination:
host: grpc-server-svc
subset: v1
weight: 100
验证
执行如下脚本进行验证。
for i in {1..100}; do
docker exec -e GRPC_SERVER="${INGRESS_IP}" -it "$client_node_container" node mesh_client.js >> mesh_result
done
sort mesh_result | grep -v "^[[:space:]]*$"| uniq -c | sort -nrk1
预期结果如下。
100 TalkOneAnswerMore:JAVA
100 TalkMoreAnswerOne:JAVA
100 TalkBidirectional:JAVA
100 Talk:JAVA
2 按GRPC API切流
相比按版本进行流量管理,按GRPC API进行切流是更细粒度的切流方式。我们有4个GRPC的API、4个版本的服务,这里演示一种极端的情况,每一种API路由到指定的一个版本的服务上(拓扑如下图所示)。
VirtualService
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
namespace: grpc-best
name: grpc-server-vs
spec:
hosts:
- "*"
gateways:
- grpc-gateway
http:
- match:
- port: 9996
- uri:
exact: /org.feuyeux.grpc.LandingService/talk
route:
- destination:
host: grpc-server-svc
subset: v1
weight: 100
- match:
- port: 9996
- uri:
exact: /org.feuyeux.grpc.LandingService/talkOneAnswerMore
route:
- destination:
host: grpc-server-svc
subset: v2
weight: 100
- match:
- port: 9996
- uri:
exact: /org.feuyeux.grpc.LandingService/talkMoreAnswerOne
route:
- destination:
host: grpc-server-svc
subset: v3
weight: 100
- match:
- port: 9996
- uri:
exact: /org.feuyeux.grpc.LandingService/talkBidirectional
route:
- destination:
host: grpc-server-svc
subset: v4
weight: 100
验证
执行如下脚本进行验证。
for i in {1..100}; do
docker exec -e GRPC_SERVER="${INGRESS_IP}" -it "$client_node_container" node mesh_client.js >> mesh_result
done
sort mesh_result | grep -v "^[[:space:]]*$"| uniq -c | sort -nrk1
预期结果如下。
100 TalkOneAnswerMore:GOLANG
100 TalkMoreAnswerOne:NODEJS
100 TalkBidirectional:PYTHON
100 Talk:JAVA