基于Consul的微服务注册与发现实现

Consul在微服务架构中的应用
1. 启动Consul服务端
下载并运行Consul,使用开发模式快速启动:
consul agent -dev
访问 http://localhost:8500 即可查看Consul管理界面。
2. 在项目中引入Consul客户端依赖
通过NuGet添加Consul客户端包:
<PackageReference Include="Consul" Version="1.6.10.9" />
3. 实现服务注册逻辑
创建扩展方法,在应用启动时自动注册服务:
using Consul;
namespace ApiService.Extensions;
public static class ServiceRegistrationExtension
{
public static void RegisterWithConsul(this IConfiguration config)
{
var serviceIp = config["Service:Host"] ?? "127.0.0.1";
var servicePort = int.Parse(config["Service:Port"] ?? "5000");
var client = new ConsulClient(c =>
{
c.Address = new Uri("http://localhost:8500");
c.Datacenter = "dc1";
});
var registration = new AgentServiceRegistration
{
ID = $"svc-{Guid.NewGuid()}",
Name = "user-service",
Address = serviceIp,
Port = servicePort,
Check = new AgentServiceCheck
{
Interval = TimeSpan.FromSeconds(10),
HTTP = $"http://{serviceIp}:{servicePort}/health",
Timeout = TimeSpan.FromSeconds(5),
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(20)
}
};
client.Agent.ServiceRegister(registration).Wait();
}
}
在 Program.cs 中调用注册逻辑:
app.MapControllers();
// 注册服务到Consul
ServiceRegistrationExtension.RegisterWithConsul(builder.Configuration);
app.Run();
4. 验证服务注册状态
打开Consul Web UI,确认服务已成功注册,显示 user-service 的健康状态。
5. 客户端实现服务发现
在调用方应用中,通过Consul查询可用的服务实例,并选择一个进行调用:
var consulClient = new ConsulClient(c =>
{
c.Address = new Uri("http://localhost:8500");
c.Datacenter = "dc1";
});
var response = await consulClient.Agent.Services().Result;
var serviceInstances = response
.Where(s => s.Value.Service.Equals("user-service", StringComparison.OrdinalIgnoreCase))
.ToArray();
if (serviceInstances.Any())
{
// 随机选取一个实例
var selected = serviceInstances.OrderBy(_ => Guid.NewGuid()).First().Value;
var apiUrl = $"http://{selected.Address}:{selected.Port}/api/user/list";
using var httpClient = new HttpClient();
var result = await httpClient.GetStringAsync(apiUrl);
Console.WriteLine($"请求地址: {apiUrl} | 响应内容: {result}");
}
6. 使用Docker部署Consul集群(单节点测试)
拉取官方镜像并运行:
docker pull consul
docker run -d \
--name=consul-server \
-p 8500:8500 \
-p 8600:8600/udp \
consul agent \
-server \
-ui \
-node=server-1 \
-bootstrap-expect=1 \
-client=0.0.0.0
该命令启动一个本地单节点Consul服务,支持UI访问和API交互。