API 구현
API 정의 문서를 통해 정의된 API를 구현한다.
라이브러리 적용
API 정의를 통해 빌드된 Python 라이브러리는 버즈빌 내부적으로 사용하는 프라이빗 PyPI 패키지 관리
시스템으로 배포된다. pip
커맨드를 사용해서 배포된 라이브러리를 가져올 수 있다.
$ pip install --extra-index-url $BUZZVIL_PYPI_HOST PACKAGE && pip freeze > requirements.txt
Collecting PACKAGE
...
인터페이스 구현
라이브러리에 정의된 API를 구현함으로써 클라이언트에게 서비스를 제공할 수 있다.
# librarysvc/librarysrv/server.py
import logging
import grpc
from library import library_pb2, library_pb2_grpc
class LibraryServer(library_pb2_grpc.LibraryServiceServicer):
def GetBook(self, request, context):
# TODO: Find the book from database.
return library_pb2.Book(
title="Title here.",
author="Author here."
)
서버 구성
서버 생성 및 실행
gRPC를 통해 서버를 생성하고 실행할 수 있다. 이때 app.py
에서는 연결을 맺거나 서버를 실행하는 역할에만 집중하고 실제
구현은 내부 패키지에게 위임한다. 자세한 사용법은
Starting the python server 문서를 참고한다.
# app.py
from concurrent import futures
import os
import time
import logging
import grpc
from librarysvc.librarysrv.server import LibraryServer
from library import library_pb2_grpc
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
library_pb2_grpc.add_LibraryServiceServicer_to_server(LibraryServer(), server)
server.add_insecure_port('[::]:{}'.format(os.environ['PORT']))
server.start()
try:
while True:
time.sleep(_ONE_DAY_IN_SECONDS)
except KeyboardInterrupt:
server.stop(0)
if __name__ == '__main__':
logging.basicConfig()
serve()
서버 로깅
TBD
프로젝트 구성
폴더 구조
TBD