.NET6使用Consul在window下最简单的服务注册和心跳检查

NET6  WebApi使用Consul在window下最简单的服务注册和心跳检查

1、在windows系统安装consul,并且配置环境变量(可参考其他文章)

2、使用命令行启动consul服务器

3、查看consul服务器是否启动,在浏览器输入:http://localhost:8500/,出现以下页面,证明consul服务器正常启动

 

4、使用vs2022新建一个解决方案,包含一个webapi项目consul2和一个类库项目ConsulHelper。将webapi项目默认的controller和天气预报cs文件删除,新建一个ConsulController.cs用于写一个简单的测试接口。项目的结构如下:

5、项目引用关系和引用的包

5.1 webapi项目要引用类库项目

5.2  类库项目ConsulHelper需要引用三个nuget包:

Install-Package Consul -Version 1.6.10.7
Install-Package Microsoft.AspNetCore.Http.Abstractions -Version 2.2.0
Install-Package Microsoft.Extensions.Hosting.Abstractions -Version 7.0.0

在程序包管理器控制台选中ConsulHelper项目分别执行以上三条命令,安装以上三个包。

6、Consul注册服务类代码:(可以从网上查找类似代码,只要是从appsettings.json读取consul配置都可以用)

using Consul;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Hosting;

namespace ConsulHelper
{
   
        public static class AppBuilderExtensions
        {
            public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app, IHostApplicationLifetime lifetime, ServiceEntity serviceEntity)
            {
                var consulClient = new ConsulClient(x => x.Address = new Uri($"http://{serviceEntity.ConsulIP}:{serviceEntity.ConsulPort}"));//请求注册的 Consul 地址
                var httpCheck = new AgentServiceCheck()
                {
                    DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后注册
                    Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔
                    // Comment by lrg 每隔10秒创建了一个http请求去检查心跳,此种方式是监测整个consul2服务的,
                    HTTP = $"http://{serviceEntity.IP}:{serviceEntity.Port}/HealthCheck",//健康检查地址
                    Timeout = TimeSpan.FromSeconds(5)
                };

                // Register service with consul
                var registration = new AgentServiceRegistration()
                {
                    Checks = new[] { httpCheck },
                    ID = Guid.NewGuid().ToString(),
                    Name = serviceEntity.ServiceName,
                    Address = serviceEntity.IP,
                    Port = serviceEntity.Port,
                    Tags = new[] { $"urlprefix-/{serviceEntity.ServiceName}" }//添加 urlprefix-/servicename 格式的 tag 标签,以便 Fabio 识别
                };

                consulClient.Agent.ServiceRegister(registration).Wait();//服务启动时注册,内部实现其实就是使用 Consul API 进行注册(HttpClient发起)
                lifetime.ApplicationStopping.Register(() =>
                {
                    consulClient.Agent.ServiceDeregister(registration.ID).Wait();//服务停止时取消注册
                });

                app.Map("/HealthCheck", s =>
                {
                    s.Run(async context =>
                    {
                        await context.Response.WriteAsync("ok");
                    });
                });

                return app;
            }
            public class ServiceEntity
            {
                public string IP { get; set; }
                public int Port { get; set; }
                public string ServiceName { get; set; }
                public string ConsulIP { get; set; }
                public int ConsulPort { get; set; }
            }
        }

    
}

7、Webapi的Program中引入 AppBuilderExtensions扩展类,webapi服务启动后会自动去consul服务器注册服务,Program代码:

using ConsulHelper;
using static ConsulHelper.AppBuilderExtensions;


var builder = WebApplication.CreateBuilder(args);

#region 引入配置文件
var basePath = AppContext.BaseDirectory; 
var _config = new ConfigurationBuilder()
         .SetBasePath(basePath)
         .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
         .Build();
#endregion

// 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();


var app = builder.Build();  

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

#region Consul注册服务  
var serviceEntity = new ServiceEntity
{
    IP = _config["Service:IP"],
    Port = Convert.ToInt32(_config["Service:Port"]),
    ServiceName = _config["Service:Name"],
    ConsulIP = _config["Consul:IP"],
    ConsulPort = Convert.ToInt32(_config["Consul:Port"])
};
app.RegisterConsul(app.Lifetime, serviceEntity);
#endregion


app.Run();  

8、webapi的launchSettings.json文件主要配置  "applicationUrl": "http://localhost:7004;",此处端口和ip要和appsettings.json中一致

{
  "$schema": "https://json.schemastore.org/launchsettings.json",
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:32152",
      "sslPort": 44347
    }
  },
  "profiles": {
    "consul2": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "launchUrl": "swagger",
      "applicationUrl": "http://localhost:7004;",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "swagger",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

9、webapi的appsettings.json主要配置:Service和Consul节点

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  //除了修改Service的port还得修改launchSettings中的端口号
  "Service": {
    "IP": "localhost",
    "Port": "7004",
    "Name": "NET6Service"
  },
  // 配置consul服务器的ip和地址
  "Consul": {
    "IP": "localhost",
    "Port": "8500"
  }
}

10、webapi的控制器ConsulController代码很简单,就是一个简单的测试接口,返回服务的端口信息,没有这个控制器也行,那就只能靠consul的心跳检查来确定服务是否正常。

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace consul2.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ConsulController : ControllerBase
    {
        private readonly IConfiguration Configuration;

        public ConsulController(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        [HttpGet]
        [Route("TestConsul")]
        public string TestConsul()
        {
            string result = $"您当前正在访问{Configuration["Service:Port"].ToString()}端口服务!";
            return result;
        }


        
    }
}

11、新建一个文件夹,里面新建4个文件夹存放打包后的多个服务实例

12、准备发布和注册第一个7001服务,打开解决方案,依次修改launchSettings.json和appsettings.json文件中的端口为7001

13、修改完端口后,重新生成解决方案,打包项目文件

14、拷贝打包文件到指定文件夹

14.1进入项目的文件夹

14.2 拷贝生成文件包

14.3 拷贝生成文件包到7001

15、命令行启动7001服务:

进入7001目录,地址栏输入cmd后回车,在打开的控制台输入:dotnet consul2.dll --urls=http://*:7001命令,稍等片刻7001服务就会启动

 

16、打开consul管理页面,可以发现7001服务已经注册,鼠标点击服务。

17、进入查看服务详情

18、测试一下,我们写的控制器接口是否可用:浏览器输入地址:http://localhost:7001/api/Consul/TestConsul

19、按照上面的步骤依次开启7002-7004服务,然后打开consul管理页面

20、查看7004服务详细情况,接着准备停掉7004服务

21、停掉7004服务

22、停掉7004服务后查看consul管理页面,由于7004服务心跳监测失败,consul会将7004服务移除,所以没有了7004服务

23、测试7004服务的控制器测试接口是否可用,7004控制器接口同样不可使用,说明跟consul的监测结果一致。

24、通过以上步骤,就实现了在window系统下最简单的webapi的集群服务的注册和心跳健康检查。

 

 

 

 


 

posted @ 2022-11-11 23:46  无声袖箭  阅读(432)  评论(0)    收藏  举报