NanoFabric와 Consul을 활용한 마이크로서비스 서비스 注册 및 발견 구현

NanoFabric과 Consul 연동으로実現する 마이크로서비스 아키텍처

NanoFabric 프레임워크 개요

NanoFabric은 .NET Core 기반의 마이크로서비스 개발 프레임워크로, Consul, Polly, Ocelot 등 다양한 오픈소스를 통합하여 제공합니다. 이 프레임워크는 서비스 등록 및 발견, 로드 밸런싱, 서킷 브레이커, API 게이트웨이 등의 핵심 기능을 포함하고 있어 개발자가 비즈니스 로직에 집중할 수 있도록 도와줍니다.

Consul의 핵심 역할

Consul은 HashiCorp에서 개발한 서비스 메시 솔루션으로, 마이크로서비스 환경에서 필수적인 기능을 제공합니다. NanoFabric에서 Consul은 다음과 같은 역할을 담당합니다:

  • 서비스 등록: 마이크로서비스가 시작될 때 자동으로 자신의 정보를 Consul에 등록
  • 서비스 발견: 클라이언트가 Consul을 통해 사용 가능한 서비스 인스턴스를 查询
  • 상태 검사: 정기적으로 서비스 상태를 확인하고 비정상 인스턴스를 자동 제거
  • 로드 밸런싱: 다양한 로드 밸런싱 전략을 제공하여 최적의 서비스 호출 지원

구현 단계

1. 프로젝트 설정

NanoFabric 레포지토리를 클론합니다:

git clone https://github.com/NanoFabric

2. Consul 연결 구성

ConsulRegistryHostConfiguration 클래스를 사용하여 연결 정보를 설정합니다:

var consulConfig = new ConsulRegistryHostConfiguration
{
    HttpEndpoint = "http://localhost:8500",
    DnsEndpoint = new DnsEndpoint
    {
        Address = "127.0.0.1",
        Port = 8600
    }
};

3. 서비스 등록 구현

ConsulRegistryHost 클래스를 활용하여 서비스 등록 로직을 구현합니다:

public async Task<ServiceRegistryInfo> RegisterAsync(
    string serviceName,
    string version,
    Uri serviceUri,
    Uri healthCheckUri = null,
    IEnumerable<string> customTags = null)
{
    var uniqueServiceId = GenerateServiceId(serviceName, serviceUri);
    string healthEndpoint = healthCheckUri?.ToString() 
        ?? $"{serviceUri}".TrimEnd('/') + "/health";
    
    var versionTag = $"v-{version}";
    var tagCollection = (customTags ?? Array.Empty<string>()).ToList();
    tagCollection.Add(versionTag);
    
    var serviceRegistration = new AgentServiceRegistration
    {
        ID = uniqueServiceId,
        Name = serviceName,
        Tags = tagCollection.ToArray(),
        Address = serviceUri.Host,
        Port = serviceUri.Port,
        Check = new AgentServiceCheck 
        { 
            HTTP = healthEndpoint, 
            Interval = TimeSpan.FromSeconds(3) 
        }
    };
    
    await _consulClient.Agent.ServiceRegister(serviceRegistration);
    
    return new ServiceRegistryInfo
    {
        ServiceId = uniqueServiceId,
        ServiceName = serviceName
    };
}

4. 서비스 인스턴스 발견

서비스 발견 기능을 통해 사용 가능한 인스턴스 목록을 조회합니다:

public async Task<IList<ServiceRegistryInfo>> DiscoverInstances(string serviceName)
{
    var healthQuery = await _consulClient.Health.Service(
        serviceName, 
        tag: string.Empty, 
        passingOnly: true);
    
    var availableInstances = healthQuery.Response.Select(entry => new ServiceRegistryInfo
    {
        Name = entry.Service.Service,
        Address = entry.Service.Address,
        Port = entry.Service.Port,
        Version = ExtractVersion(entry.Service.Tags),
        Tags = entry.Service.Tags ?? Enumerable.Empty<string>(),
        Id = entry.Service.ID
    }).ToList();
    
    return availableInstances;
}

5. ASP.NET Core 통합

Startup.cs에서 NanoFabric Consul 확장을 사용하여 통합합니다:

// Consul 서비스 발견 기능 등록
services.AddNanoFabricConsul(consulRegistryConfiguration);

// 서비스 등록 미들웨어 활성화
app.UseConsulRegisterService(serviceDiscoveryOption);

상태 검사 기능

NanoFabric은 각 서비스에 대한 상태 검사를 자동으로 구성하여 문제가 있는 인스턴스로의 요청을 방지합니다:

public async Task<string> RegisterHealthCheck(
    string serviceName,
    string serviceId,
    Uri checkUri,
    TimeSpan? checkInterval = null,
    string description = null)
{
    var checkIdentifier = CreateCheckId(serviceId, checkUri);
    var checkConfig = new AgentCheckRegistration
    {
        ID = checkIdentifier,
        Name = serviceName,
        Notes = description,
        ServiceID = serviceId,
        HTTP = checkUri.ToString(),
        Interval = checkInterval ?? TimeSpan.FromSeconds(10)
    };
    
    await _consulClient.Agent.CheckRegister(checkConfig);
    return checkIdentifier;
}

주요 구현 파일

  • 구현 소스: src/NanoFabric.RegistryHost.ConsulRegistry/
  • 단위 테스트: test/NanoFabric.RegistryHost.ConsulRegistry.Test/
  • 구성 클래스: src/NanoFabric.RegistryHost.ConsulRegistry/ServiceDiscoveryOption.cs

태그: Consul microservices .NET-Core service-discovery service-registration

7월 16일 04:59에 게시됨