Se o seu Knative Service adota uma arquitetura de sistema distribuído ou microsserviços, use o protocolo gRPC para aumentar a eficiência da comunicação entre cliente e servidor. O ACK Knative oferece suporte aos protocolos HTTP e HTTP/2, incluindo gRPC.
Pré-requisitos
O Knative deve estar implantado em seu cluster. Para mais informações, consulte Deploy and gerencie Knative components.
Etapa 1: Implantar um service gRPC
Faça login no ACK console. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique em no nome do cluster que deseja gerenciar e escolha no painel de navegação à esquerda.
-
Na página Knative, clique em na aba Services. Defina o Namespace como default, clique em Create from Template e selecione Custom na lista suspensa Sample Template. Copie o conteúdo abaixo para o editor de modelo e clique em Create para crie um Knative Service chamado helloworld-grpc.
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 # The image contains a tool that is used to test gRPC by providing a gRPC Service to respond to requests. env: - name: TARGET value: "Knative" ports: - containerPort: 9000 name: h2c # Set the name of the gRPC Service in the Knative port section to h2c. protocol: TCP -
Adicione um mapeamento ao arquivo Hosts. Mapeie o nome de domínio padrão na coluna Default Domain para o endereço do gateway na coluna Gateway da aba Services.
Localize o arquivo Hosts em sua máquina e adicione o mapeamento. O formato deve ser Endereço do gateway + Caractere de espaço + Nome de domínio padrão. Em seguida, utilize o nome de domínio padrão para acessar o service gRPC.
Exemplo:
121.xx.xxx.xx helloworld-grpc.default.example.com
Etapa 2: Verifique a disponibilidade do service gRPC
Acesse o repositório grpcbin e instale a versão do BloomRPC compatível com seu sistema operacional.
-
Copie o conteúdo a seguir para o arquivo
gRPC.protoe salve-o em sua máquina local:syntax = "proto3"; package grpcbin; service GRPCBin { rpc Index(EmptyMessage) returns (IndexReply) {} // Define an RPC method that takes an empty message as the input and returns an empty message as the output. rpc Empty(EmptyMessage) returns (EmptyMessage) {} // Define an RPC method that takes a dummy message as the input and returns a dummy message as the output. rpc DummyUnary(DummyMessage) returns (DummyMessage) {} // Define an RPC method that takes a dummy message as the input and returns a stream of dummy messages (10 messages) as the output. rpc DummyServerStream(DummyMessage) returns (stream DummyMessage) {} // Define an RPC method that takes a stream of dummy messages (10 messages) as the input and returns a dummy message as the output. rpc DummyClientStream(stream DummyMessage) returns (DummyMessage) {} // Define an RPC method that takes a stream of dummy messages as the input and returns a stream of dummy messages as the output. rpc DummyBidirectionalStreamStream(stream DummyMessage) returns (stream DummyMessage) {} // Define an RPC method that returns a message of the specified gRPC error. rpc SpecificError(SpecificErrorRequest) returns (EmptyMessage) {} // Define an RPC method that returns a message of a random error. rpc RandomError(EmptyMessage) returns (EmptyMessage) {} // Define an RPC method that returns a header. rpc HeadersUnary(EmptyMessage) returns (HeadersMessage) {} // Define an RPC method that does not return any messages. 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; }O service gRPC utiliza HTTP/2. O caminho desse service segue o formato
{Nome do pacote}.{Nome do service}/{Nome do método}. Configure o gateway do Knative para rotear pacotes gRPC definindo o campoPathconforme esse padrão. Por exemplo, para invocar o métodoIndexdo pacotegrpcbin, o caminho serágrpcbin.GRPCBin/Index. -
Utilize o BloomRPC para validar a disponibilidade do service gRPC. A confirmação ocorre quando o servidor retorna respostas normalmente.
Importe o arquivo
gRPC.protono BloomRPC.No painel de navegação à esquerda, clique em no método DummyUnary e especifique
Nome de domínio:Portana parte superior da página. Exemplo:helloworld-grpc.default.example.com:80.Clique em no botão verde e verifique se as respostas retornadas pelo servidor estão corretas.
Referências
É possível configure um certificado para acessar services via HTTPS usando um nome de domínio personalizado. Para mais detalhes, consulte Configure HTTPS access.