Skip to content

Latest commit

 

History

History
executable file
·
159 lines (119 loc) · 4 KB

README.md

File metadata and controls

executable file
·
159 lines (119 loc) · 4 KB

Zoologist

A Curator-esque ZooKeeper framework for Node.js.

NPM

Installation

npm install zoologist --save

Examples

Service Registration

'use strict';

var Zoologist               = require('zoologist').Zoologist;
var ServiceInstanceBuilder  = require('zoologist').ServiceInstanceBuilder;
var ServiceDiscoveryBuilder = require('zoologist').ServiceDiscoveryBuilder;

// Client
var zoologistClient = Zoologist.newClient('127.0.0.1:2181');

// Start the client (connect to ZooKeeper)
zoologistClient.start();

// Service Instance
var serviceInstance = ServiceInstanceBuilder
                        .builder()
                        .address('127.0.0.1')
                        .port(process.env.PORT)
                        .name('my/service/name/v1')
                        .build();

// Service Discovery
var serviceDiscovery = ServiceDiscoveryBuilder
                         .builder()
                         .client(zoologistClient)
                         .thisInstance(serviceInstance)
                         .basePath('services')
                         .build();

// Register a Service
serviceDiscovery.registerService(function onRegister(err, data) {
  console.log({
    id: data.id,
    name: data.name,
    address: data.address,
    port: data.port
  });
});

Service Discovery

'use strict';

var Zoologist               = require('zoologist').Zoologist;
var ServiceInstanceBuilder  = require('zoologist').ServiceInstanceBuilder;
var ServiceDiscoveryBuilder = require('zoologist').ServiceDiscoveryBuilder;

// Client
var zoologistClient = Zoologist.newClient('127.0.0.1:2181');

// Start the client (connect to ZooKeeper)
zoologistClient.start();

// Service Instance
var serviceInstance = ServiceInstanceBuilder
                        .builder()
                        .address('127.0.0.1')
                        .port(process.env.PORT)
                        .name('my/service/name/v1')
                        .build();

// Service Discovery
var serviceDiscovery = ServiceDiscoveryBuilder
                         .builder()
                         .client(zoologistClient)
                         .thisInstance(serviceInstance)
                         .basePath('services')
                         .build();

// Service Provider (providerStrategy: 'RoundRobin' or 'Random')
var serviceProvider = serviceDiscovery.serviceProviderBuilder()
                        .serviceName('my/service/name/v1')
                        .providerStrategy('RoundRobin')
                        .build();

// Discover available Services and provide an instance
serviceProvider.getInstance(function onInstanceReturn(err, data) {
  console.log({
    id: data.id,
    name: data.name,
    address: data.address,
    port: data.port,
    serviceUrl: serviceUrl
  });
});

Leadership Election

'use strict';

var async = require('async');

var Zoologist = require('..').Zoologist;

var LeaderElection = require('..').LeaderElection;

var client = Zoologist.newClient('127.0.0.1:2181');

/*
 * This represents how many active elections you will need at one time.
 * The default is 10.
 */
client.setMaxListeners(1024);
client.start();

var election = new LeaderElection(client, '/my/path', 'my-id');

election.start(function(err, res){
  console.log(res);
});

election.on('groupLeader', function () {
  console.log('I am the leader, watch me lead!');
});

election.on('myLeader', function (myLeader) {
  console.log('My leader is', myLeader);
});

election.on('myFollower', function (myFollower) {
  console.log('My follower is', myFollower);
});

election.on('topologyChange', function (data) {
  console.log('Topology Change: ' + data);
});

election.on('error', function (err) {
  console.log('Error: ' + err);

  election.withdraw(function(err){
    console.log("Withdrawn the election!");

      election.start(function(err, res){
        console.log(res);
      });
  });
});