.net consul 封装 演变(一)
Consul教程 - 梯子教程网 (tizi365.com)
nuget consul
webapi 接口

话不多说上代码
using Consul;
using Microsoft.Extensions.Options;
using System;
using System.Net;
using System.Reflection;
using System.Runtime.Intrinsics;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo
{
Title = "consul测试",
Description = "consul测试",
Version = "v1",
});
string xmlPath = Assembly.GetExecutingAssembly().GetName().Name+".xml";
string pathStr = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, xmlPath);
options.IncludeXmlComments(pathStr, true);
});
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI(options =>
{
options.SwaggerEndpoint("/swagger/v1/swagger.json ","v1");
});
}
app.Map("/health", async next =>
{
next.Response.StatusCode = (int)HttpStatusCode.OK;
app.Logger.LogError($"{next.Request.Host}consul健康检查成功");
await next.Response.WriteAsync("200");
});
//注册
UseCustomConsulAsync();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
async void UseCustomConsulAsync()
{
using ConsulClient client = new ConsulClient(config =>
{
string addr = app.Configuration["consul:address"];
string datacenter = app.Configuration["consul:datacenter"];
config.Address = new Uri(addr);
config.Datacenter = datacenter;
});
var registration = new AgentServiceRegistration
{
ID = Guid.NewGuid().ToString(),
Address = "192.168.0.198",
Name = "consultest",
Tags = new[] { "consultest" },
Port = 7777,
Check = new AgentServiceCheck
{
HTTP = "http://192.168.0.198:7777/health",///健康检查地址
Interval = TimeSpan.FromSeconds(3)
}
};
await client.Agent.ServiceRegister(registration);
}
using Consul;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Net;
namespace ConsulWebAPI.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ConsulController : ControllerBase
{
private readonly IConfiguration configuration;
private readonly ILogger<ConsulController> logger;
public ConsulController(IConfiguration config, ILogger<ConsulController> logger)
{
this.configuration = config;
this.logger = logger;
}
/// <summary>
/// 获取 所有服务
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<ActionResult> GetServicesAll()
{
Consul.ConsulClient consulClient = new Consul.ConsulClient(config =>
{
string addr = configuration["consul:address"];
string datacenter = configuration["consul:datacenter"];
config.Address = new Uri(addr);
config.Datacenter = datacenter;
});
var services = await consulClient.Health.Service("consultest");
ServiceEntry[] serviceEntrys = services.Response;
AgentService[] agentServices = serviceEntrys.Select(item => item.Service).ToArray();
return Ok(agentServices);
}
/// <summary>
/// 注销所有
/// </summary>
/// <returns></returns>
[HttpGet("ServiceDeregister")]
public async Task<ActionResult> ServiceDeregister()
{
Consul.ConsulClient consulClient = new Consul.ConsulClient(config =>
{
string addr = configuration["consul:address"];
string datacenter = configuration["consul:datacenter"];
config.Address = new Uri(addr);
config.Datacenter = datacenter;
});
var services = await consulClient.Health.Service("consultest");
ServiceEntry[] serviceEntrys = services.Response;
foreach (var item in serviceEntrys)
{
string serivceId = item.Service.ID;
consulClient.Agent.ServiceDeregister(serivceId);
this.logger.LogError($"consul注销了服务{serivceId}");
}
return Ok();
}
/// <summary>
/// 节点 刷新
/// </summary>
/// <returns></returns>
[HttpGet("Reload")]
public async Task<ActionResult> Reload()
{
Consul.ConsulClient consulClient = new Consul.ConsulClient(config =>
{
string addr = configuration["consul:address"];
string datacenter = configuration["consul:datacenter"];
config.Address = new Uri(addr);
config.Datacenter = datacenter;
});
//获取节点名称
string nodeName = consulClient.Agent.NodeName;
//刷新节点
await consulClient.Agent.Reload(nodeName);
return Ok();
}
/// <summary>
/// 通过id服务注销
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("ServiceDeregister/{id}")]
public async Task<ActionResult> ServiceDeregister([FromRoute] string id)
{
Consul.ConsulClient consulClient = new Consul.ConsulClient(config =>
{
string addr = configuration["consul:address"];
string datacenter = configuration["consul:datacenter"];
config.Address = new Uri(addr);
config.Datacenter = datacenter;
});
//注销节点
WriteResult writeResult = await consulClient.Agent.ServiceDeregister(id);
return Ok(writeResult.StatusCode);
}
/// <summary>
/// 服务注册
/// </summary>
/// <param name="agentServiceRegistration"></param>
/// <returns></returns>
[HttpPost("ServiceRegister")]
public async Task<ActionResult> ServiceRegister([FromBody] ConsulSevice consulSevice)
{
using ConsulClient client = new ConsulClient(config =>
{
string addr = configuration["consul:address"];
string datacenter = configuration["consul:datacenter"];
config.Address = new Uri(addr);
config.Datacenter = datacenter;
});
var registration = new AgentServiceRegistration
{
ID = consulSevice.Id,
Address = consulSevice.Address,// "192.168.0.198",
Name = consulSevice.Name, //"consultest",
Tags = consulSevice.Tags, //new[] { "consultest" },
Port = consulSevice.Port,// 7777,
Check = new AgentServiceCheck
{
HTTP = consulSevice.HealthCheck.HTTP,// "http://192.168.0.198:7777/health",///健康检查地址
Interval = TimeSpan.FromSeconds(consulSevice.HealthCheck.Interval)// TimeSpan.FromSeconds(3)
}
};
WriteResult writeResult = await client.Agent.ServiceRegister(registration);
return Ok(writeResult.StatusCode);
}
}
}
appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"consul": {
"address": "http://192.168.0.168:8500",
"datacenter": "dc1"
}
}
上面 代码 需要进行 封装 存在重复造轮子也不利于 其他服务的重复调用 所以要进行封装
浙公网安备 33010602011771号