如果您的Knative服務採用分布式系統或微服務架構情境,您可以使用gRPC協議提升用戶端與伺服器端的通訊效率。ACK Knative支援HTTP、HTTP2(包括gRPC)訪問協議。您可以在Knative Service的YAML檔案中部署gRPC服務,Knative網關能自動實現對gRPC協議的路由。
前提條件
已在叢集中部署Knative,請參見部署Knative。
步驟一:部署gRPC服務
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在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認證訪問。