Giter Club home page Giter Club logo

msdr-zk-nodejs's Introduction

msdr-zk-nodejs

Build Status NPM

A Simple ZooKeeper based Microservices Service Discovery and Registery library for node.js services, that automatically re-register the watch again on the path when data is requested for the first time.

Important Point

This library doesn't create the basePath at the ZooKeeper tree for services, assuming each service needs to be provisioned as the requirement comes and to avoid the services getting registered at the incorrect basePath at the Zookeeper end in the system.

Installation

npm install --save msdr-zk

Usage.

const msdzkP = msdzk.connect({
  connectionURL: "localhost:2181",
  basePath: "/services/endpoints/test"
});

let msdzkConnection;
msdzkP.then(conn => {
  msdzkConnection = conn;
  msdzkConnection.on("zk-disconnected", () => {
    // listen for zk-disconnected event, and do the clean up.
    console.log("zk-disconnected stopping the process");
    process.exit(1);
  });

  // watch for event's
  msdzkConnection.on("NODE_CHILDREN_CHANGED", e => {
    console.log("Node Children changed on the path");
    console.log(e);
  });
});

const registerServiceParam = {
  name: "service-name",
  port: "4000",
  protocol: "http",
  api: "/api/v1",
  ip: "localhost",
  release: "1.1.0",
  metadata: {
    check: {
      status: "/status",
      health: "health",
      interval: "30s",
      user: "node",
      tags: ["api"]
    }
  }
};

// register service
msdzk.registerService(registerServiceParam).then(_p => {
  console.log("service registered at " + _p);
});

//allows service to register and then check
setTimeout(() => {
  msdzk.getServiceEndpoints("service-name").then(arr => {
    console.log(arr);
    msdzk.getRandomServiceEndPoint(arr, "service-name").then(endpoint => {
      console.log(endpoint);
    });
  });
}, 2000);

More Examples in examples folder.

Api.

1. connect(connectionOptions) ⇒ Promise

connect Initiate the connection to the provided server list (ensemble). Examples:

connect({
  connectionURL: "localhost:2181",
  basePath: "/services/endpoints/test"
});

Kind: global function
Returns: Promise - that resolves to an event emitter instance Event.

Param Type Description
connectionOptions object
connectionOptions.connectionURL string server list (ensemble) as string, Comma separated host:port pairs.
connectionOptions.basePath string the base path in the ZooKeeper tree for services of the system or platform.

All the services will get connected to the basePath and store their endpoints as ephemeral nodes, at the service-name node because ephemeral nodes are only active as long as the session that created it is active. So if the services goes down the ephemeral node that it created also comes to an end.

It's advisable to create the basePath as persistent znodes as Persistent znodes are useful for storing data that needs to be highly available and accessible and have a lifetime in the ZooKeeper's namespace until they're explicitly deleted.

2. registerService(serviceOptions) ⇒ Promise

registerService register the service to the zookeeper node using the passed options. Examples:

registerService({
  name: "service-name",
  port: "4000",
  protocol: "http",
  api: "/api/v1",
  ip: "localhost",
  release: "1.1.0",
  metadata: {
    check: {
      status: "/status",
      health: "health",
      interval: "30s",
      user: "node",
      tags: ["api"]
    }
  }
});

Kind: global function
Returns: Promise - - That resolves to complete service path if the service gets registered or reject with error.

Param Type Description
serviceOptions object
serviceOptions.name string name of the service to register as ephemeral znode at basePath+name.
serviceOptions.port string port number configuration of the microservice to save.
serviceOptions.protocol string communication protocol [https
serviceOptions.api string base service api.
serviceOptions.ip string ip address of the running service.
serviceOptions.metadata object other metadata of the services line - healthcheck, tags, etc.

3. getServiceEndpoints(serviceName) ⇒ Promise

getServiceEndpoints returns all endpoint from the list of registered endpoints, given a service-name.

Kind: global function
Returns: Promise - - that resloves to list of all endpoints

Param Type Description
serviceName string service name

4. getRandomServiceEndPoint(endPointsList, serviceName) ⇒ Promise

getRandomServiceEndPoint returns a random endpoint from the list of registered endpoints.

Kind: global function
Returns: Promise - - That resolves to a randomnly selected endpoint.

Param Type Description
endPointsList array list of endpoints.
serviceName string service name.

5. getService(endPoint) ⇒ Promise

getService return a object containing endpoint and metadata from the registered endpoint.

Kind: global function
Returns: Promise - - That resolves to a selected endpoint and metadata.

Param Type Description
endPoint string Full Path of the endPoint

6. getAllChildren() ⇒ Promise

getAllChildren returns all service registered at the basePath.

Kind: global function
Returns: Promise - - that resloves to list of all services.

7. getServiceConfigData(serviceConfigPath) ⇒ Promise

getServiceConfigData returns the configuration data for the particular service.

Kind: global function
Returns: Promise - - that resolves with the config data

Param Type Default Description
serviceConfigPath string null config store path of service

8. setServiceConfigData(serviceConfigPath) ⇒ Promise

setServiceConfigData sets the configuration data on the particular path.

Kind: global function
Returns: Promise - - that resolves with stat of the node.

Param Type Default Description
serviceConfigPath string null config store path of service

Event

The watcher function triggers the follwoing event on the instance of event emitter resolved with connect function.

Properties

  • NODE_DELETED - watched node is deleted.
  • NODE_DATA_CHANGED - Data of watched node is changed.
  • NODE_CHILDREN_CHANGED - Children of watched node is changed.

License

MIT <3

msdr-zk-nodejs's People

Contributors

ankur-anand avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.