Labs SD >
python -m venv .venv
.venv\Scripts\activate
python -m pip install grpcio
python -m pip install grpcio-tools
deactivate
python -m venv .venv
source .venv/bin/activate
python -m pip install grpcio
python -m pip install grpcio-tools
deactivate
mvn installmvn exec:execgenerated-sources/protobuf e o código gerado nas diretorias java e
python.
mvn compile exec:java.python client.py.
java na pasta java_client e python na pasta python_client:Criação de stubs:
final ManagedChannel channel = ManagedChannelBuilder.forTarget(target).usePlaintext().build();
HelloWorldServiceGrpc.HelloWorldServiceBlockingStub stub = HelloWorldServiceGrpc.newBlockingStub(channel);
with grpc.insecure_channel('localhost:8080') as channel:
stub = pb2_grpc.HelloWorldServiceStub(channel)
Chamadas aos procedimentos remotos:
HelloWorld.HelloRequest request = HelloWorld.HelloRequest.newBuilder().setName("friend").build();
HelloWorld.HelloResponse response = stub.greeting(request);
response = stub.greeting(pb2.HelloRequest(name='friend'))
java e teste o servidor python na pasta python_server correndo o comando python HelloServer.py 8080. Corra ambos os clientes java e python.java na pasta java_server e python na pasta python_server:Adição do serviço ao servidor:
Server server = ServerBuilder.forPort(port).addService(impl).build();;
pb2_grpc.add_HelloWorldServiceServicer_to_server(HelloWorldServiceImpl(), server)
Acesso aos campos dos pedidos:
Listhobbies = request.getHobbiesList();
hobbies = request.hobbies
python -m grpc_tools.protoc -I<pasta-para-o-contrato> --python_out=<diretoria-output> --grpc_python_out=<diretoria-output> <protos-para-compilar>
Neste exercício iremos implementar um servidor de nomes em Python que oferece esse serviço, usando a tecnologia gRPC, a outros processos programados em Java (ou outra linguagem).
O servidor de nomes permitirá que outros processos servidores registem o serviço remoto que oferecem, bem como que os processos cliente descubram quais os endereços (nome DNS, porto) dos servidores que atualmente oferecem um dado serviço.
Pode haver mais que um servidor a oferecer o mesmo serviço remoto (por exemplo, num serviço replicado), sendo que cada servidor pode ser distinguido por um qualificador (por exemplo, "A", "B" e "C", ou "primary" e "backup").
Este exercício permite-lhe responder a um dos objetivos do projeto de SD. Por essa razão, propomos que use como ponto de partida o código do projeto já desenvolvido até ao momento pelo seu grupo.
NameServer, que já tem um primeiro esqueleto do código desse servidor.
Seguindo as instruções que apresentamos mais abaixo, irá preencher esse esqueleto.NameServer.proto na sub-diretoria apropriada dentro de Contract, preenchendo já os elementos syntax e package apropriadamente.
Este ficheiro também será completado mais adiante.pom.xml na diretoria Contract já está pronto para
gerar stubs a partir desse novo .proto, tanto em Java como em Python.register, que permite a um servidor inserir uma entrada no servidor de nomes..proto adequado. host:port (uma string);Not possible to register the server quando não for possível registar o serviço;5001).
ServerEntry que irá conter a informação para cada servidor, nomeadamente, a combinação
host:port e o qualificador.
ServiceEntry que irá guardar o nome de um serviço e um conjunto de
ServerEntrys.
NamingServer que irá guardar toda a informação que o servidor necessita, ou seja,
contém um
mapa que permite associar um nome de um serviço à ServiceEntry correspondente.NamingServerServiceImpl que estende a classe gerada pelo protobuf e implemente a
operação register.lookup, que permite a um cliente encontrar servidores, relativos a um serviço.
.proto adequado.delete, que permite a um servidor remover-se do registo de nomes.
.proto adequado, tal como foi feito anteriormente.
host:port do servidor.Not possible to remove the server quando não for possível remover o servidor.
© Docentes de Sistemas Distribuídos,
Dep. Eng. Informática,
Técnico Lisboa