티스토리 뷰

https://godd.tistory.com/88

 

[gRPC] gRPC 개념

gRPC란? gRPC는 구글에서 만든 HTTP2 기반의 RPC 통신을 위한 프레임워크이다. Google에서 내부 RPC 통신을 위해 만들던 Stubby 프로젝트를 기반으로 표준화하여 오픈소스로 공개했다. 이전에 구글에서 IDL

godd.tistory.com

gRPC 개념에 대해서는 위 포스팅을 참고,

여기서는 gRPC 서비스 개발을 위한 프로세스와 코드 구현에 대해서 알아본다.

 

 

gRPC 통신 패턴

 

통신 패턴은 크게 Unary와 Stream 이 있다. 기본적으로 Client - Server 구조이기 때문에 Client / Server 각각이 어떤 통신을 하느냐에 따라서 아래와 같이 4가지로 구분될 수 있다.

 

gRPC 구현 프로세스

구현 프로세스는 1. proto file 을 정의한 후 2. compile을 통해 stub/skeleton을 생성하고 그 기반으로 3. client/server를 구현한다.

 

하나씩 살펴보도록 한다.

 

1. proto 정의 

먼저 proto file을 정의한다. java 기준으로 src/main/proto 디렉토리에 proto 파일을 정의한다.

안에는 아래와 같은 정의를 한다.

syntax = "proto3";

package com.example.greeting;

service Greeting {
  rpc sayHelloToOne(Person) returns (Output);
  rpc sayHelloToMany(stream Person) returns (Output) ;
  rpc sayHelloToOneMultiple(Person) returns (stream Output);
  rpc sayHelloToManyMultiple(stream Person) returns (stream Output);
}

message Person {
  string name = 1;
}

message Output {
  string value = 1;
}

syntax : proto 버전을 명시

package : package를 정의하며, 여기에 정의된 패키지로 stub이 생성된다.

service : 실제 서비스를 정의하며 인터페이스를 이 안에서 정의한다.

rpc : 메소드 인터페이스를 정의한다. Request와 Response에 stream 키워드로 정의할 수 있다.

message : RPC 통신을 할 때 주고받을 데이터에 대해 정의한다.

 

2. proto compile

proto 파일 Compile 후 stub을 생성해주는 단계이다.

 

Maven Plugin 기반으로 컴파일하는 형태로 설명할 예정이고, 아래와 같이 설정했다.

<plugin>
	<groupId>org.xolstice.maven.plugins</groupId>
	<artifactId>protobuf-maven-plugin</artifactId>
	<version>0.6.1</version>
	<configuration>
		<protocArtifact>com.google.protobuf:protoc:3.12.0:exe:${os.detected.classifier}</protocArtifact>
		<pluginId>grpc-java</pluginId>
		<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.36.0:exe:${os.detected.classifier}</pluginArtifact>
		<outputDirectory>${basedir}/src/main/java</outputDirectory>
		<clearOutputDirectory>false</clearOutputDirectory>
	</configuration>
	<executions>
		<execution>
			<goals>
				<goal>compile</goal>
				<goal>compile-custom</goal>
			</goals>
		</execution>
	</executions>
</plugin>

 

그 후 1단계에서 정의된 proto 파일로 컴파일을 하고 나면, client / server간의 RPC 통신을 위한 코드가 생성된다.

 

protobuf:compile-custom을 하고 나면 아래와 같이 GreetingGrpc 코드가 생긴다. RPC 에서의 stub/server Layer 코드를 생성해주며, 이를 기반으로 비즈니스 로직을 개발하면 된다. 이름은 proto 파일의 service 명 기준으로 생성됨.

protobuf:compile을 하고 나면 아래와 같이 Hello 코드가 생긴다. RPC 에서의 Protocol Layer (Message) 코드를 생성해주며, 이를 사용하여 Request, Response 메세지를 주고 받는다.

 

3. client 및 server 구현

컴파일하여 나온 코드를 기반으로 Client / Server 를 개발하면 된다.

Stub 을 이용하여 Server와 통신을 할건데, 이 때 Channel을 통해서 하게 된다.

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

GreetingBlockingStub stub = GreetingGrpc.newBlockingStub(channel);

channel 객체를 생성한 후 stub은 그 channel을 통해 서비스를 호출할 수 있다.

정리하면, Channel은 Client 와 Server 간 통신을 위한 객체이고 Stub은 channel을 통해 서비스를 호출할 수 있는 추상화된 객체라고 보면 된다.

 

Stub 방식은 blocking, async, future 3가지로 사용이 가능하다.

 

Unary 통신 개발

Client의 stub을 생성하여 Request (Person input) 를 생성한 후 데이터를 stub의 method로 호출하면 channel을 통해 메소드가 호출이 된다.

Server는 메소드가 호출이 되고 onNext 를 통해 데이터를 전송, onCompleted() 시점에서 connection이 종료된다.

 

Server Streaming 통신 개발

Client 에서는 이전 Unary 통신과 같고, 호출을 하면 Server에서 onNext를 통해 Stream 형태의 데이터를 전송한다.

onCompleted() 시점에서 Connection이 종료되고, 그 전까진 Client에서 stream을 받아 처리하는 형태로 개발한다.

 

Client Streaming 통신 개발

Client에서는 onCompleted() 시점에서 Stream 형태가 종료되면 Server의 Response 데이터를 리턴,

Server는 onNext()를 재정의하여 Stream 형태의 데이터를 받아서 처리한다.

여기서 onNext마다 resObserver.onNext()로 데이터를 처리하여 보내주게 되면, 양방향 Streaming이 된다.

'Architecture > Framework' 카테고리의 다른 글

[gRPC] gRPC 개념  (0) 2021.07.05
[gRPC] grpcurl 설치 (for Windows)  (0) 2021.05.28
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함