[msa-perf-lab] Flask <-> Go(Gin) gRPC 환경 세팅 및 내부 gRPC 통신 테스트
저번 글에서 Flask + PostgreSQL 환경 세팅 및 docker-compose 컨테이너화 까지 진행했었다.
이번 글에서는 Go 서버 구현은 넘어가고, Flask <-> Go gRPC 환경 세팅에 대한 내용을 다룰 것이다.
디렉터리 구조


우선 디렉터리 구조를 좀 손봤다. 작은 프로젝트가 될 거라서 구조는 신경쓰지 않으려고 했는데, 플라스크 기준으로 3가지 통신 방식이 있었다.
1. Flask가 요청 받고 직접 응답 (internal)
2. Flask가 요청 받고 Go에게 Rest로 전달 (rest)
3. Flask가 요청 받고 Go에게 gRPC로 전달 (grpc)
아직 제대로 시작도 안 했는데 벌써 복잡해져서, 아예 초반에 디렉터리 구조를 잡아버렸다.
그나마 다행인 건, gRPC 서버(Go)에서는 gRPC 핸들러, 라우터를 구현하지 않아도 된다는 점이었다. 핸들러, 라우터는 Rest만 사용하기에, Service만 Rest, gRPC로 구분하면 된다.
Go서버: service.proto

service.proto는 gRPC 통신 시 호출할 수 있는 함수를 정의해 놓은 명세서이다.
CoreService를 정의하고, 그 안에 Ping 함수와 요청/응답 자료형을 명시했다.
아래 PingRequest와 PingResponse는 Ping에서 사용하는 자료형을 구체적으로 정의한 것이다. 구조체 형태라고 보면 되고, =1 로 초기화 한 것은 필드 번호를 의미한다.
gRPC는 JSON 형태가 아닌 프로토콜 버퍼 형태로 전달되는데, 이 때 message 라는 필드명이 날아가는 게 아니라 1 이라는 필드명으로 날아가게 되고, gRPC 클라이언트에서는 1 이라는 필드명을 보고 service.proto파일을 참조해 실제 필드명을 확인하게 된다.
Go서버: ping_service_grpc.go (함수 구현체)

service.proto에 정의한 Ping 함수를 구현한 것이다. 편리하게도(?) gRPC는 service.proto에 함수를 정의하고 이렇게 구현하기만 하면 통신이 가능하다. 라우터나 핸들러는 구현할 필요 없다. 물론 그 전에 많은 세팅을 해야 하지만 말이다.
Flask서버: gRPC 라우터 + 서비스


Flask 측(gRPC 클라이언트) 에서는 이렇게 라우터 + 서비스를 구성하면 된다.
Flask가 게이트웨이 역할을 하고, 요청을 Go서버에 위임해 처리한 후 응답한다. 구체적인 흐름은 이렇다.
사용자 요청 (Rest) <-> (Rest) Flask Gateway (gRPC) <-> (gRPC) go core
간단한 요청은 Flask 측에서 즉시 응답하고, 복잡한 연산은 gRPC로 Go에게 위임하여 결과를 받아와 응답하는 형태로 활용할 수 있다.
통신 테스트

우선 docker compose로 그룹화 한 Flask, Go(Gin), PostgreSQL을 한 번에 띄워준다.

3가지 통신 방식 전부 성공했다. 순서대로 설명하자면 아래와 같다.
(R -> Rest, G -> gRPC)
curl 127.0.0.1:5001/internal/users: 사용자 (R) <-> (R) Flask 즉시 응답
curl 127.0.0.1:5001/rest/ping: 사용자 (R) <-> (R) Flask (R) <-> (R) Go
curl 127.0.0.1:5001/grpc/ping: 사용자 (R) <-> (R) Flask (G) <-> (G) Go
==========
msa-perf-lab 깃허브:
https://github.com/YangSunkue/msa-perf-lab
==========
이제 Flask + Go, Rest + gRPC 개발환경 세팅이 완전히 끝났다. 역시 환경 세팅이 가장 힘든 것 같다. 별 것 아닌 부분에서 자꾸 시간을 잡아먹을 때가 많으니 말이다.
내일부터는 msa-perf-lab 프로젝트의 본 목표인 성능 테스트를 시작하려고 한다. 가장 먼저 할 것은 Flask <-> Go 내부 통신 시 Rest와 gRPC의 속도 차이 테스트이다.
아마 테스트를 위해선 성능 측정 라이브러리라던가, 더미 데이터를 넣는다던가, 모니터링 또는 시각화 도구를 활용한다던가 해야 할 것 같은데, 대부분 처음 해보는 것들이라 꽤 오래 걸릴지도 모르겠다. 그래도 한 번 세팅해 두면 그 다음 실험부터는 수월하게 진행될 듯 하다.