NDNS Router는 여러 개의 동일한 NDNS API 서버 인스턴스에 대한 로드 밸런싱을 제공하는 Go 언어로 작성된 고성능 리버스 프록시 서버입니다.
- 여러 NDNS API 서버 인스턴스에 대한 로드 밸런싱
- 스마트 로드 밸런싱 전략 (최소 부하 + 라운드 로빈)
- 서버 이전/현재 상태 추적
- 자동 서버 상태 모니터링 및 헬스 체크
- Redis 또는 메모리 기반 서버 상태 저장
- 환경 변수를 통한 설정 관리
NDNS Router는 다음과 같은 주요 컴포넌트로 구성됩니다:
- HTTP 리버스 프록시: 클라이언트 요청을 적절한 API 서버로 라우팅합니다.
- 서버 풀 관리자: API 서버 목록과 상태를 관리합니다.
- 로드 밸런서: 스마트 알고리즘을 이용해 최적의 서버를 선택합니다.
- 헬스 체커: 서버의 상태를 주기적으로 점검합니다.
- 저장소: Redis 기반 서버 상태 저장소를 제공합니다.
- 환경 설정 관리자: 애플리케이션 설정을 로드하고 관리합니다.
NDNS Router는 다음과 같은 로드 밸런싱 전략을 사용합니다:
- 스마트 밸런싱: 최소 부하 상태와 라운드 로빈을 조합하여 최적의 서버를 선택합니다.
- 가장 부하가 적은 서버를 먼저 선택합니다.
- 모든 서버의 부하가 높은 경우 라운드 로빈으로 대체합니다.
- 건강한 서버가 없는 경우에도 라운드 로빈을 사용합니다.
- Go 1.16 이상
- (선택) Redis 서버 (지속적인 서버 상태 관리를 위해)
go build -o ndns-router ./pkg환경 변수는 다음과 같은 방법으로 설정할 수 있습니다:
- 시스템 환경 변수
.env파일 (프로젝트 루트에 위치)
| 변수명 | 설명 | 기본값 | 필수 여부 |
|---|---|---|---|
| SERVER_LIST | NDNS API 서버 목록 (쉼표로 구분) | - | 필수 |
| PORT | 라우터 서버의 포트 번호 | 8080 | 선택 |
| APP_ENV | 애플리케이션 환경 (dev, prod) | dev | 선택 |
| MAX_REQUESTS | 서버당 최대 동시 요청 수 | 10 | 선택 |
| USE_REDIS | Redis 저장소 사용 여부 | false | 선택 |
| REDIS_ADDR | Redis 서버 주소 | localhost:6379 | 선택 |
| REDIS_PASSWORD | Redis 서버 비밀번호 | - | 선택 |
| REDIS_DB | Redis 데이터베이스 번호 | 0 | 선택 |
.env 파일 예시:
SERVER_LIST=http://api1.example.com,http://api2.example.com
PORT=9090
APP_ENV=prod
MAX_REQUESTS=15
USE_REDIS=true
REDIS_ADDR=redis.example.com:6379
REDIS_PASSWORD=secretpassword
REDIS_DB=1
# 환경 변수 직접 설정
SERVER_LIST="http://api1.example.com,http://api2.example.com" ./ndns-router
# 또는 .env 파일 사용
./ndns-routerNDNS Router는 다음 두 가지 저장소 방식을 지원합니다:
- 서버가 재시작되면 서버 상태 정보가 초기화됩니다.
- 다중 NDNS Router 인스턴스 간에 상태 공유가 불가능합니다.
- 추가 설정이 필요 없어 간단하게 사용할 수 있습니다.
- 개발 환경이나 단일 인스턴스 운영에 적합합니다.
- 서버가 재시작되어도 서버 상태 정보가 유지됩니다.
- 여러 NDNS Router 인스턴스 간에 서버 상태 공유가 가능합니다.
- Redis 설치 및 설정이 필요합니다.
- 프로덕션 환경이나 다중 인스턴스 운영에 적합합니다.
Redis 저장소를 사용하려면 다음 환경 변수를 설정하세요:
USE_REDIS=true
REDIS_ADDR=localhost:6379
REDIS_PASSWORD=yourpassword # 필요한 경우
REDIS_DB=0
NDNS Router는 다음과 같은 방식으로 API 서버와 통신합니다:
- 헬스 체크: 정기적으로 각 API 서버의
/health엔드포인트로 GET 요청을 보냅니다. - 프록시 요청: 클라이언트의 모든 HTTP 요청을 선택된 API 서버로 전달합니다.
API 서버는 다음과 같은 헤더를 통해 라우터로부터 전달된 요청을 식별할 수 있습니다:
X-Proxy: NDNS-RouterX-Proxy-Version: <router-version>X-Forwarded-For: <client-ip>
NDNS Router는 다음과 같은 관리 API 엔드포인트를 제공합니다:
GET /router/status: 라우터의 현재 상태 정보를 반환합니다.GET /router/servers: 등록된 서버 목록과 각 서버의 상태 정보를 반환합니다.GET /router/health?server=URL&status=STATUS: API 서버의 상태를 수동으로 업데이트합니다.
docker build -t ndns-router .docker run -p 8080:8080 \
-e SERVER_LIST="http://api1.example.com,http://api2.example.com" \
-e MAX_REQUESTS=15 \
-e USE_REDIS=true \
-e REDIS_ADDR=redis-host:6379 \
ndns-routerNDNS Router는 성능을 최적화하기 위해 다음과 같은 기술을 사용합니다:
- 동시성 제어: Go의 고루틴과 채널을 이용한 비동기 작업 처리
- 연결 풀링: HTTP 연결 재사용으로 오버헤드 감소
- 메모리 캐싱: 서버 상태 정보를 메모리에 저장하여 빠른 접근
- 스마트 로드 밸런싱: 서버의 현재 부하 상태에 기반한 요청 분산
- Redis 지원: 다중 인스턴스 환경에서 상태 공유로 효율성 향상
이 프로젝트는 MIT 라이센스 하에 제공됩니다.
NDNS 라우터는 Redis를 사용하여 서버 상태 정보를 저장하고 관리합니다. 다음과 같은 키 구조를 사용합니다:
ndns:router:servers:list(Set): 등록된 NDNS API 서버 URL 목록ndns:router:servers:status(Hash): 각 서버의 전체 상태 정보 (JSON 형식)ndns:router:servers:health(Hash): 서버 건강 상태 (빠른 조회용)ndns:router:servers:load(Hash): 서버 부하 정보 (빠른 조회용)
이 구조를 통해 서버 재시작 후에도 상태 정보가 유지되며, 복잡한 분산 환경에서도 안정적인 운영이 가능합니다.
NDNS 라우터는 다음 환경 변수를 통해 설정할 수 있습니다:
PORT: 라우터 서버 포트 (기본값: 8080)APP_ENV: 애플리케이션 환경 (기본값: dev)SERVER_LIST: NDNS API 서버 URL 목록 (쉼표로 구분)MAX_REQUESTS: 서버당 최대 동시 요청 수 (기본값: 10)REDIS_ADDR: Redis 서버 주소 (기본값: localhost:6379)REDIS_PASSWORD: Redis 비밀번호 (기본값: 없음)REDIS_DB: Redis DB 번호 (기본값: 0)
# 환경 변수 설정
export SERVER_LIST=http://api1:3000,http://api2:3000,http://api3:3000
export REDIS_ADDR=redis:6379
export MAX_REQUESTS=15
# 실행
go run pkg/main.go또는 Docker를 사용:
docker build -t ndns-router .
docker run -p 8080:8080 \
-e SERVER_LIST=http://api1:3000,http://api2:3000,http://api3:3000 \
-e REDIS_ADDR=redis:6379 \
-e MAX_REQUESTS=15 \
ndns-router