服务网格GRPC协议多种编程语言实践-4.GRPC协议示例的网格实践

上一篇容器实践的结果是,4个client容器可以访问到服务grpc-server-svc.grpc-best.svc.cluster.local,且该服务按负载均衡路由到4个版本的server容器。本篇将以此为基础,进行2个流量管理的实践。

1 按版本切流

按版本切流是使用ServiceMesh的常见场景。这里以100%流量路由到Java版本服务作为示例(拓扑如下图所示),演示基于GRPC服务的按版本流量管理。

服务网格GRPC协议多种编程语言实践-4.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

保存后结果示意如下。

服务网格GRPC协议多种编程语言实践-4.GRPC协议示例的网格实践

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路由到指定的一个版本的服务上(拓扑如下图所示)。

服务网格GRPC协议多种编程语言实践-4.GRPC协议示例的网格实践

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
上一篇:通过ASM入口网关实现HTTP请求网格内GRPC服务


下一篇:服务网格GRPC协议多种编程语言实践-1 GRPC协议示例的设计