Python 프로젝트

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