<aside> 💡

gRPC + Armeria + Dagger 기반 서비스 흐름 문서 SquareLab [ Groot ] 업무 흐름

</aside>

1. 개요

본 문서는 gRPC, Armeria, Dagger를 사용하여 gRPC 서비스 생성 흐름을 설명합니다.


2. 전체 흐름

  1. .proto 파일 생성 ( API의 요청 및 응답 메시지, 메서드를 정의 )
    1. hello_service.protoService 와 rpc method 정의
      1. 스레드 안정성을 보장하기 위해 Double-checked locking 기법을 활용
    2. hello.proto → rpc method 에서 직접적으로 사용되는 request/response 정의
    3. hello_base.proto ( optional ) → request/response 이외의 하위 메시지 정의
  2. protoc을 사용하여 Stub(서비스 인터페이스) 생성
    1. Squarelab Stub 의 경우 CoroutineStub 활용 → 자체 gradle plugin Proto3Plugin
    2. 일반적인 Stub → blocking stub, async stub, future stub 제공
      1. blocking stub : 블로킹 단일 호출
        1. blockingUnaryCall은 동기(Synchronous) 호출 방식
        2. 클라이언트가 서버로 요청을 보내고 응답을 받을 때까지 현재 실행 중인 스레드를 블로킹
      2. async stub : 비동기 단일 호출
        1. asyncUnaryCall은 비동기(Asynchronous) 호출 방식으로, 요청은 비동기
        2. 요청을 보낸 후, 클라이언트는 응답을 즉시 기다리지 않고 작업을 계속 진행하며, 응답이 도착하면 콜백(Callback)을 통해 결과를 처리
      3. future stub : 반환값이 Future인 단일 호출
        1. futureUnaryCall은 미래(Future) 패턴을 기반으로 결과를 처리
        2. ListenableFuture 객체를 반환하며, 비동기식으로 결과를 기다리거나, 필요할 때 Future의 값을 가져오도록 설계
          1. 비동기 호출이지만, 결과를 기다리기 위해 Future.get()을 호출하면 블로킹될 수 있습니다.
  3. 생성된 Stub을 오버라이딩하여 실제 API 로직을 작성
  4. Dagger를 사용하여 서비스 객체를 DI로 생성 및 주입
  5. Armeria를 사용하여 gRPC 서버를 실행

3. 상세 단계별 설명

1️⃣ .proto 파일 생성

.proto 파일을 작성하여 gRPC API 요청 및 응답 메시지를 정의합니다.

syntax = "proto3";

package example;

service HelloService {
  rpc SayHello (HelloRequest) returns (HelloResponse);
}

message HelloRequest {
  string name = 1;
}

message HelloResponse {
  string message = 1;
}

2️⃣ protoc을 사용하여 Stub(서비스 인터페이스) 생성

.proto 파일을 protoc 컴파일러로 변환하여, Kotlin(Java) Stub 코드를 생성합니다.