.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"
  }
}

  

上面 代码 需要进行 封装 存在重复造轮子也不利于 其他服务的重复调用 所以要进行封装

 

posted on 2023-11-24 16:38  是水饺不是水饺  阅读(23)  评论(0)    收藏  举报

导航