[nodejs] REST API를 위한 서비스 디스커버리 및 로드 밸런싱

서비스 디스커버리 및 로드 밸런싱은 분산 시스템을 만들기 위해 중요한 요소입니다. Node.js를 사용하여 REST API를 구축하고 서비스 디스커버리 및 로드 밸런싱을 적용하는 방법에 대해 알아보겠습니다.

1. 서비스 디스커버리

서비스 디스커버리는 분산 시스템에서 각 서비스 인스턴스의 위치를 자동으로 발견하고 식별하는 능력을 의미합니다. 이를 위해 서비스 레지스트리와 디스커버리 시스템을 사용할 수 있습니다. 예를 들어, Netflix의 Eureka나 Consul과 같은 도구를 활용할 수 있습니다.

아래는 Node.js를 사용하여 간단한 서비스 디스커버리 기능을 가진 REST API의 예시입니다.

// serviceDiscovery.js

class ServiceDiscovery {
  constructor() {
    this.services = [];
  }

  registerService(serviceName, url) {
    this.services.push({ serviceName, url });
  }

  discoverService(serviceName) {
    return this.services.find(service => service.serviceName === serviceName);
  }
}

module.exports = ServiceDiscovery;

위의 코드는 ServiceDiscovery 클래스를 정의하고, registerService 메소드를 사용하여 서비스를 등록하고, discoverService 메소드를 사용하여 해당 서비스를 찾습니다.

2. 로드 밸런싱

로드 밸런싱은 서버 부하를 분산시키기 위해 여러 서버 인스턴스에 요청을 분배하는 프로세스입니다. Node.js 애플리케이션에서 로드 밸런싱을 구현하는 가장 간단한 방법은 http-proxy 모듈을 사용하는 것입니다.

아래는 http-proxy 모듈을 사용하여 로드 밸런싱 기능을 추가한 예시입니다.

// loadBalancer.js

const httpProxy = require('http-proxy');
const proxy = httpProxy.createProxyServer({});

const servers = [
  { url: 'http://localhost:3001' },
  { url: 'http://localhost:3002' },
  // Add more server URLs as per requirement
];

let currentServerIndex = 0;

const selectServer = () => {
  if (currentServerIndex === servers.length) {
    currentServerIndex = 0;
  }
  return servers[currentServerIndex++].url;
};

const balancer = (req, res) => {
  const target = selectServer();
  proxy.web(req, res, { target });
};

module.exports = balancer;

위의 코드에서는 http-proxy 모듈을 사용하여 balancer 함수를 정의하고, 요청을 적절한 서버로 라우팅합니다.

결론

Node.js를 사용하여 REST API를 구현하고 서비스 디스커버리와 로드 밸런싱을 적용하는 방법에 대해 간단히 살펴보았습니다. 서비스 디스커버리와 로드 밸런싱은 분산 시스템의 안정성과 성능을 향상시키는 데 중요한 기능이므로, 이러한 기능을 구현할 때 적절한 도구와 방법을 선택하는 것이 중요합니다.

참고 자료