Home

Awesome

rocky-consul Build Status NPM

rocky middleware to easily setup a reverse HTTP proxy with service discovery and load balancer using Consul.

Essentially, this middleware will ask to Consul on every interval (configurable) to retrieve a list of URLs of a specific service (e.g: API, CDN, storage), and then them will be provided to rocky in order to balance the incoming HTTP traffic between those URLs.

<table> <tr> <td><b>Name</b></td><td>consul</td> </tr> <tr> <td><b>Rocky</b></td><td>+0.2</td> </tr> <tr> <td><b>Scope</b></td><td>global, route</td> </tr> <tr> <td><b>Type</b></td><td>forward / balance</td> </tr> </table>

Installation

npm install rocky-consul --save

Usage

var rocky = require('rocky')
var consul = require('rocky-consul')

var proxy = rocky()

Plug in as global middleware

proxy.use(consul({
  // Servers refresh interval (default to 60000)
  interval: 60 * 5 * 1000,
  // App service name (required)
  service: 'web',
  // Use a custom datacenter (optional)
  datacenter: 'ams2',
  // Consul servers pool
  servers: [
    'http://demo.consul.io',
    'http://demo.consul.io'
  ]
}))

// Handle all the traffic
proxy.all('/*')

proxy.listen(3000)
console.log('Rocky server started')

Plug in as route level middleware

proxy
  .get('/download/:id')
  .use(consul({
    // Servers refresh interval (default to 60000)
    interval: 60 * 5 * 1000,
    // App service name (required)
    service: 'web',
    // Use a custom datacenter (optional)
    datacenter: 'ams2',
    // Consul servers pool
    servers: [
      'http://demo.consul.io',
      'http://demo.consul.io'
    ]
  }))

// Handle the rest of the traffic without using Consul
proxy.all('/*')
  .forward('http://my.server')
  .replay('http://old.server')

proxy.listen(3000)
console.log('Rocky server started')

API

consul(options) => Function(req, res, next)

Return a middleware function with the Consul client as static property function.consul.

Options

Consul(options)

Internally used micro Consul client interface.

consul#servers(cb)

Returns the Consul servers for the given service. Passed arguments to the callback are: cb(err, servers).

consul#update(cb)

Perform the servers update asking to Consul Passed arguments to the callback are: cb(err, servers).

consul#startInterval()

Start the servers update interval as recurrent job for the given miliseconds defined at options.interval. You should not call this method unless you already called stopInterval().

consul#stopInterval()

Stop server update interval process.

License

MIT - Tomas Aparicio