服务网格ASM支持对gRPC协议服务端进行流量管理,本文介绍如何按照gRPC协议版本和gRPC API进行流量管理。
按gRPC协议版本进行流量管理
gRPC协议服务端Service包括Java、Go、NodeJS和Python版本,以下以100%流量路由到Java版本服务端Service作为示例。
登录ASM控制台。
在左侧导航栏,选择 。
在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。
在网格详情页面左侧导航栏,选择 ,然后在右侧页面,单击使用YAML创建。
选择命名空间,在文本框中输入以下信息,然后单击创建。
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
在网格详情页面左侧导航栏,选择 ,然后在右侧页面,单击使用YAML创建。
选择命名空间,在文本框中输入以下信息,然后单击创建。
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
执行如下命令,验证是否100%流量路由到Java版本服务端Service。
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
按gRPC API进行流量管理
按gRPC API进行流量管理是更细粒度的流量管理方式。通过实现通信模型最终构建gRPC API,详细介绍请参见gRPC协议的通信模型实现。现在有4个协议gRPC的API、4个gRPC协议版本的Service。这里演示一种极端的情况,每一种API路由到指定的一个版本的服务上。
登录ASM控制台。
在左侧导航栏,选择 。
在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。
在网格详情页面左侧导航栏,选择 ,然后在右侧页面,单击使用YAML创建。
选择命名空间,在文本框中输入以下信息,然后单击创建。
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
执行如下命令,验证是否每一种API路由到指定的一个版本的服务。
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