Git Product home page Git Product logo

resilient-consul's Introduction

resilient-consul Build Status Resilient js-standard-style

resilient.js HTTP client middleware for Consul.

Via this middleware you can use Consul as compatible discovery server in Resilient HTTP clients. Works with Consul HTTP API v1 and resilient.js +0.3

Nameconsul
Typediscovery
Resilient+0.3
Environmentsnode.js / browsers

Installation

Node.js

npm install resilient-consul --save

Browser

Via Bower:

bower install resilient-consul --save

Via Component:

component install h2non/resilient-consul

Or loading the script directly:

<script src="//cdn.rawgit.com/h2non/resilient-consul/0.1.6/consul.js"></script>

Usage

var Resilient = require('resilient')
var consul = require('resilient-consul')

var client = Resilient()

client.use(consul({
  // App service name (required)
  service: 'web',
  // Service name for self discovery (optional)
  discoveryService: 'consul',
  // Use a custom datacenter (optional)
  datacenter: 'ams2',
  // Use a custom service tag (optional)
  tag: '1.0',
  // Consul servers pool
  servers: [
    'http://demo.consul.io',
    'http://demo.consul.io'
  ],
  // Use Consul's health check endpoint instead of the catalog
  // to retrieve only services with passing health checks (optional)
  onlyHealthy: false,
  // Use a custom mapping function (optional)
  mapServers: function (list) {
    // here you can filter/map the services retrieved from Consul
    // to a list of addresses according to custom logic (optional)
    return list.map(function (svc) { return svc.ServiceAddress + '/v1' })
  }
}))

// Test request
client.get('/', function (err, res) {
  console.log('Error:', err)
  console.log('Response:', res)
})

Browser usage

If you're running Resilient in the browser, you must enable CORS headers in Consul. To do that you can define additional response HTTP headers in the Consul config file:

"http_api_response_headers": {
  "Access-Control-Allow-Origin": "*"
}

Options

  • service string - Consul service. Required
  • servers array<string> - List of Consul servers URLs. Required
  • discoveryService string - Consul discovery service for self discovery (e.g: consul)
  • datacenter string - Custom datacenter to use. If not defined the default one will be used
  • tag string - Use a specific tag for the service
  • onlyHealthy boolean - Use Consul's health check endpoint instead of the catalog to retrieve only services with passing health checks. Default to false
  • protocol string - Transport URI protocol. Default to http
  • mapServers function - Custom function for creating the list of service addresses based on the Consul response

Additionally you can pass any of the supported Resilient discovery options via this middleware

License

MIT - Tomas Aparicio

resilient-consul's People

Contributors

ahelmberger avatar h2non avatar ismriv avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

resilient-consul's Issues

Cannot resolve servers. Missing data

@h2non, I'm still struggling to get this to work. I've added a service named my-service.

curl -X PUT -d '{"Datacenter": "vagrant-cloud", "Node": "my-node.example.com", "Address": "127.0.0.1", "Servi {"Service": "my-service", "Address": "127.0.0.1", "Port": 49000}}' http://127.0.0.1:8500/v1/catalog/register

When requesting it via CURL from Consul, I get:

[
  {
    "Node": "my-node.example.com",
    "Address": "127.0.0.1",
    "ServiceID": "my-service",
    "ServiceName": "my-service",
    "ServiceTags": [

    ],
    "ServiceAddress": "127.0.0.1",
    "ServicePort": 49000,
    "ServiceEnableTagOverride": false,
    "CreateIndex": 216,
    "ModifyIndex": 216
  }
]

However, when I run the following:

var resilient = require('resilient');
var consul = require('resilient-consul');
var client = resilient();

client.use(consul({
  service: 'my-service',
  discoveryService: 'consul',
  datacenter: 'vagrant-cloud',
  enableSelfRefresh: true,
  servers: [
    'http://127.0.0.1:8500'
  ],
  onlyHealthy: false
}));

client.get('/', function (err, res) {
  console.log('Error:', err);
  console.log('Response:', res);
});

I get the error Cannot resolve servers. Missing data. I've debugged it for a while, and I see that when calling hasValidServiceServers, the function resilient.servers() is returning { servers: [], updated: 1453764937643 }. However, I can see handleResolution being called for URL http://172.0.0.1:8500/v1/catalog/service/my-service?_time=1453765689463&dc=vagrant-cloud returning the service I added.

I've also tried adding a service to demo.consul.io, but I'm not allowed. Running the example (against demo.consul.io) from the README file throws Discovery server response is invalid or empty.

Any ideas?

mapServersFromHealthEndpoint receives array of URLs, instead of complete response

My application crashes from time to time due to mapServersFromHealthEndpoint receiving a list of URLs for the service such as ['http://my-host-one:3000', 'http://my-host-two:3000'], whereas it should receive an array of service definition objects such as:

{
  "Node": {
    "Node": "my-host-one",
    "Address": "xx.xx.xx.xx",
    "CreateIndex": 65,
    "ModifyIndex": 120501
  },
  "Service": {
    "ID": "my-host-one:my-service:3000",
    "Service": "my-service",
    "Tags": null,
    "Address": "ip-172-31-24-131",
    "Port": 3000,
    "EnableTagOverride": false,
    "CreateIndex": 27226,
    "ModifyIndex": 27228
  },
  "Checks": []
}

The error is that s.Service in https://github.com/h2non/resilient-consul/blob/master/consul.js#L86 is obviously undefined. mapServersFromCatalogEndpoint is filtering these, which I didn't understand the first time I saw it, but I believe we shouldn't need to filter anything in these functions, but address the root cause.

The issue may be in resilient.js to be honest, but I don't have enough knowledge of it yet to have a clearer idea. Any suggestions?

Incorrect url retured, when catalog services are queried.

Hi,
I am running consul in my local environment (http port : 8500).
When the middleware is querying the consul catalog service , following calls are made

  1. Consul catalog service (http://localhost:8500/v1/catalog/service/consul)
  2. Catalog service for the registered micro service. (http://172.31.50.81:8300/v1/catalog/service/account-service).
    Please take a note, in the second call port is changed to 8300 grpc server port.
    It should have been 8500.

Please suggest.

Cannot update discovery servers. Empty or invalid response body

Hello, I'm trying to use https://github.com/resilient-http/resilient.js with Consul using this middleware, but I'm getting the error depicted in the title when following the example shown in the README file.

I've basically registered a service in Consul using CURL:
curl -X PUT -d '{"Node": "my-node", "Address": "127.0.0.1", "Service": {"Service": "my-service", "Port": 49000}}' http://127.0.0.1:8500/v1/catalog/register

The above is an HTTP server that will respond with 200 Ok when requesting /. Below is the code I'm using with resilient.js:

var resilient = require('resilient');
var consul = require('resilient-consul');
var client = resilient();

client.use(consul({
  service: 'my-service',
  // discoveryService: '..', // I've tried consul, my-node, my-service - made no difference
  enableSelfRefresh: true,
  servers: [
    '127.0.0.1:8500'
  ],
  onlyHealthy: false
}));

client.get('/', function (err, res) {
  console.log('Error:', err);
  console.log('Response:', res);
});

And here's the output I get:

Error: { [Error: Cannot update discovery servers. Empty or invalid response body]
  error: 
   { [Error: Missing discovery servers. Cannot resolve the server]
     status: 1002,
     message: 'Missing discovery servers. Cannot resolve the server' },
  status: 1001,
  message: 'Cannot update discovery servers. Empty or invalid response body' }
Response: undefined

What am I doing wrong? Thanks in advance!

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.