如果您的Knative服务采用分布式系统或微服务架构场景,您可以使用gRPC协议提升客户端与服务器端的通讯效率。ACK Knative支持HTTP、HTTP2(包括gRPC)访问协议。您可以在Knative Service的YAML文件中部署gRPC服务,Knative网关能自动实现对gRPC协议的路由。
前提条件
已在集群中部署Knative,请参见部署Knative。
步骤一:部署gRPC服务
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在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
在Hosts文件中添加绑定信息。将服务管理页面的默认域名和访问网关进行Host绑定。
找到计算机中Hosts文件所在位置,然后在Hosts文件中添加绑定信息,格式为
访问网关+空格+默认域名
,然后通过域名直接访问服务。绑定样例如下:121.xx.xxx.xx helloworld-grpc.default.example.com
步骤二:验证gRPC服务的可用性
访问grpcbin,安装适用于您操作系统的BloomRPC。
将以下代码粘贴至
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
。使用BloomRPC测试gRPC服务的可用性,若服务端正常返回响应,则表示gRPC服务可用。
将
gRPC.proto
文件导入BloomRPC。在左侧导航栏,单击DummyUnary调用方法,并在页面顶部设置
调用域名:端口
。例如helloworld-grpc.default.example.com:80
。单击绿色执行按钮,查看服务端返回的响应是否正常。
相关文档
您可以为自定义域名配置相应的HTTPS证书,请参见配置HTTPS证书访问。