.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的集群服务的注册和心跳健康检查。


浙公网安备 33010602011771号