服务网格ASM支持对gRPC协议服务端进行流量管理,本文介绍如何按照gRPC协议版本和gRPC API进行流量管理。

按gRPC协议版本进行流量管理

gRPC协议服务端Service包括Java、Go、NodeJS和Python版本,以下以100%流量路由到Java版本服务端Service作为示例。版本
  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 控制平面区域,单击DestinationRule页签,然后单击新建
  5. 新建页面,选择命名空间,在文本框中输入以下信息,然后单击确定
    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
  6. 控制平面区域,单击VirtualService页签,然后单击新建
  7. 新建页面,选择命名空间,在文本框中输入以下信息,然后单击确定
    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路由到指定的一个版本的服务上。API
  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 控制平面区域,单击VirtualService页签,然后单击新建
  5. 新建页面,选择命名空间,在文本框中输入以下信息,然后单击确定
    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