🔻Back-End/Features

[Features] ngrok 기반 로컬 LoadBalancer 구현

_니지 2024. 8. 18. 22:09

❗사전 준비

https://radiant515.tistory.com/655

 

[ngrok] ngrok 개념 및 사용법

❗ngrok란?로컬 개발 환경에서 실행 중인 서버를 인터넷에서 접근 가능한 공용 URL로 노출시키는 역할을 한다.  ❗ngrok 설치https://ngrok.com/download" data-og-host="ngrok.com" data-og-source-url="https://ngrok.com/dow

radiant515.tistory.com

 

 

 

❗프로젝트 아키텍처

ngrok를 기반으로 로컬에서 사용하는 로드밸런서를 구현하고자 한다. ngrok의 도메인에 연결된 로컬 5000번 포트로 요청이 들어오면 5001, 5002번 실행 중인 동일한 서버에 부하 분산 처리를 하는 방식이다.

 

 

❗ngrok.yml

version: "2"
authtoken: [토큰]
tunnels:
  [서버 이름]:
    proto: http
    addr: [포트 번호]

ngrok 도메인을 할당할 로컬 포트를 작성한다. 

 

 

ngrok start --config "C:\Users\[사용자이름]\.ngrok\ngrok.yml" --all

ngrok.exe를 실행 후 해당 명령을 실행하면 ngrok.yml의 내용이 반영된다.

 

명령어를 실행하면 ngrok의 도메인을 알려준다.

 

 

❗로드밸런싱할 서버 실행

해당 프로젝트는 flask로 작성되어 있기 때문에 이를 기반으로 하지만 다른 프로젝트를 실행하여도 된다. 동일한 프로젝트를 각각 5001, 5002 포트로 실행한다.

 

 

❗로드밸런서 구현

from flask import Flask, request, Response
import requests

app = Flask(__name__)

# 로드 밸런싱할 서버 목록 (5001번, 5002번 포트의 서버) -> 다른 포트를 사용할 경우 수정할 것
servers = ["http://localhost:5001", "http://localhost:5002"]
current_server = 0

# 라운드 로빈 방식으로 서버 선택
def get_next_server():
    global current_server
    server = servers[current_server]
    current_server = (current_server + 1) % len(servers)
    return server

# 모든 요청을 해당 서버로 프록시 처리
@app.route('/', defaults={'path': ''}, methods=["GET", "POST", "PUT", "DELETE"])
@app.route('/<path:path>', methods=["GET", "POST", "PUT", "DELETE"])
def proxy(path):
    target_server = get_next_server()
    target_url = f"{target_server}/{path}"

    # 원본 요청 정보를 사용하여 대상 서버로 요청 전달
    if request.method == "GET":
        resp = requests.get(target_url, headers=request.headers, params=request.args)
    elif request.method == "POST":
        resp = requests.post(target_url, headers=request.headers, data=request.get_data(), params=request.args)
    elif request.method == "PUT":
        resp = requests.put(target_url, headers=request.headers, data=request.get_data(), params=request.args)
    elif request.method == "DELETE":
        resp = requests.delete(target_url, headers=request.headers, params=request.args)

    # 대상 서버의 응답을 클라이언트에게 전달
    return Response(resp.content, status=resp.status_code, headers=dict(resp.headers))

if __name__ == "__main__":
    # 프록시 서버를 5000번 포트에서 실행
    app.run(host="0.0.0.0", port=5000)

파이썬 기반을 구현된 로드밸런서이다. 해당 파일은 5000번 포트로 실행되며 5000번 포트로 들어온 명령은 servers 리스트에 있는 다른 포트로 전달될 것이다.

 

 

❗결과

위에서 연결된 도메인으로 브라우저에서 접속하면 로드밸런서가 잘 작동하는 것을 볼 수 있다!!

 

 

 

 

 

 

728x90
반응형