just_do_IT

[gRPC] gRPC 기초적인 추가 정보 2. 스트리밍 방식, 개발 순서 본문

초보 개발자의 스터디룸

[gRPC] gRPC 기초적인 추가 정보 2. 스트리밍 방식, 개발 순서

justdoIT0730 2023. 1. 31. 10:28
728x90
728x90

https://www.youtube.com/watch?v=sKWy7BJxIas&t=2524s 

본 게시물은 위 영상을 토대로 작성되었습니다.

 

목차
  • [1] gRPC의 스트리밍 방식
  • [2] 개발 순서와 상세 정보
  • [3] 추가적인 확인 사항

[1] gRPC의 스트리밍 방식

1.1 gRPC의 스트리밍 방식

 


종류 설명
- 스트리밍은 아니지만 타 스트리밍 방식과 다르기 때문에 첨부
- 가장 단순한 형태
- 클리이언트가 요청을 1번 보내면 서버가 여러 번 보내는 구조
ex) 클라이언트가 어떤 목록 조회 요청 상황
- 목록은 여러 개 존재할 수 있어 서버는 여러 개의 목록을 순차적으로 스트리밍하여 회신할 때 사용
- 클라이언트에서 여러 번 요청을 보내면 서버가 클라이언트에서 받은 정보들을 집계하여 하나의 정보로 회신
- 클라이언트도 여러번 요청을 보낼 수 있고, 서버도 클라이언트에 여러 번 회신 가능

1.2 gRPC 내 Stub의 종류

  • RPC에서 가장 중추적인 역할 중 하나
  • BlockingStub
    • Unary, Server Streaming만 지원
  • FutureStub
    • Unary만 지원
  • (Async)Stub
    • 괄호가 있는 이유 : gRPC는 Async 방식이 기본
    • 클래스명 또한 Async를 명시하지 않고, 그냥 stub으로 지칭
    • 4가지 스트리밍 방식을 모두 지원

[2] 개발 순서와 상세 정보

2.1 서버 개발 순서

  • 1. build.gradle
  • 2. proto 작성
  • 3. gRPC 기반 코드 생성
  • 4. gRPC Dependency 해결
  • 5. gRPC 서버 작성
  •   

2.2 상세 정보

1. build.gradle

build.gradle Code
더보기
 group 'homo.efficio'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'com.google.protobuf'
apply plugin: 'idea'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

buildscript {

    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.6'
    }
}

protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:3.6.1"

        // Set the location of generated source code by protoc compiler
        generatedFilesBaseDir = "$projectDir/gen-src"
    }
    plugins {
        grpc {
            artifact = 'io.grpc:protoc-gen-grpc-java:1.16.1'
        }
    }
    generateProtoTasks {
        all()*.plugins {
            grpc {}
        }
    }
}

// Add source dir for generated source code of gRPC
sourceSets {
    main {
        java {
            srcDirs 'gen-src/main/java'
            srcDirs 'gen-src/main/grpc'
        }
    }
}

dependencies {
    compile 'io.grpc:grpc-netty:1.16.1'
    compile 'io.grpc:grpc-protobuf:1.16.1'
    compile 'io.grpc:grpc-stub:1.16.1'

    testCompile group: 'junit', name: 'junit', version: '4.12'
}
  • .proto 파일 : 10가지 언어로 된 자동 코드 생성 기능
  • protocol buf gradle plugin 설정하기 위한 내용
  • 기본적으로 netty, protobuf, stub 라이브러리 사용
  • netty : 프로토콜 서버 및 클라이언트와 같은 네트워크 응용 프로그램을 빠르고 쉽게 개발할 수 있는 서버 프레임 워크

2. proto 작성

  • (Intellij)Protobuf Support Plugin 설치 추천 : 키워드 하이라이팅 기능이 있어 편리함
  • RPC Model은 로컬에서 스텁을 통해서 하부 네트워크를 추상화해서 동작
  • gRPC모델에서는 proto파일이 추가
  • proto파일에서 자동 생성된 gRPC base file들을 기반으로 로컬과 원격적인 코드를 상속 및 호출 등에 이용함

proto file 세부 내용

proto file Code
더보기
syntax = "proto3";

option java_multiple_files = true;
option java_outer_classname = "HelloGrpcProto";

package homo.efficio.springcamp2017.grpc.hello;

message HelloRequest {
    string clientName = 1;
}

message HelloResponse {
    string welcomeMessage = 1;
}

service HelloSpringCamp {

    rpc unaryHello(HelloRequest) returns (HelloResponse) {}

    rpc serverStreamingHello(HelloRequest) returns (stream HelloResponse) {}

    rpc clientStreamingHello(stream HelloRequest) returns (HelloResponse) {}

    rpc biStreamingHello(stream HelloRequest) returns (stream HelloResponse) {}
}
    1. 메타정보
    1. 자료 구조
    1. 메서드 선언

1. 메타정보

  • 프로토콜 버퍼 버전 3을 사용 : syntax = "proto3";
  • 파일 생성 시 합쳐서 하나로 만들지 않고 여러개로 쪼개서 만듬 : option java_multiple_files = true;
  • 생성할 기본 place 이름 : option java_outer_classname = "HelloGrpcProto";
  • 패키지 이름 : package homo.efficio.springcamp2017.grpc.hello;

2. 자료 구조

  • 1의 의미 : 단순한 index 개념
    • Binary Protocal 이어서 주어진 자료 그대로 데이터 공간을 낭비하지 않고 최적화해서 배치
    • 단순한 Stirng int 뿐만 아니라 메시지라는 키워드로 선언된 자료구조를 안에 중첩해서 사용 가능

3. 메서드 선언

  • Async Unary 방식으로 동작하는 하나의 메서드를 선언한 예제
  • 여러가지 방식으로 구성된 메서드 선언 가능
  • rpc 키워드로 메서드 이름과 파라미터, returns 키워드로 반환할 타입을 명시

3. gRPC 기반 코드 생성

  • main 하위 디렉터리에는 아무 파일이 없음
  • gradle 내 Tasks/other/generateProto 더블클릭
  • 처리 중
  • main 하위 디렉터리에 필요 파일 자동 생성
  • grpc 폴더 : 스텁에 대한 구현 내용
  • java 폴더 : 자료구조에 대한 구현 내용

4. gRPC Dependency 해결

  • 새로 생성된 파일은 컴파일을 해줘야 한다
  • 직접 했을 땐 컴파일이 자동으로 되어있었다.

5. gRPC 서버 작성

gRPC 서버 구성

  • ServerService : .proto file에서 이름만 선언해뒀던 메서드들을 실제 구현해놓은 부분
  • Server : 클라이언트로부터 요청을 받아들일 수 있는 기능하는 서버 : Server에 ServerService를 add하는 방식으로 동작
  • ServerRunner

[3] 추가적인 확인 사항

  • gRPC 내 Thread Safe하는 요소
  • 4가지 Streaming 방식과 3가지 Stub의 조합
  • 자동 생성 소스 확인
 

[출처]
https://www.youtube.com/watch?v=sKWy7BJxIas&t=2524s

728x90
728x90