-
gRPC ① gRPC란 ( + Kotlin 설정)네트워크 & 인프라 2022. 9. 30. 17:21
아키텍처를 공부하면서 배운 gRPC에대해서 알고싶어 공부를 시작했다! 🙌
참고한 영상 👇🏼
참고한 글 👇🏼
[실습] Kotlin + Armeria + gRPC 사용기 - ProcolBuffer 편
들어가기 전에 이번 글의 목적은 프로토콜 버퍼와 JSON 그리고 gRPC와 HTTP를 비교하는 것이다. 프로토콜 버퍼가 메시지를 어떻게 경량화하는지는 프로토콜 버퍼 원리을 읽기 바란다. gRPC와 HTTP가
dgahn.tistory.com
Kotlin gRPC 예제 - (2) gRPC를 사용하기 위한 build.gradle 및 Protobuf 메시지 빌드 · snowdeer's Code Holic
Kotlin gRPC 예제 - (2) gRPC를 사용하기 위한 build.gradle 및 Protobuf 메시지 빌드 24 Dec 2019 | Kotlin gRPC gRPC를 사용하기 위한 build.gradle build.gradle gRPC를 사용하기 위해서는 필요한 플러그인과 종속성을 추가
snowdeer.github.io
Using gRPC With Kotlin for Building Microservices
Microservices are built in different languages and encompass a function of your business. These microservices must exchange information…
medium.com
gRPC 사용법, gRPC 예제 코드 실행해보기, 원리는 몰라도 gRPC 입문은 가능하다 (grpc java example)
이 포스트는 springcamp2017에서 grpc발표를 하신 오명운님의 발표 자료 및 github소스를 참고해서 작성한 것입니다. gRPC의 장점 service 정의가 단순하다 여러 프로그래밍 언어나 플랫폼에서 사용이 가
jeong-pro.tistory.com
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
4. kotlin 환경에서 gRPC 설정하기
서론 지금까지 gRPC에 대한 소개 및 해당 기술이 가진 이점에 대해서 살펴봤습니다. 이번 포스팅에서는 kotlin 환경에서 gRPC 관련 기본 설정 셋업하는 방법에 대해서 다루어보도록 하겠습니다. 프
cla9.tistory.com
- 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