gRPC 애플리케이션을 개발할 때, 가장 먼저 할 일은 클라이언트가 원격으로 호출할 수 있는 메서드와 메서드의 파라미터, 사용자 메시지 포맷 등을 포함하는 서비스 인터페이스를 정의하는 것이다. 서비스 정의는 gRPC 에서 사용되는 인터페이스 정의 언어 (==IDL) 인 프로토콜 버퍼 정의로 작성된다.
메세지 정의
1 2 3 4 5 6 7 8 9 10
messageProduct{ string id = 1; string name = 2; string description = 3; float price = 4; }
messageProductID{ string value = 1; }
위에서, 각 메세지 필드에 정의된 번호는 메세지에서 필드를 고유하게 식별하는데 사용된다.
서비스 정의
서비스는 클라이언트에게 제공되는 원격 메서드의 모임이다. 위에서 작성한 Product message, ProductID message 와 같이 작성하자.
messageProduct{ string id = 1; string name = 2; string description = 3; float price = 4; }
messageProductID{ string value = 1; }
구현
이제, 서비스 정의에서 설정된 원격 메서드들로 gRPC 서비스를 구현한다. 원격 메서드들은 서버에 의해 제공되며, gRPC 클라이언트는 서버에 연결해 해당 원격 메서드를 호출한다. 먼저, ProductInfo 서비스 정의를 컴파일하고 선택한 언어로 소스 코드를 생성해야한다. 컴파일은,
privatestaticfinal Logger logger = Logger.getLogger(ProductInfoServer.class.getName()); private Server server;
privatevoidstart()throws IOException { /* The port on which the server should run */ int port = 50051; server = ServerBuilder.forPort(port) .addService(new ProductInfoImpl()) .build() .start(); logger.info("Server started, listening on " + port); Runtime.getRuntime().addShutdownHook(new Thread(() -> { // Use stderr here since the logger may have been reset by its JVM shutdown hook. logger.info("*** shutting down gRPC server since JVM is shutting down"); ProductInfoServer.this.stop(); logger.info("*** server shut down"); })); }
privatevoidstop(){ if (server != null) { server.shutdown(); } }
/** * Await termination on the main thread since the grpc library uses daemon threads. */ privatevoidblockUntilShutdown()throws InterruptedException { if (server != null) { server.awaitTermination(); } }
/** * Main launches the server from the command line. */ publicstaticvoidmain(String[] args)throws IOException, InterruptedException { final ProductInfoServer server = new ProductInfoServer(); server.start(); server.blockUntilShutdown(); }
}
Client 개발
proto 서비스 정의 파일은 이미 여러 번 사용한 proto 파일을 그대로 사용한다. 그리고, Gradle Build Tool 을 사용해 프로젝트에 대한 클라이언트 스텁 코드를 생성한다. 그리고, ecommerce 패키지에 아래 클래스를 작성한다.