Você está na página 1de 14

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DE GOIÁS –

CAMPUS GOIÂNIA – GO.


BACHARELADO EM SISTEMAS DE INFORMAÇÃO
SISTEMAS DISTRIBUÍDOS

Prof. Dr. Raphael Gomes (raphael.gomes@ifg.edu.br)

Laboratório 05 – Chamada remota de procedimento usando gRPC

1. Abra o Eclipse e selecione File → New → Other.

2. Expanda Gradle, selecione Gradle Project e em seguida Next.


3. Selecione Next novamente.

4. Coloque o nome do projeto como calculator e selecione Finish.


5. Abra o arquivo build.gradle e adicione as dependências abaixo.

implementation 'javax.annotation:javax.annotation-api:1.3.2'
implementation 'io.grpc:grpc-netty-shaded:1.38.0'
implementation 'io.grpc:grpc-protobuf:1.38.0'
implementation 'io.grpc:grpc-stub:1.38.0'

6. Adicione também o plugin abaixo.

id 'com.google.protobuf' version '0.8.15'


7. Ainda neste arquivo, adicione o bloco protobuf logo abaixo de repositories.

protobuf {
protoc {
artifact = "com.google.protobuf:protoc:3.12.0"
}
plugins {
grpc {
artifact = 'io.grpc:protoc-gen-grpc-java:1.38.0'
}
}
generateProtoTasks {
all()*.plugins {
grpc {}
}
}
}
8. Por fim, adicione o bloco abaixo no fim do arquivo.

// Inform IDEs like IntelliJ IDEA, Eclipse or NetBeans about the generated code.
sourceSets {
main {
java {
srcDirs 'build/generated/source/proto/main/grpc'
srcDirs 'build/generated/source/proto/main/java'
}
}
}
9. Salve o arquivo e clique com o botão direito em build.gradle e vá em Gradle → Refresh Gradle
Project.

10. Clique com o botão direito no projeto e vá em New → Source Folder.

11. Coloque o nome como src/main/proto e clique Finish.


12. Clique com o botão direito na pasta criada e vá em New → Other.

13. Selecione File em General e clique Next.


14. Coloque o nome como calculator.proto e clique Finish.

15. Caso apareça a sugestão de instalação de editor cancele.


16. Clique com o botão direito no arquivo criado e vá em Open With → Text Editor.

17. Adicione o conteúdo abaixo no arquivo.

syntax = "proto3";

option java_package = "br.edu.ifg.proto.calculator";


option java_multiple_files = true;

message SumRequest {
int32 first_number = 1;
int32 second_number = 2;
}
message SumResponse {
int32 sum_result = 1;
}

service CalculatorService {
rpc Sum(SumRequest) returns (SumResponse) {};
}

18. Abra o conjunto de tarefas build e execute a tarefa build.

19. Verifique a execução ocorreu corretamente.

20. Clique novamente com o botão direito em build.gradle e vá em Gradle → Refresh Gradle Pro-
ject.

21. Veja que novos arquivos foram gerados.

22. Crie a classe CalculatorServiceImpl no pacote br.edu.ifg.calculator em src/main/


java.

package br.edu.ifg.calculator;

import br.edu.ifg.proto.calculator.CalculatorServiceGrpc;
import br.edu.ifg.proto.calculator.SumRequest;
import br.edu.ifg.proto.calculator.SumResponse;
import io.grpc.stub.StreamObserver;
public class CalculatorServiceImpl extends
CalculatorServiceGrpc.CalculatorServiceImplBase {

@Override
public void sum(SumRequest request, StreamObserver<SumResponse>
responseObserver) {

SumResponse sumResponse = SumResponse.newBuilder()


.setSumResult(request.getFirstNumber() +
request.getSecondNumber())
.build();

responseObserver.onNext(sumResponse);

responseObserver.onCompleted();

}
}

23. Crie a classe CalculatorServer no pacote br.edu.ifg.calculator em src/main/java.

package br.edu.ifg.calculator;

import java.io.IOException;

import io.grpc.Server;
import io.grpc.ServerBuilder;

public class CalculatorServer {

public static void main(String[] args) throws IOException,


InterruptedException {
Server server = ServerBuilder.forPort(50052)
.addService(new CalculatorServiceImpl())
.build();

server.start();

System.out.println("Server running ...");

Runtime.getRuntime().addShutdownHook(new Thread(() -> {


System.out.println("Received Shutdown Request");
server.shutdown();
System.out.println("Successfully stopped the server");
}));

server.awaitTermination();
}
}

24. Crie a classe CalculatorClient no pacote br.edu.ifg.calculator em src/main/java.

package br.edu.ifg.calculator;

import br.edu.ifg.proto.calculator.CalculatorServiceGrpc;
import br.edu.ifg.proto.calculator.SumRequest;
import br.edu.ifg.proto.calculator.SumResponse;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;

public class CalculatorClient {

public static void main(String[] args) {


System.out.println("Hello I'm a gRPC client");
CalculatorClient main = new CalculatorClient();
main.run();
}

private void run() {


ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost",
50052)
.usePlaintext()
.build();

doUnaryCall(channel);

System.out.println("Shutting down channel");


channel.shutdown();

private void doUnaryCall(ManagedChannel channel){


CalculatorServiceGrpc.CalculatorServiceBlockingStub stub =
CalculatorServiceGrpc.newBlockingStub(channel);

SumRequest request = SumRequest.newBuilder()


.setFirstNumber(10)
.setSecondNumber(25)
.build();

SumResponse response = stub.sum(request);

System.out.println(request.getFirstNumber() + " + " +


request.getSecondNumber() + " = " + response.getSumResult());

}
}

25. Execute a classe CalculatorServer.

26. Execute a classe CalculatorClient.


27. Como alternativa a executar o servidor localmente você pode implantá-lo na AWS usando um con-
têiner. Veja como fazer em https://dev.to/chaitan94/deploying-a-grpc-service-in-ecs-with-the-ec2-
launch-type-2aa.

Neste laboratório exploramos apenas o tipo de comunicação unária em gRPC. Além dessa é possível utili-
zar client streaming, server streaming ou bidirecional streaming. A definição completa da aplicação exploran-
do esses outros conceitos pode ser encontrado nos links abaixo:
• https://github.com/simplesteph/grpc-java-course/blob/master/src/main/proto/calculator/
calculator.proto
• https://github.com/simplesteph/grpc-java-course/tree/master/src/main/java/com/github/simplesteph/
grpc/calculator

Referências
• G. Coulouris, J. Dollimore, T. Kindberg e G. Blair. Sistemas Distribuídos: Conceitos e Projetos. 5a
Edição, 2013
• https://github.com/simplesteph/grpc-java-course

Você também pode gostar