雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

.NET Core Consul服务注册

2024-09-08 11

首先安装Consul,可以到Consul官网下载安装,这里以Windows环境安装为例。

Consul官网地址:https://www.consul.io/

下载压缩包解压后只有一个exe文件,我们用命令行在目录下执行命令启动开发环境

consul agent -dev(如果需要其他机器访问,命令为consul agent -dev -client 0.0.0.0 -ui)

如上所示就启动了,可以看到Client Addr是127.0.0.1:8500,可以从浏览器直接打开这个监控页面地址了。

刚开始只有一个consul服务。

下面我们我们开始在.NET Core项目中注册服务。

一般大型项目会有很多微服务,每个微服务都需要用到注册,所以我们单独创建一个类库,写一个通用的注册服务的扩展方法。

需要安装Consul等包,可以通过Nuget安装,依赖包如图所示

创建一个名为ConsulServiceRegistration的类库,里面包含两个类,代码如下:

ConsulRegistrationExtenSions.cs类代码

using Microsoft.Extensions.DependencyInjection;
using System;
using System.Linq;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting.Server.Features;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.Options;
using Microsoft.Extensions.Hosting;
using Consul;
namespace ConsulServiceRegistration
{
    // Consul服务注册
    public static class ConsulRegistrationExtensions
    {
        public static void AddConsul(this IServiceCollection service) {
            //读取配置文件
            var config = new ConfigurationBuilder().AddJsonFile("service.config.json").Build();
            service.Configure<ConsulServiceOptions>(config);
        }
        public static IApplicationBuilder UseConsul(this IApplicationBuilder app) {
            // 获取主机生命周期管理接口
            var lifetime = app.ApplicationServices.GetRequiredService<IHostApplicationLifetime>();
            // 获取服务配置项
            var serviceOptions = app.ApplicationServices.GetRequiredService<IOptions<ConsulServiceOptions>>().Value;
            // 服务Id,唯一
            serviceOptions.ServiceId = Guid.NewGuid().ToString();
            var consulClient = new Consul.ConsulClient(configuration =>
            {
                // 服务注册的地址,集群中任意一个地址
                configuration.Address = new Uri(serviceOptions.ConsulAddress);
            });
            // 获取当前服务地址和端口,这里自动获取,也可以配置
            var features = app.Properties["server.Features"] as FeatureCollection;
            var address = features.Get<IServerAddressesFeature>().Addresses.First();
            var uri = new Uri(address);
            // 节点服务注册对象
            var registration = new AgentServiceRegistration() {
                ID = serviceOptions.ServiceId,
                Name = serviceOptions.ServiceName,
                Address = uri.Host,
                Port = uri.Port,
                Check = new AgentServiceCheck {
                    // 超时时间
                    Timeout = TimeSpan.FromSeconds(5),
                    // 服务停止多久后注销服务
                    DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),
                    // 健康检查地址
                    HTTP = $"{uri.Scheme}://{uri.Host}:{uri.Port}{serviceOptions.HealthCheck}",
                    // 检查健康时间间隔
                    Interval = TimeSpan.FromSeconds(10)
                }
            };
            // 注册服务
            consulClient.Agent.ServiceRegister(registration).Wait();
            // 应用程序终止时,注销服务
            lifetime.ApplicationStopping.Register(()=>{
                consulClient.Agent.ServiceDeregister(serviceOptions.ServiceId).Wait();
            });
            return app;
        }
    }
}

ConsulServiceOptions.cs类代码

namespace ConsulServiceRegistration
{
    public class ConsulServiceOptions
    {
        // 服务注册地址(Consul的地址)
        public string ConsulAddress { get; set; }
        // 服务Id
        public string ServiceId { get; set; }
        // 服务名称
        public string ServiceName { get; set; }
        // 健康检查地址
        public string HealthCheck { get; set; }
    }
}

然后再ASP.Net Core项目中引用这个类库。然后在Startup.cs里添加两个服务

public void ConfigureServices(IServiceCollection services){
    // 健康检查中间件,.NET Core内置
    services.AddHealthChecks();
    services.AddConsul();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,IOptions<SettingModel> appOptions,IOptions<ConsulServiceOptions> serviceOptions){
    // 传入健康检测地址
    app.UseHealthChecks(serviceOptions.Value.HealthCheck);
    app.UseConsul();
}

接下来我们需要添加一个配置文件,如代码中所写,在ASP.Net Core项目中创建一个名为service.config.json的配置文件,内容如下

{
  "ConsulAddress": "http://127.0.0.1:8500",
  "ServiceName": "AspNetCore",
  "HealthCheck": "/Health"
}

这样编码算全部完成了,我们可以测试看看。

我通过命令行启动3个AspNetCore应用,端口分别是1234,1235,1236。

然后我们看看Consul的监控界面看

.NET Core Consul服务注册完成了。最后我们看一下.NET Core内置的健康检测页面是什么内容

访问localhost:1234/Health直接输出了Healthy

更新于:8天前
赞一波!

文章评论

全部评论