No description, website, or topics provided.
Switch branches/tags
Nothing to show
Clone or download
Latest commit ac0bfa6 Apr 17, 2017
Permalink
Failed to load latest commit information.
.nuget add nugetify scripts #4 Apr 4, 2016
.vscode fsharp Jul 11, 2016
Resources Icon Oct 18, 2015
src Automatically deregister a critical service after x minutes (Default … Apr 5, 2017
.gitattributes dotnetcore Mar 29, 2016
.gitignore Initial commit Oct 16, 2015
LICENSE Initial commit Oct 16, 2015
README.md Fix spelling mistake Apr 17, 2017
RELEASE_NOTES.md add nugetify scripts #4 Apr 4, 2016
build.fsx . Jul 12, 2016
global.json works Jul 8, 2016

README.md

Microphone - Self announcing services

Microphone is a lightweight framework to run self hosting REST services using Web Api or NancyFx ontop of a Consul or ETCD cluster. Each service will start out by allocating a free port to run on, once the service is started, it will register itself in the local cluster provider.

Install from Nuget

WebApi bootstrapper

PM> Install-Package Microphone.AspNet

NancyFx bootstrapper

PM> Install-Package Microphone.Nancy

Create a service

Web Api

    class Program
    {
        static void Main(string[] args)
        {
            var options = new ConsulOptions();
            var loggerFactory = new LoggerFactory();
            var logger = loggerFactory.CreateLogger("logger");
            var provider = new ConsulProvider(loggerFactory, Options.Create(options));
            Cluster.RegisterService(new Uri($"http://localhost"), provider, "orders", "v1", logger);
            Console.ReadLine();
        }
    }

    public class OrdersController : ApiController
    {
        public string Get()
        {
            return "WebApi Service";
        }
    }

NancyFx

    class Program
    {
        private static void Main(string[] args)
        {
            Cluster.Bootstrap(new NancyProvider(), new ConsulProvider(), "customers", "v1");
            Console.ReadLine();
        }
    }

    public class CustomersService : NancyModule
    {
        public MyService()
        {
            Get["/"] = _ => "Nancy Service";
        }
    }

Cluster providers

Consul

Cluster.Bootstrap(new WebApiProvider(), new ConsulProvider(), "my-service", "v1");

The Consul provider also works together with Ebays "Fabio" load balancer https://github.com/eBay/fabio

Cluster.Bootstrap(new WebApiProvider(), new ConsulProvider(useEbayFabio:true), "my-service", "v1");

ETCD

Cluster.Bootstrap(new WebApiProvider(), new EtcdProvider(), "my-service", "v1");

Service Discovery

If one of your services needs to communicate with another service in the same Consul cluster you can query it for active instances.

//inside some WebApi/Nancy endpoint:

//automatically load balanced over service instances
var instance = await Cluster.FindServiceInstanceAsync("orders"); 

//Use Rest# or similar to call into the remote service
MakeSomeCall("/api/orders",instance.ServiceAddress, instance.ServicePort);

Running your services

Before you start your services, make sure you have an active cluster running on the host machine.

Consul Cluster

If you are new to Consul, you can bootstrap your test environment using this command:

consul agent -server -bootstrap -data-dir /tmp/consul -bind=127.0.0.1

This will give you a single server Consul cluster, this is not recommended for production usage, but it will allow you to use service discovery on your dev machine.

Diagnostics using Consul REST API

Check service health on Consul agent:

GET

http://localhost:8500/v1/agent/checks

Check all services registered on Consul agent:

GET

http://localhost:8500/v1/agent/services

ETCD Cluster

If you are using the ETCD cluster provider, make sure you have a local ETCD cluster running on your dev machine.

etcd.exe

Key/Value storage

    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

    class Program
    {
        private static void Main(string[] args)
        {
            Cluster.Bootstrap(new WebApiProvider(), new ConsulProvider(), "orders", "v1");
            Cluster.KVPutAsync("val1", new Person { Name = "Name", Age = 25 }).Wait();
            var res = Cluster.KVGetAsync<Person>("val1").Result;
            Console.ReadLine();
        }
    }