5. gRPC: multi-linguagem
Objetivos desta aula:
- Desenvolvimento de aplicações distribuídas com gRPC com múltiplas linguagens de programação.
- Em particular, desenvolvimento de um servidor de nomes que permite publicar e pesquisar serviços gRPC no servidor de nomes
Materiais de apoio à aula
- Tutorial de introdução ao gRPC em Python
Pré-requisitos
- Python 3.5+
- Packages: grpcio, grpcio-tools e venv
Instalação das packages
-
Windows:
-
Correr o seguinte comando para criar um ambiente virtual:
python -m venv .venv
-
Correr o comando para ativar o ambiente virtual:
.venv\Scripts\activate
-
Correr o comando para instalar a package
grpcio
:python -m pip install grpcio
-
Correr o comando para instalar a package
grpcio-tools
:python -m pip install grpcio-tools
-
Correr o comando para desativar o ambiente virtual:
deactivate
-
-
Linux:
-
Correr o seguinte comando para criar um ambiente virtual:
python -m venv .venv
-
Correr o comando para ativar o ambiente virtual:
source .venv/bin/activate
-
Correr o comando para instalar a package
grpcio
:python -m pip install grpcio
-
Correr o comando para instalar a package
grpcio-tools
:python -m pip install grpcio-tools
-
Correr o comando para desativar o ambiente virtual:
deactivate
-
Java vs Python gRPC
-
Começe por fazer Clone ou Download do código fonte do exemplo de gRPC multi-linguagem.
-
Crie um ambiente virtual na diretoria base seguindo as instruções dadas acima.
-
Na diretoria
contract
, compile e execute os seguintes comandos:mvn install mvn exec:exec
- Assegure-se que, na sua máquina, o interpretador Python é lançado pelo comando que está indicado na tag
executable
no POM. Se não for, corrija o valor nessa tag e corra o último comando de novo.
- Assegure-se que, na sua máquina, o interpretador Python é lançado pelo comando que está indicado na tag
-
Analise a diretoria
generated-sources/protobuf
e o código gerado nas diretoriasjava
epython
. -
Teste o servidor, executando na diretoria
java_server
o comandomvn compile exec:java
. -
Teste o cliente, executando na diretoria
python_client
o comando pythonclient.py
. -
Analise as diferenças e as semelhanças entre os dois clientes java (na pasta
java_client
) e python (na pastapython_client
):-
Criação de stubs:
-
Java:
final ManagedChannel channel = ManagedChannelBuilder.forTarget(target).usePlaintext().build(); HelloWorldServiceGrpc.HelloWorldServiceBlockingStub stub = HelloWorldServiceGrpc.newBlockingStub(channel);
-
Python:
with grpc.insecure_channel('localhost:8080') as channel: stub = pb2_grpc.HelloWorldServiceStub(channel)
-
-
Chamadas aos procedimentos remotos:
-
Java:
HelloWorld.HelloRequest request = HelloWorld.HelloRequest.newBuilder().setName("friend").build(); HelloWorld.HelloResponse response = stub.greeting(request);
-
Python:
response = stub.greeting(pb2.HelloRequest(name='friend'))
-
-
-
Termine agora o servidor java e teste o servidor python na pasta
python_server
correndo o comandopython HelloServer.py 8080
. Corra ambos os clientes java e python. -
Analise as diferencças e as semelhanças entre os dois servidores java (na pasta
java_server
) e python (na pastapython_server
):-
Adição do serviço ao servidor:
- Java:
Server server = ServerBuilder.forPort(port).addService(impl).build();;
- Python:
pb2_grpc.add_HelloWorldServiceServicer_to_server(HelloWorldServiceImpl(), server)
- Java:
-
Acesso aos campos dos pedidos:
-
Java:
List hobbies = request.getHobbiesList();
-
Python:
hobbies = request.hobbies
-
-
Sobre a compilação do proto para Python
O comando descrito abaixo gera 2 ficheiros .py na indicada: o _pb2.py
e o _pb2_grpc.py
com classes que representam os tipos de dados das mensagens e com classes de suporte ao servidor e ao cliente do RPC. Nos exemplos deste guião a compilação é automatizada com o Exec Maven Plugin.
python -m grpc_tools.protoc -I<pasta-para-o-contrato> --python_out=<diretoria-output> --grpc_python_out=<diretoria-output> <protos-para-compilar>
Exercício
Aplique o que aprendeu acima para resolver o requisito multi-linguagem do projeto.