grpc 구조
https://grpc.io/docs/what-is-grpc/introduction/
gRPC에서는 클라이언트 애플리케이션이 로컬 객체처럼 다른 컴퓨터의 서버 애플리케이션에 있는 메서드를 직접 호출할 수 있으므로 분산 애플리케이션과 서비스를 더 쉽게 만들 수 있습니다. 많은 RPC 시스템에서와 마찬가지로 gRPC는 서비스를 정의하고 매개변수와 반환 유형으로 원격으로 호출할 수 있는 메서드를 지정하는 개념을 기반으로 합니다. 서버 측에서는 서버가 이 인터페이스를 구현하고 클라이언트 호출을 처리하기 위해 gRPC 서버를 실행합니다. 클라이언트 측에서는 클라이언트가 서버와 동일한 메서드를 제공하는 스텁(일부 언어에서는 그냥 클라이언트라고 함)을 가지고 있습니다.
gRPC 클라이언트와 서버는 Google 내부의 서버부터 사용자의 데스크톱까지 다양한 환경에서 실행하고 서로 통신할 수 있으며, gRPC에서 지원하는 모든 언어로 작성할 수 있습니다. 예를 들어 Go, Python 또는 Ruby로 된 클라이언트가 있는 Java로 gRPC 서버를 쉽게 만들 수 있습니다. 또한 최신 Google API에는 인터페이스의 gRPC 버전이 제공되므로 애플리케이션에 Google 기능을 쉽게 빌드할 수 있습니다.
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://github.com/LogNet/grpc-spring-boot-starter
- https://github.com/yidongnan/grpc-spring-boot-starter
- https://github.com/line/armeria
- ktor의 경우 제한적으로 사용 가능
- https://youtrack.jetbrains.com/issue/KTOR-1501
- grpc server starter의 구현은 여름에 런칭 계획 중
https://www.reddit.com/r/SpringBoot/comments/1255u5x/spring_boot_and_grpc/
- 특별히 spring boot3를 쓰지 않는 한, 둘 중에 뭘 쓰거나 상관 없어 보인다.
- lognet 구현체가 좀 더 잘 되어 있다.
- spring boot 지원 버전이 더 최신성을 잘 반영 함.
- native spring은 지원이 잘 안되는 것 같다.
- spring boot 지원 버전이 더 최신성을 잘 반영 함.
- 다른 모듈 support 은 yidongnan 모듈이 좀 더 잘 지원한다.
- https://yidongnan.github.io/grpc-spring-boot-starter/en/versions.html
- 2.15.0 버전은 spring boot 2.7.5 버전/spring cloud 2021.0.5버전을 지원 예정
- 2.14.0 버전은 spring boot 2.6.13/spring cloud 2021.0.5버전 지원
- 문제점은 spring boot 기반 start의 모듈은 official 모듈이 없고, 3th-party 모듈이 유지보수한다.
- 과연 써도 될까?
- armeria를 도입 하는 것이 좋은 장점이 될 수 있음.
- https://engineering.linecorp.com/ko/blog/introduce-armeria
- https://d2.naver.com/helloworld/6080222
- HTTP/GRPC 둘다 서비스 가능
- RPC docs 지원
- Spring과 integration support 가능
- armeria + spring 두개를 띄워서 서비스 가능하여, 별도 migration의 노고가 줄어든다.
- 단점, spring webflux 기반이어야지 가능하고, 그렇지 않다면 전환 비용이 있음.
- https://yidongnan.github.io/grpc-spring-boot-starter/en/versions.html
protobuf 병합
ref.
QA) proto 파일을 어떻게 공유 할 것인가?
- repository를 따로 구성해서 공유 한다.
- 문제는 팀 전체가 공유 하는 경우, proto 파일들이 방대해질 수 있음.
- https://github.com/grpc-ecosystem/awesome-grpc#tools
- https://github.com/bojand/ghz
- grpc load test tool
- https://github.com/bojand/ghz
- grpc를 web에서는 바로 쓸 수 없어서, https://github.com/grpc/grpc-web 를 써야 한다.
- 이유는 web broser에서 동작 하는 grpc client 의 경우 trailer spec에 대한 이슈로 grpc 자체를 바로 받을 수 없어서 body 끝에 trailer를 담는 방식으로 해결
- ref. https://carlmastrangelo.com/blog/why-does-grpc-insist-on-trailers
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 필터 동작 방식
'프로그래밍 > grpc' 카테고리의 다른 글
grpc ui client (kreya, postman) (0) | 2023.07.21 |
---|---|
protocol buffers(protobuf) 톺아보자. (는 훼이크, 간단히 알아보자) (0) | 2023.07.21 |