본문 바로가기
gRPC

Java GRPC Quick Start

by jayden-lee 2020. 2. 5.
728x90

이 글은 grpc 사이트 Quick Start 번역한 자료입니다. 원문은 https://grpc.io/docs/quickstart/java.html 에서 확인할 수 있습니다.

Java GRPC Quick Start

이 가이드 문서는 간단한 예제를 이용해서 gRPC를 Java로 시작할 수 있도록 안내합니다.

시작하기 전

준비사항

  • JDK : 7 버전 또는 그 이상

예제 다운로드

Quick Start 문서에 내용을 수행하려면, 예제 코드의 복사본이 로컬에 있어야 합니다. Github 저장소로부터 예제 코드를 다운로드 합니다. (다음 명령은 전체 저장소를 복사하지만, 지금은 quickstart와 다른 튜토리얼을 위한 예제만 필요합니다)

 

# 최근에 배포된 예제를 얻기 위해서는 다음 저장소를 복사합니다.
git clone -b v1.15.0 https://github.com/grpc/grpc-java

# Java 예제 파일이 위치한 폴더로 이동
cd grpc-java/examples

gRPC 애플리케이션 실행

예제 폴더에 있는 애플리케이션을 실행합니다. 예제 프로젝트는 gradle 기반입니다.

 

1.클라이언트와 서버 컴파일


gradlew 파일은 유닉스용 실행 스크립트입니다. gradle wrapper를 사용하는 이유는 컴파일이나 빌드를 할 때, 로컬에 gradle를 설치할 필요가 없습니다. 프로젝트와 로컬에 설치된 gradle 버전이 맞지 않아서 실행되지 않는 문제를 줄여줄 수 있습니다.

 

./gradlew installDist

 

2.서버 실행

 

./build/install/examples/bin/hello-world-server

 

3.다른 터미널에서 클라이언트 실행


기존에 사용한 터미널에서는 서버를 실행했습니다. 이번에는 다른 터미널을 실행하고 클라이언트를 실행합니다.

 

./build/install/examples/bin/hello-world-client

축하합니다! gRPC를 이용하여 클라이언트-서버 애플리케이션을 실행했습니다.

 

gRPC 서비스 수정

이번에는 클라이언트에서 호출하기 위해서 서버에 추가 메서드를 가진 애플리케이션을 어떻게 수정하는지에 대해 살펴보겠습니다. 우리의 gRPC 서비스는 프로토콜 버퍼를 사용하여 정의됩니다. gRPC 기초: Java글에서 .proto 파일로 서비스를 정의하는 방법에 대해 더 많이 알아볼 수 있습니다.

 

서버와 클라이언트 "stub"은 클라이언트에서 HelloRequest 파라미터를 가져오고, 서버에서는 HelloReply를 반환하는 SayHello 메서드가 있어야 합니다. 이 메서드는 다음과 같이 정의할 수 있습니다.

 

syntax = "proto3";

option java_multiple_files = true;
option java_package = "com.jayden.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";

package helloworld;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

 

Greeter 서비스는 두 개의 메서드를 갖도록 수정해야 합니다. src/main/proto/helloworld.proto 편집하고, SayHello 메서드와 동일한 요청과 응답 타입을 갖는 새로운 SayHelloAgain 메서드를 추가합니다.

 

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}

  // Sends another greeting
  rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

 

파일을 저장하는 것을 잊으면 안됩니다!

애플리케이션 수정 및 실행

예제를 재 컴파일하면, 일반 컴파일은 gRPC 클라이언트와 서버 클래스가 포함된 GreeterGrpc.java를 재생성합니다. 또한, 요청과 응답 유형 채우기, 직렬화 및 검색을 위한 클래스를 재생성합니다.

 

컴파일을 통해 재생성을 해주더라도 우리는 예제 애플리케이션에서 새로 작성한 메서드를 호출하고 구현하는 부분이 필요합니다.

 

서버 수정

같은 디렉토리에 있는 "src/main/java/io/grpc/examples/helloworld/HelloWorldServer.java" 파일을 열어서 다음과 메서드처럼 구현해야 합니다.

 

Greeter 서비스에 새로 정의한 sayHelloAgain 메서드를 구현합니다.

 

private class class GreeterImpl extends GreeterGrpc.GreeterImplBase {

  @Override
  public void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {
    HelloReply reply = HelloReply.newBuilder().setMessage("Hello " + req.getName()).build();
    responseObserver.onNext(reply);
    responseObserver.onCompleted();
  }

  @Override
  public void sayHelloAgain(HelloRequest req, StreamObserver<HelloReply> responseObserver) {
    HelloReply reply = HelloReply.newBuilder().setMessage("Hello again " + req.getName()).build();
    responseObserver.onNext(reply);
    responseObserver.onCompleted();
  }
}

클라이언트 수정

같은 디렉토리에 있는 "src/main/java/io/grpc/examples/helloworld/HelloWorldClient.java" 파일을 열어서 다음과 같이 새로운메서드를 호출합니다.

 

/** Say hello to server. */
public void greet(String name) {
    logger.info("Will try to greet " + name + " ...");
    HelloRequest request = HelloRequest.newBuilder().setName(name).build();
    HelloReply response;
    try {
         response = blockingStub.sayHello(request);
    } catch (StatusRuntimeException e) {
        logger.log(Level.WARNING, "RPC failed: {0}", e.getStatus());
        return;
    }

    logger.info("Greeting: " + response.getMessage());

    try {
        response = blockingStub.sayHelloAgain(request);
    } catch (StatusRuntimeException e) {
        logger.log(Level.WARNING, "RPC failed: {0}", e.getStatus());
        return;
    }

    logger.info("Greeting: " + response.getMessage());
}

실행

이전에 실행한 것처럼 example 디렉토리에서 서버와 클라이언트를 실행합니다.

 

1.클라이언트와 서버 컴파일

 

./gradlew installDist

 

2.서버 실행

 

./build/install/examples/bin/hello-world-server

 

3.다른 터미널에서 클라이언트 실행

 

./build/install/examples/bin/hello-world-client

 

이번에 클라이언트를 실행하면 우리가 새로 추가한 "Hello again World" 로직이 수행된 것을 확인할 수 있습니다.

 

클라이언트는 Stub을 이용해서 서버에 요청하고, 서버는 클라이언트 요청에 대한 응답을 구현합니다. 그리고 클라이언트와 서버 간에 데이터를 스트리밍으로 주고 받을 수 있다는 점이 장점입니다.

 

자세한 내용을 파악하고 싶으면, 아래 문서를 참고하시면 됩니다.

참고문서

gRPC Quick Start
gRPC 개념

'gRPC' 카테고리의 다른 글

프로토콜 버퍼 스타일 가이드 (Protocol Buffers Style Guide)  (0) 2019.04.05

댓글