全部产品
Search
文档中心

:管理gRPC协议示例流量

更新时间:Jun 05, 2023

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

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

gRPC协议服务端Service包括Java、Go、NodeJS和Python版本,以下以100%流量路由到Java版本服务端Service作为示例。版本

  1. 登录ASM控制台

  2. 在左侧导航栏,选择服务网格 > 网格管理

  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理

  4. 在网格详情页面左侧导航栏,选择流量管理中心 > 目标规则,然后在右侧页面,单击使用YAML创建

  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. 在网格详情页面左侧导航栏,选择流量管理中心 > 虚拟服务,然后在右侧页面,单击使用YAML创建

  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. 在网格详情页面左侧导航栏,选择流量管理中心 > 虚拟服务,然后在右侧页面,单击使用YAML创建

  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