在Knative中部署gRPC服务

如果您的Knative服务采用分布式系统或微服务架构场景,您可以使用gRPC协议提升客户端与服务器端的通讯效率。ACK Knative支持HTTP、HTTP2(包括gRPC)访问协议。您可以在Knative Service的YAML文件中部署gRPC服务,Knative网关能自动实现对gRPC协议的路由。

前提条件

已在集群中部署Knative,请参见部署Knative

步骤一:部署gRPC服务

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Knative

  3. Knative页面的服务管理页签下,选择命名空间default,然后单击使用模板创建,单击示例模板右侧的下拉列表,选择自定义,将以下示例代码粘贴至模板,最后单击创建,创建一个名为helloworld-grpc的Knative服务。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: helloworld-grpc
    spec:
      template:
        metadata:
          annotations:
            autoscaling.knative.dev/class: mpa.autoscaling.knative.dev
        spec:
          containers:
          - image: docker.io/moul/grpcbin # 该镜像是一个用于测试gRPC的工具,它通过提供gRPC服务来响应请求。
            env:
            - name: TARGET
              value: "Knative"
            ports:
            - containerPort: 9000
              name: h2c # gRPC服务在Knative服务中port字段下的name设置为h2c。
              protocol: TCP
  4. 在Hosts文件中添加绑定信息。将服务管理页面的默认域名访问网关进行Host绑定。

    找到计算机中Hosts文件所在位置,然后在Hosts文件中添加绑定信息,格式为访问网关+空格+默认域名,然后通过域名直接访问服务。绑定样例如下:

    121.xx.xxx.xx helloworld-grpc.default.example.com

步骤二:验证gRPC服务的可用性

  1. 访问grpcbin,安装适用于您操作系统的BloomRPC。

  2. 将以下代码粘贴至gRPC.proto文件,然后保存至本地。

    syntax = "proto3";
    
    package grpcbin;
    
    service GRPCBin {
      rpc Index(EmptyMessage) returns (IndexReply) {}
      // 无参数调用的方法,调用后回返回一个空响应。
      rpc Empty(EmptyMessage) returns (EmptyMessage) {}
      // 响应会返回请求的参数。
      rpc DummyUnary(DummyMessage) returns (DummyMessage) {}
      // 响应为流式的调用,会分10次响应消息。
      rpc DummyServerStream(DummyMessage) returns (stream DummyMessage) {}
      // 请求为流式的调用,会接受10次请求并返回最后一次的body。
      rpc DummyClientStream(stream DummyMessage) returns (DummyMessage) {}
      // 请求响应都为流式的方法。
      rpc DummyBidirectionalStreamStream(stream DummyMessage) returns (stream DummyMessage) {}
      // 该方法会返回指定的grpc错误。
      rpc SpecificError(SpecificErrorRequest) returns (EmptyMessage) {}
      // 该方法调用会随机返回一个错误。
      rpc RandomError(EmptyMessage) returns (EmptyMessage) {}
      // 该方法调用会返回header。
      rpc HeadersUnary(EmptyMessage) returns (HeadersMessage) {}
      // 该方法调用不会返回响应。
      rpc NoResponseUnary(EmptyMessage) returns (EmptyMessage) {}
    }
    
    message HeadersMessage {
      message Values {
        repeated string values = 1;
      }
      map<string, Values> Metadata = 1;
    }
    
    message SpecificErrorRequest {
      uint32 code = 1;
      string reason = 2;
    }
    
    message EmptyMessage {}
    
    message DummyMessage {
      message Sub {
        string f_string = 1;
      }
      enum Enum {
        ENUM_0 = 0;
        ENUM_1 = 1;
        ENUM_2 = 2;
      }
      string f_string = 1;
      repeated string f_strings = 2;
      int32 f_int32 = 3;
      repeated int32 f_int32s = 4;
      Enum f_enum = 5;
      repeated Enum f_enums = 6;
      Sub f_sub = 7;
      repeated Sub f_subs = 8;
      bool f_bool = 9;
      repeated bool f_bools = 10;
      int64 f_int64 = 11;
      repeated int64 f_int64s= 12;
      bytes f_bytes = 13;
      repeated bytes f_bytess = 14;
      float f_float = 15;
      repeated float f_floats = 16;
    }
    
    message IndexReply {
      message Endpoint {
        string path = 1;
        string description = 2;
      }
      string description = 1;
      repeated Endpoint endpoints = 2;
    }

    gRPC服务底层基于HTTP2协议,其路径格式为{包名}.{服务名}/{方法名},基于此,Knative网关可以在Path字段中实现对gRPC协议的路由。例如,如果使用gRPC访问grpcbin的Index方法,在HTTP2协议中,该Path字段值为grpcbin.GRPCBin/Index

  3. 使用BloomRPC测试gRPC服务的可用性,若服务端正常返回响应,则表示gRPC服务可用。

    1. gRPC.proto文件导入BloomRPC。

    2. 在左侧导航栏,单击DummyUnary调用方法,并在页面顶部设置调用域名:端口。例如helloworld-grpc.default.example.com:80

    3. 单击绿色执行按钮,查看服务端返回的响应是否正常。

相关文档

您可以为自定义域名配置相应的HTTPS证书,请参见配置HTTPS证书访问