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.
WebApi bootstrapper
PM> Install-Package Microphone.AspNet
NancyFx bootstrapper
PM> Install-Package Microphone.Nancy
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";
}
}
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";
}
}
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");
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);
Before you start your services, make sure you have an active cluster running on the host machine.
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.
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
If you are using the ETCD cluster provider, make sure you have a local ETCD cluster running on your dev machine.
etcd.exe
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();
}
}