gRPC나 Kreya나 각각의 공홈에 매우 잘 설명되어 있지만... 본인의 까먹 방지용으로 남겨둔다...
gRPC 사용하는 서버 작성하기
gRPC 라이브러리 설치
다음처럼 grpcio
를 설치해준다.
$ poetry add "grpcio"
Grpc 관련 유틸리티 도구를 제공하는 grpcio-tools
도 설치한다. 개발하는 과정에서만 사용하기 때문에 개발 라이브러리로 설치한다
$ poetry add "grpcio-tools" -D
참고로 여기서 사용한 파이썬 버전 및 라이브러리 버전은 다음과 같다.
$ python -V
Python 3.9.7
$ pip list | grep grpcio
grpcio 1.42.0
grpcio-tools 1.42.0
Proto 작성
이제 다음처럼 프로젝트 내에 protos
폴더를 만들어 helloworld.proto
에 프로토 파일을 작성한다.
// protos/helloworld.proto
syntax = "proto3";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
파이썬 파일 생성
이제 터미널에서 protos/
경로로 들어간 뒤 다음 명령어로 프로토 파일을 파이썬으로 빌드한다.
$ cd protos
$ python -m grpc_tools.protoc -I . --python_out=. --grpc_python_out=. helloworld.proto
실행이 완료되면 다음처럼 helloworld_pb2.py
와 helloworld_pb2_grpc.py
가 생겨있다.
$ tree .
.
├── helloworld.proto
├── helloworld_pb2.py
└── helloworld_pb2_grpc.py
이 때 helloworld_pb2_grpc.py
를 열어 import
구문을 다음처럼 프로제트 루트 기준 경로로 수정해주자. (이걸 안해주면 import 에러가 난다.)
# helloworld_pb2_grpc.py
# as-is
import helloworld_pb2 as helloworld__pb2
# to-be
from protos import helloworld_pb2 as helloworld__pb2
.proto -> .py 생성 시, 생성되는 python 파일의 import 문의 상대 경로로 작성되는게 여전히 바뀌지 않았다고 한다... 관련 이슈는 여기
구체 Servicer 클래스 작성
helloworld_pb2_grpc.py
내에 있는 GreeterServicer
는 아직 구현된 상태가 아니고, .proto
파일 내 service
의 시그니처만 작성되있다. GreeterServicer
를 구체적으로 구현하는 것은 개발자의 몫이다.
다음처럼 api.py
를 만들어 이 클래스를 상속받아 구현하자.
# api.py
from protos import helloworld_pb2_grpc, helloworld_pb2
class GreeterServicer(helloworld_pb2_grpc.GreeterServicer):
def SayHello(self, request, context):
print("GreeterServicer.Sayhello() was called !")
return helloworld_pb2.HelloReply(
message=f"hello {request.name}"
)
gRPC 서버 코드 작성
이제 서버를 기동하는 코드를 작성해보자. main.py
를 만들어 다음처럼 gRPC 서버 코드를 작성한다.
# main.py
from concurrent import futures
import grpc
from api import GreeterServicer
from protos import helloworld_pb2_grpc
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
helloworld_pb2_grpc.add_GreeterServicer_to_server(servicer=GreeterServicer(), server=server)
server.add_insecure_port('[::]:50051')
server.start()
server.wait_for_termination()
if __name__ == "__main__":
serve()
전체 프로젝트 구조
프로젝트 구조와 구성은 다음과 같다.
$ tree .
.
├── api.py
├── main.py
├── poetry.lock
├── protos
│ ├── helloworld.proto
│ ├── helloworld_pb2.py
│ └── helloworld_pb2_grpc.py
└── pyproject.toml
서버 실행
다음처럼 main.py
를 실행한다
$ python main.py
Kreya로 gRPC 통신 테스트해보기
Kreya는 gRPC GUI 클라이언트다. REST 통신에는 Postman이 있듯이.. 뭐 그런 역할 하는 애라고 보면 된다.
공홈 https://kreya.app/ 에서 다운받을 수 있다.
Project 세팅하기
Kreya를 실행하면 처음에 다음과 같은 화면이 등장한다.
Create project
버튼을 누르고, 다음처럼 프로젝트를 저장할 정보를 작성하자.
다 작성했으면 Create
버튼을 누른다. 그러면 이제 다음과 같은 화면이 등장한다.
우리는 .proto
파일을 직접 입력할거다. 첫번째 라디오 버튼을 클릭한 뒤 Proto files
에 다음처럼 프로젝트의 protos
경로를 주자.
Save 하고 나면 다음처럼 gRPC 서비스와 메시지가 왼쪽 탭에 등장한다.
엔드포인트 설정하기
Greeter
디렉토리를 클릭하면 위와 같이 Directory settings
화면이 등장하는데, 여기서 다음처럼 Endpoint
를 현재 떠있는 gRPC 서버로 작성해주자.
Server certifiacate validation
은 Disabled
로 설정한다.
메시지 보내기
이제 마지막이다. 왼쪽의 SayHello
를 누른 뒤, 적당히 메시지 값을 채워주고 위쪽의 Send
버튼을 누른다. 그럼 다음처럼 결과가 잘 나오는 것을 볼 수 있다.
참고
'더 나은 엔지니어가 되기 위해 > 라이브러리 리뷰' 카테고리의 다른 글
Commitizen으로 커밋, 버전 관리하기 (6) | 2021.05.22 |
---|---|
Feast - Quick Review (0) | 2021.05.15 |
Prefect - Quick Review (3) | 2021.05.09 |
MLflow - MLflow Projects (2) | 2021.05.08 |
MLflow - Models (0) | 2021.05.08 |