Nanophone icon indicating copy to clipboard operation
Nanophone copied to clipboard

Nanophone is a minimalistic library for Service Registration and Discovery and is the driving force behind the Equalizer middleware for aspnetcore.

Icon

Nanophone

Build status license NuGet Coverage Status codecov Join the chat at https://gitter.im/lvermeulen/Nanophone Nanophone is a minimalistic library for Service Registration and Discovery and is used by the Equalizer middleware for aspnetcore.

Features:

  • Find available service instances by service name
  • Find available service instances by service name and version (strict semver 2.0)
  • Extensible service registry host - includes Consul and in-memory hosts
  • Extensible service registry tenants - includes Nancy and Web Api tenants
  • Supports eBay Fabio
  • Configuration provider for aspnetcore to use Consul key/value store
  • Application services for aspnetcore to add tenants and health checks

Usage:

  • Find available service instances by service name:
using System.Threading.Tasks;
using Nanophone.Core;
using Nanophone.RegistryHost.ConsulRegistry;

var serviceRegistry = new ServiceRegistry();
serviceRegistry.StartClient(new ConsulRegistryHost());

var instances = serviceRegistry.FindServiceInstancesAsync("my-service-name").Result;
foreach (var instance in instances)
{
    Console.WriteLine($"Address: {instance.Address}:{instance.Port}, Version: {instance.Version}");
}
  • Find available service instances by service name and version (strict semver 2.0):
using System.Threading.Tasks;
using Nanophone.Core;
using Nanophone.RegistryHost.ConsulRegistry;

var serviceRegistry = new ServiceRegistry();
serviceRegistry.StartClient(new ConsulRegistryHost());

var instances = serviceRegistry.FindServiceInstancesWithVersionAsync("my-service-name", ">=1.2.0 <3.2.0").Result;
foreach (var instance in instances)
{
    Console.WriteLine($"Address: {instance.Address}:{instance.Port}, Version: {instance.Version}");
}

NOTE: A full semver-compliant version is required. This means that e.g. "2.1" is not a valid version, and "2.1.0" or "2.1.1-beta2" are valid versions.

  • Start Nancy service:
using Nanophone.Core;
using Nanophone.RegistryHost.ConsulRegistry;
using Nanophone.RegistryTenant.Nancy;

var serviceRegistry = new ServiceRegistry();
serviceRegistry.AddTenant(new NancyRegistryTenant(new Uri("http://localhost:9001")), new ConsulRegistryHost(),
    "customers", "1.3.3");
  • Start Web Api service:
using Microsoft.Owin.Hosting;
using Nanophone.Core;
using Nanophone.RegistryHost.ConsulRegistry;
using Nanophone.RegistryTenant.WebApi;

string url = "http://localhost:9000/";

var serviceRegistry = new ServiceRegistry();
serviceRegistry.AddTenant(new WebApiRegistryTenant(new Uri(url)), new ConsulRegistryHost(), 
    "date", "1.7.0-pre");

WebApp.Start<Startup>(url);
  • Configuration provider for aspnetcore:
var config = new ConfigurationBuilder()
    .AddNanophoneKeyValues(() => new ConsulRegistryHost())
    .Build();

string value = new WebHostBuilder()
    .UseConfiguration(config)
    .GetSetting("my_key");
  • Application services for aspnetcore:
var hostBuilder = new WebHostBuilder()
    .ConfigureServices(services =>
    {
        services.AddNanophone(() => new ConsulRegistryHost());
    })
    .Configure(app =>
    {
        app.AddTenant(new WebApiRegistryTenant(new Uri("http://localhost:1234")), nameof(MyService), "1.0.0");

        var serviceRegistry = app.ApplicationServices.GetService<ServiceRegistry>();
        var instances = await serviceRegistry.FindServiceInstancesAsync(nameof(MyService));
    });

Thanks