주뇽's 저장소

[MSA] Spring Eureka Service에 FastAPI 등록하기 본문

웹개발

[MSA] Spring Eureka Service에 FastAPI 등록하기

뎁쭌 2024. 7. 13. 10:50
728x90
반응형

Spring Eureka Service에 FastAPI 등록하기

1. 서론

마이크로서비스 아키텍처에서 서비스 디스커버리는 핵심적인 요소이다. Spring Cloud Netflix Eureka는 Java 생태계에서 널리 사용되는 서비스 디스커버리 도구이다. 그러나 Python으로 작성된 FastAPI 서비스를 Eureka에 등록하는 방법에 대해서는 잘 알려져 있지 않다. 이 글에서는 FastAPI 서비스를 Eureka에 등록하는 방법과 그 이유에 대해 알아본다.

2. FastAPI를 Eureka에 등록하는 이유

  1. 다양한 기술 스택 통합: 마이크로서비스 아키텍처에서는 각 서비스에 가장 적합한 기술을 선택할 수 있다. FastAPI를 Eureka에 등록함으로써 Java와 Python 서비스를 동일한 환경에서 관리할 수 있다.
  2. 중앙화된 서비스 관리: Eureka를 통해 모든 서비스의 위치와 상태를 한 곳에서 관리할 수 있다.
  3. 동적 스케일링: 서비스의 인스턴스를 동적으로 추가하거나 제거할 때 Eureka가 자동으로 이를 감지하고 업데이트한다.
  4. 로드 밸런싱 지원: Eureka와 통합된 로드 밸런서를 사용하여 트래픽을 여러 서비스 인스턴스에 분산시킬 수 있다.

3. FastAPI를 Eureka에 등록하는 방법

3.1 필요한 라이브러리 설치

먼저 필요한 라이브러리를 설치한다:

pip install fastapi uvicorn py-eureka-client

3.2 FastAPI 애플리케이션 코드

다음은 Eureka에 등록되는 FastAPI 애플리케이션의 기본 구조이다:

import logging
from contextlib import asynccontextmanager
from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware
from py_eureka_client import eureka_client
import uvicorn
import socket

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

@asynccontextmanager
async def lifespan(app_: FastAPI):
    # Startup
   
    host_ip = "localhost"
    logger.info(f"Initializing Eureka client with host: {host_ip}, port: 8000")
    await eureka_client.init_async(
        eureka_server="http://localhost:8761/eureka",
        app_name="fastapi-pdf-service",
        instance_port=8000,
        instance_host=host_ip,
        instance_ip=host_ip
    )
    logger.info("Eureka client initialized")
    yield
    # Shutdown
    logger.info("Stopping Eureka client")
    await eureka_client.stop_async()

app = FastAPI(lifespan=lifespan)


@app.get("/")
async def read_root():
    logger.info("Handling request for root path")
    return {"Hello": "World"}

@app.get("/health")
async def health_check():
    logger.info("Handling health check request")
    return {"status": "UP"}

if __name__ == "__main__":
    logger.info("Starting FastAPI application")
    uvicorn.run(app, host="0.0.0.0", port=8000)

3.3 주요 포인트 설명

  1. 비동기 초기화: @app.on_event("startup") 데코레이터를 사용하여 애플리케이션 시작 시 Eureka 클라이언트를 비동기적으로 초기화한다. 
    1. 현재는 on_event가 사라지고  ifespan으로 대체
  2. Eureka 서버 주소: eureka_server 파라미터에 Eureka 서버의 주소를 지정한다.
  3. 애플리케이션 이름: app_name은 Eureka에 등록될 서비스의 이름이다.
  4. 포트 지정: instance_port는 FastAPI 서비스가 실행되는 포트이다.
  5. 헬스 체크 엔드포인트: /health 엔드포인트를 통해 서비스의 상태를 확인할 수 있다.

4. 결과

5. 결론

FastAPI를 Spring Eureka Service에 등록함으로써 Python 기반 서비스를 Java 생태계의 마이크로서비스 아키텍처에 원활하게 통합할 수 있다. 이는 기술 다양성을 제공하면서도 중앙화된 서비스 관리의 이점을 누릴 수 있게 해준다. 적절한 설정과 주의사항을 고려하면 FastAPI와 Spring Cloud Eureka의 강점을 결합하여 강력하고 유연한 마이크로서비스 환경을 구축할 수 있다.