프로그래밍/grpc

Grpc framework, protobuf 관리, grpc 기본 톺아보기

seungdols 2023. 7. 31. 10:23

grpc 구조

https://grpc.io/docs/what-is-grpc/introduction/

gRPC에서는 클라이언트 애플리케이션이 로컬 객체처럼 다른 컴퓨터의 서버 애플리케이션에 있는 메서드를 직접 호출할 수 있으므로 분산 애플리케이션과 서비스를 더 쉽게 만들 수 있습니다. 많은 RPC 시스템에서와 마찬가지로 gRPC는 서비스를 정의하고 매개변수와 반환 유형으로 원격으로 호출할 수 있는 메서드를 지정하는 개념을 기반으로 합니다. 서버 측에서는 서버가 이 인터페이스를 구현하고 클라이언트 호출을 처리하기 위해 gRPC 서버를 실행합니다. 클라이언트 측에서는 클라이언트가 서버와 동일한 메서드를 제공하는 스텁(일부 언어에서는 그냥 클라이언트라고 함)을 가지고 있습니다.

stub

gRPC 클라이언트와 서버는 Google 내부의 서버부터 사용자의 데스크톱까지 다양한 환경에서 실행하고 서로 통신할 수 있으며, gRPC에서 지원하는 모든 언어로 작성할 수 있습니다. 예를 들어 Go, Python 또는 Ruby로 된 클라이언트가 있는 Java로 gRPC 서버를 쉽게 만들 수 있습니다. 또한 최신 Google API에는 인터페이스의 gRPC 버전이 제공되므로 애플리케이션에 Google 기능을 쉽게 빌드할 수 있습니다.

rpc structure

grpc 통신 기법

ref. https://grpc.io/docs/what-is-grpc/core-concepts/#using-the-api

  • Unary RPC
    • 1개 request , 1개 respone
  • Server streaming RPC
    • 1개 request, n개 response
  • Client streaming RPC
    • n개 request, 1개 response
  • Bidirectional streaming RPC
    • n개 request, n개 response
Client request call Type
  • Synchronous
    • Unary RPC
    • Server streaming RPC
    • Client streaming RPC
    • Bidirectional streaming RPC
  • Asynchronous
    • Unary RPC
    • Server streaming RPC
    • Client streaming RPC
    • Bidirectional streaming RPC

grpc vs rest

grpc-web

grpc support framework

framework grpc 지원 여부 비고
LogNet/grpc-spring-boot-starter Y 최신 spring boot version 지원
yidongnan/grpc-spring-boot-starter Y Update가 늦음
ktor Y but No starter grpc server start 구현체 여름 런칭 계획 (https://youtrack.jetbrains.com/issue/KTOR-1501)
armeria Y HTTP/GRPC 둘다 서비스 가능 (https://engineering.linecorp.com/ko/blog/introduce-armeria) / spring webflux와 통합 사용 가능

https://www.reddit.com/r/SpringBoot/comments/1255u5x/spring_boot_and_grpc/

  • 특별히 spring boot3를 쓰지 않는 한, 둘 중에 뭘 쓰거나 상관 없어 보인다.
  • lognet 구현체가 좀 더 잘 되어 있다.
    • spring boot 지원 버전이 더 최신성을 잘 반영 함.
      • native spring은 지원이 잘 안되는 것 같다.
  • 다른 모듈 support 은 yidongnan 모듈이 좀 더 잘 지원한다.

protobuf 병합

ref.

QA) proto 파일을 어떻게 공유 할 것인가?

gRPC client and server

ref.

https://www.youtube.com/watch?v=igHrQPzLVRw

gRPC client는 resolver/load balancer 내장
  • resolver는 주기적으로 target DNS를 resolve 하면서 endpoint를 갱신 함
  • connection이 실패하면, load balancer는 직전에 사용한 address list를 이용하여 re-connection
  • connection pool을 관리
gRPC Keepalive
  • keepalive는 http/2 ping frame을 보내 연결상태 체크
  • ping frame이 제 시간에 오지 않으면 connection close
  • gRPC가 연결에서 주기적으로 http/2 ping frame을 전송하면 해당 connection은 idle connection 상태가 아님.
  • MAX_CONNECTION_AGE 같은 옵션을 사용 할 수 있음.
gRPC 의 request / response
  • Content-type이 application/grpc가 아닐 경우 415 error
  • response message는 response header, length prefixed Message, Trailer 3가지다.
  • 마지막 트레일러 헤더는 http 스펙으로 grpc-status와 grpc-message를 포함.
gRPC status code
  • infra layer
  • application layer
gRPC load balancing
  • k8s service는 l4 레벨이라, gRPC의 요청 분산하기에는 어려움이 있음.
  • linekerd, istio, nginx .. etc k8s gRPC 서비스를 로드 밸런싱 할때, service 객체를 endpoint 주소들을 갱신 하는 용도로 사용
  • endpoint list를 proxy가 직접 관리함.
  • HAProxy의 경우 option http-use-htx
    • DC가 터지면, connection pool에 flow control error
    • connection pool을 분리
    • gRPC 모니터링 메트릭이 부족
  • nginx의 경우 ngx_http_grpc_module
  • Envoy의 경우 gRPC 필터 동작 방식
반응형