Presented by @tlhunter@mastodon.social
I'm writing Distributed Systems with Node.js: bit.ly/34SHToF
frontend http-in
bind 0.0.0.0:80
default_backend www
backend www
server www1 www.example.org:80
const request = require('request');
request.get('http://data.example.org:80', (err, data) => {
doStuff(data);
});
const CONSUL_ID = require('uuid').v4();
let details = {
name: 'data',
address: HOST,
port: PORT,
id: CONSUL_ID,
check: {
ttl: '10s',
deregister_critical_service_after: '1m'
}
};
consul.agent.service.register(details, err => {
// schedule heartbeat
});
setInterval(() => {
consul.agent.check.pass({id:`service:${CONSUL_ID}`}, err => {
if (err) throw new Error(err);
console.log('told Consul that we are healthy');
});
}, 5 * 1000);
process.on('SIGINT', () => {
console.log('SIGINT. De-Registering...');
let details = {id: CONSUL_ID};
consul.agent.service.deregister(details, (err) => {
console.log('de-registered.', err);
process.exit();
});
});
let known_data_instances = [];
const watcher = consul.watch({
method: consul.health.service,
options: {
service: 'data',
passing: true
}
});
watcher.on('change', data => {
known_data_instances = [];
data.forEach(entry => {
known_data_instances.push(`http://${entry.Service.Address}:${entry.Service.Port}/`);
});
});
function getData(cb) {
let url = known_data_instances[Math.floor(Math.random()*known_data_instances.length)];
request(url, {json:true}, (err, res, data) => {
if (err) return cb(err);
cb(null, data);
});
}
frontend http-in
bind 0.0.0.0:80
default_backend www
backend www{{range service "www"}}
server {{.ID}} {{.Address}}:{{.Port}}{{end}}
$ consul-template -template "./advanced.cfg.template:./advanced.cfg:./haproxy-restart.sh"
#!/bin/bash
echo "DEBUG: restarting haproxy"
haproxy -f ./advanced.cfg -p ./haproxy.pid -D -st $(cat ./haproxy.pid)