[javascript] Express.js에서의 분산 서버 환경 구축 방법

Express.js는 Node.js를 기반으로 한 웹 애플리케이션 프레임워크로, 개발자들이 빠르고 간편하게 웹 서버를 구축할 수 있도록 도와줍니다. 이 글에서는 Express.js를 사용하여 분산 서버 환경을 구축하는 방법을 알아보겠습니다.

1. Load Balancing(로드 밸런싱)

분산 서버 환경에서는 여러 대의 서버 인스턴스가 동시에 실행되어 효율적으로 트래픽을 처리합니다. 이를 위해 로드 밸런싱이 필요한데, 로드 밸런싱은 들어오는 요청을 여러 서버 인스턴스로 분산시키는 역할을 합니다.

가장 간단한 로드 밸런싱 방법 중 하나는 express-loadbalancer 모듈을 사용하는 것입니다. 이 모듈을 설치하고 Express 애플리케이션에 다음과 같이 설정하면 됩니다.

const express = require('express');
const app = express();

const loadbalancer = require('express-loadbalancer');
loadbalancer.init(app, {
  servers: [
    { host: 'server1.example.com', port: 3000 },
    { host: 'server2.example.com', port: 3000 },
    { host: 'server3.example.com', port: 3000 }
  ]
});

app.listen(80, () => {
  console.log('Load Balancer started on port 80');
});

이렇게 설정하면 server1.example.com, server2.example.com, server3.example.com의 서버 인스턴스로 들어오는 요청이 분산되어 처리됩니다.

2. Service Discovery(서비스 디스커버리)

분산 환경에서 서버 인스턴스의 개수가 동적으로 변경될 수 있기 때문에, 서버의 IP 주소와 포트 번호를 하드코딩하는 것은 번거로운 일입니다. 이를 해결하기 위해 서비스 디스커버리 메커니즘이 사용됩니다.

서비스 디스커버리를 구현하기 위한 대표적인 솔루션 중 하나는 Consul입니다. Consul은 분산된 서비스를 등록하고 검색할 수 있는 서비스 디스커버리 툴입니다.

다음은 Express.js 애플리케이션에서 Consul을 사용하는 예시입니다.

const express = require('express');
const app = express();

const consul = require('consul')();
const serviceName = 'my-service';

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(3000, () => {
  // 서비스를 등록합니다.
  consul.agent.service.register({
    name: serviceName,
    address: 'localhost',
    port: 3000
  }, (err) => {
    if (err) throw err;

    console.log(`${serviceName} registered to Consul`);
  });

  console.log('Server started on port 3000');
});

위의 예시에서는 Express 애플리케이션이 3000번 포트에서 실행되며, 서비스가 시작될 때 Consul에 등록됩니다.

참고 자료