❗사전 준비
https://radiant515.tistory.com/655
❗프로젝트 아키텍처
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
반응형
'🔻Back-End > Features' 카테고리의 다른 글
[Features] S3 버킷 생성 및 SpringBoot 프로젝트에 연결 (0) | 2024.08.10 |
---|---|
[Features] Spring Security 구현 - 3 (0) | 2024.08.03 |
[Features] Spring Security 구현 - 2 (0) | 2024.08.03 |
[Features] Spring Security 구현 - 1 (0) | 2024.08.01 |
[Features] spring 이메일 인증 구현(구글 이메일 이용) (0) | 2023.01.19 |