rocky-consul
Version:
Rocky HTTP proxy middleware for service discovery and balancing using Consul
135 lines (103 loc) • 4.11 kB
Markdown
[](https://github.com/h2non/rocky) middleware to easily setup a reverse HTTP proxy with service discovery and load balancer using [Consul](https://consul.io).
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
```js
var rocky = require('rocky')
var consul = require('rocky-consul')
var proxy = rocky()
```
Plug in as global middleware
```js
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
```js
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')
```
Return a middleware `function` with the Consul client as static property `function.consul`.
- **service** `string` - Consul service. Required
- **servers** `array<string>` - List of Consul servers URLs. Required
- **datacenter** `string` - Custom datacenter to use. If not defined the default one will be used
- **tag** `string` - Use a specific tag for the service
- **defaultServers** `array<string>` - Optional list of default target servers to balance. This avoid asking Consul the first time.
- **protocol** `string` - Transport URI protocol. Default to `http`
- **timeout** `number` - Consul server timeout in miliseconds. Default to `5000` = 5 seconds
- **interval** `number` - Consul servers update interval in miliseconds. Default to `120000` = 2 minutes
- **headers** `object` - Map of key-value headers to send to Consul
- **auth** `string` - Basic authentication for Consul. E.g: `user:p@s$`
- **onRequest** `function` - Executes this function before sending a request to Consul server. Passed arguments are: `httpOpts`
- **onUpdate** `function` - Executes this function on every servers update. Passed arguments are: `err, servers`
- **onResponse** `function` - Executes this function on every Consul server response. Passed arguments are: `err, servers, res`
Internally used micro Consul client interface.
Returns the Consul servers for the given service.
Passed arguments to the callback are: `cb(err, servers)`.
Perform the servers update asking to Consul
Passed arguments to the callback are: `cb(err, servers)`.
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()`.
Stop server update interval process.
MIT - Tomas Aparicio