-
gRPC ① gRPC란 ( + Kotlin 설정)네트워크 & 인프라 2022. 9. 30. 17:21
아키텍처를 공부하면서 배운 gRPC에대해서 알고싶어 공부를 시작했다! 🙌
참고한 영상 👇🏼
참고한 글 👇🏼
gRPC (Remote Procedure Cell)
- MSA에서 컴포넌트 끼리 서로 통신할때 사용됨
- 원격에 존재하는 프로시저(함수)를 마치 로컬에 존재하는 것처럼 호출하는 것
- Stub → 추상화를 도와줌
- 원격과의 연결
- 호출 / 데이터 형식을 어떻게 맞출지
- Stub → 추상화를 도와줌
- RPC : 컴퓨터 프로그램이 다른 주소공간에서 명령을 수행할 때 마치 로컬 명령을 수행하는 것처럼(마치 자신의 것처럼) 코드 된 것
- 장점
- 친밀한 인터페이스를 가짐
- 가벼움
- binary protocol
- Text보다 더 적은 데이터 공간으로 처리 가능 (네트워크, 메모리 효율성 증가)
- Text보다 더 적은 Serialize / Deserialize 부하 (CPU 효율성 증가)
- Use HTTP/2 (2015)
- Single TCP connection (channel을 이용한 TCP 연결 재사용)
- Connection Multiplexing
- Header Compression 가능 (네트워크 효율성 증가 )
- Client / Server 양방향 스트리밍 가능 ( 적용 분야 다양성 증가 ) → Bidirectional streaming (양방향 통신, 양방향 스트리밍)
- Flow control (얼마나 많은 요청을 서버로 보낼지, 모바일 폰이나 기기에 따른 요청 처리 등)
- REST보다 Throughput 처리량 거의 3배, CPU사용률 고려시 처리량 거의 11배
- polyglot : proto 파일 하나면 10가지 언어로 작성 가능 → Supports multiple languages(다양한 언어 지원)
- 단점
- Browser에서는 아직 사용 불가
- Client 쪽 업데이트
- 데이터가 NOT Human Readable
- REST 보다는 조금 복잡
- 사용 예시
- Java + grpc (잘 어울림)
- wix + (scala+scalaPB ) + grpc
- wix+(kotlin)+grpc
- 사용 시기
- 브라우저 필요 없는 백엔드 서버 간 통신
- 자원이 빈약한 디바이스와 서버 간 통신
- 바이트 / 호출 / CPU 수등으로 과금되는 클라우드 환경에서의 비용 절감
- 4가지 스트리밍 방식
- Unary - 단항, 단건 : Client → ← Server
- 서버 스트리밍 : Client → ← ← ← Server
- 클라이언트 스트리밍 : Client → → → ← Server
- 양방향 스트리밍 : Client → → → ← ← ← Server
- 3가지 Stub
- BlockingStub
- (Async)Stub
- FutureStub
- Protocol buffers
- 구글의 중립 언어, 중립(neutral)플랫폼, 직렬화 되어있는 데이터 구조에 대해 확장 가능한 메카니즘
- XML과 비슷하지만 더 작고 빠르고 단순
- Protobuf 이용해서 컴파일해서 php, java, js 등등으로
- .proto 확장자를 가짐
- protoc 컴파일러를 이용해 메세지를 컴파일 → 컴파일된 결과물(코드)로 서버와 클라이어트에서 사용
- 특징
- Type safety
- No schema violation (컴파일 타임 체크)
- Fase serialization/deserialization
- Backward compatibility
- 메세지를 보낼 때 어떤 내용을 추가하고 싶으면 편집을 쉽게하고 deprecate도 쉽게 (옵셔널)하기 때문
- 단, Human readability X( 바이트를 받기 때문)
// name, id와 같은 필드는 각 언어별로 적절한 get/set 함수를 자동 생성 및 제공 message Person { string name = 1; int32 id = 2; bool has_ponycopter = 3; } // service : 서버와 클라이언트 양측에서 사용할 함수의 묶음 // message : 실제 주고받는 데이터 service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} } message HelloRequest { string name = 1; } message HelloReply { string message = 1; }
- gRPC + coroutines
- Callback hell해결
- Channel in gRPC -> grpc-kotlin
- Kroto+
— 가볍게 보는 사용 예시
- Death star라는 우주의 별을 파괴하는 게임이 존재한다고 가정
- 지정 시간동안 사용자는 우주를 부실 수 있는 만큼 파괴
- 각각의 과정은 비동기적으로 발생 (subscibe →asynchronously)
- 사용자가 게임에 접속 → 우주 서비스로 이동 → 응답을 기다림 → 정보 수신
- 사용자가 로그를 보고 싶어할 때 → 로그 서비스로 이동 → 정보를 수신
- 사용자가 점수, 순위를 보고 싶어할 때 → 데이터 베이스 결과 서비스로 이동 → 정보를 수신
- 사용자가 우주를 파괴할 때 → 우주 서비스로 이동 → 우주 파괴 혹은 우주 재생성 → 우주가 우주 서비스에게 죽음을 알리고, log와 점수 및 순위 서버도 업데이트 → 비동기적으로 변경된 정보를 사용자에게 업데이트
코틀린 + gRPC 기본 설정 setUp
- 참고 자료 → https://cla9.tistory.com/178
- proto 파일을 만들고 이를 build 하여 stub 클래스 생성 후 프로그램 참조 확인하기
- 1) gRPC를 사용하기 위한 설정을 build.gradle.kts에 추가
// 플러그인 설정 import com.google.protobuf.gradle.* plugins { ...(중략)... id("com.google.protobuf") version "0.8.13" } // protobuf 관리와 stub을 자동으로 생성해주는 라이브러리 dependency 추가 val grpcVersion = "3.19.4" val grpcKotlinVersion = "1.2.1" val grpcProtoVersion = "1.44.1" dependencies{ implementation("io.grpc:grpc-kotlin-stub:$grpcKotlinVersion") implementation("io.grpc:grpc-protobuf:$grpcProtoVersion") implementation("com.google.protobuf:protobuf-kotlin:$grpcVersion") } // build 후 stub 클래스가 생성되는 directory를 target으로 추가 sourceSets{ getByName("main"){ java { srcDirs( "build/generated/source/proto/main/java", "build/generated/source/proto/main/kotlin" ) } } } // build 시점에 protobuf를 생성(Java Stub 파일과 Kotlin Stub파일을 생성) protobuf { protoc { artifact = "com.google.protobuf:protoc:$grpcVersion" } plugins { id("grpc") { artifact = "io.grpc:protoc-gen-grpc-java:$grpcProtoVersion" } id("grpckt") { artifact = "io.grpc:protoc-gen-grpc-kotlin:$grpcKotlinVersion:jdk7@jar" } } generateProtoTasks { all().forEach { it.plugins { id("grpc") id("grpckt") } it.builtins { id("kotlin") } } } }
- 2) 임시 protobuf 생성 후 정상적 stub 클래스가 생성되는지 확인 테스트
- src→ main→ proto 디렉토리 생성 → test.proto 파일 생성
syntax = "proto3"; message Test{ int32 inputA = 1; string inputB = 2; }
- 3) gradle → build 후 build→ generated → source → proto → main / java → 파일이 생성되는지 확인
- 자료구조 : kotlin 폴더 내 위치
- 스텁 : grpc 폴더 내에 위치
- 4) 생성된 stub 클래스를 프로그램 내에서 정상 사용 할 수 있는지 확인
- 임의의 main 함수를 만들어 클래스 참조가 가능한지 확인
- 만약 불가능 하다면 build.gradle.kts 파일의 sourceSets 경로 일치 여부를 확인
fun main() { val test = test { inputA = 123456 inputB = "test" } }
'네트워크 & 인프라' 카테고리의 다른 글
gRPC ③ gRPC + 스프링부트 프로젝트 구성해보기 (0) 2022.10.05 gRPC ② gRPC + 자바 프로젝트 구성해보기 (1) 2022.10.05 SSH 별칭으로 접속 시도시 RSA 공유키 충돌 문제 발생 (0) 2022.05.30 그림으로 공부하는 IT 인프라 구조 정리 (0) 2022.04.15 AWS Auto Scaling 적용하기 (Load balancer를 이용한 부하분산) (0) 2022.04.14