Protocolos de comunicação

Note

Em construção

Subsections of Protocolos de comunicação

GRPC

Note

Em construção

Subsections of GRPC

Compilador local


Instalando compilador do protobuf

link: Como posso instalar o protobuf no ubuntu 12.04?

ou

sudo apt-get install libprotobuf-java protobuf-compiler

Gerando codigo

protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/<file>.proto
  • I - diretorio raiz do projeto
  • java_out - Diretorio onde vai ser gerado o codigo
  • Diretorio do arquivo proto

Criando mensagens


link: https://developers.google.com/protocol-buffers/docs/proto3

Exemplo

message SearchRequest {
  string query = 1;
  int32 page_number = 2;  // Which page number do we want?
  int32 result_per_page = 3;  // Number of results to return per page.
}
  • os numero servem para definir a ordem dos dado na serialização para binario
  • Caso remova um campo, e recomendado não usar o numero que ele pertecia, pois isso pode dar conflito no futuro, para garantir que isso o mesmo não seja usado vc pode marcalos como reserved (reservados / excluidos)
message Foo {
  reserved 2, 15, 9 to 11;
  reserved "foo", "bar";
}

Enums

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
  enum Corpus {
    UNIVERSAL = 0;
    WEB = 1;
    IMAGES = 2;
    LOCAL = 3;
    NEWS = 4;
    PRODUCTS = 5;
    VIDEO = 6;
  }
  Corpus corpus = 4;
}
// Usando alias para representar a mesma coisa 

message MyMessage1 {
  enum EnumAllowingAlias {
    option allow_alias = true;  // necessario deixar essa opção como true, senão vai dar erro, como abaixo
    UNKNOWN = 0;
    STARTED = 1;
    RUNNING = 1;
  }
}

message MyMessage2 {
  enum EnumNotAllowingAlias {
    UNKNOWN = 0;
    STARTED = 1;
    // RUNNING = 1;  // Uncommenting this line will cause a compile error inside Google and a warning message outside.
  }
}

//Observe que você não pode misturar nomes de campo e valores numéricos na mesma reservedinstrução.

Tipos de Mensagem personalizados

message SearchResponse {
  repeated Result results = 1; //o repeat dis que pode ser repetido os itens, semelhate a uma lista
}

message Result {
  string url = 1;
  string title = 2;
  repeated string snippets = 3;
}

// Tipo aninhado

message SearchResponse {
  message Result {
    string url = 1;
    string title = 2;
    repeated string snippets = 3;
  }
  repeated Result results = 1;
}

// chamdando tipo aninhado

message SomeOtherMessage {
  SearchResponse.Result result = 1;
}

// Exemplo de message aninhada

message Outer {                  // Level 0
  message MiddleAA {  // Level 1
    message Inner {   // Level 2
      int64 ival = 1;
      bool  booly = 2;
    }
  }
  message MiddleBB {  // Level 1
    message Inner {   // Level 2
      int32 ival = 1;
      bool  booly = 2;
    }
  }
}

caso a mensagem que queira colocar dentro da mensagem esteja em outro proto, vc pode importa-lo

Importando

import "myproject/other_protos.proto";

Criando metodos

Tipo de metodos GRPC

O gRPC permite definir quatro tipos de método de serviço:


RPCs unários

Em que o cliente envia uma única solicitação ao servidor e obtém uma única resposta, exatamente como uma chamada de função normal.

rpc SayHello(HelloRequest) returns (HelloResponse);

RPCs de streaming de servidor

Em que o cliente envia uma solicitação ao servidor e obtém um stream para ler uma sequência de mensagens de volta. O cliente lê a partir do fluxo retornado até que não haja mais mensagens. O gRPC garante a ordem das mensagens em uma chamada RPC individual.

rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);

RPCs de streaming de cliente

Em que o cliente grava uma sequência de mensagens e as envia ao servidor, novamente usando um fluxo fornecido. Depois que o cliente termina de escrever as mensagens, ele espera que o servidor as leia e retorne sua resposta. Mais uma vez, o gRPC garante a ordem das mensagens em uma chamada RPC individual.

rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);

RPCs de streaming bidirecional

Em que ambos os lados enviam uma sequência de mensagens usando um fluxo de leitura e gravação. Os dois fluxos operam de forma independente, para que os clientes e servidores possam ler e escrever na ordem que quiserem: por exemplo, o servidor pode esperar para receber todas as mensagens do cliente antes de escrever suas respostas, ou pode alternativamente ler uma mensagem e depois escrever uma mensagem, ou alguma outra combinação de leituras e gravações. A ordem das mensagens em cada fluxo é preservada.

rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);