Nanophone.RegistryHost.InMemoryRegistry

Nanophone in-memory registry host


Keywords
Service, Discovery, ServiceDiscovery, Consul, Nancy, WebApi, Healing, Autohealing, Microservices
License
MIT
Install
Install-Package Nanophone.RegistryHost.InMemoryRegistry -Version 1.6.0-alpha

Documentation

Icon

Nanophone Build status license NuGet Coverage Status 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