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