Asp .Net Core 系列: 集成 Consul 实现 服务注册与健康检查

这篇具有很好参考价值的文章主要介绍了Asp .Net Core 系列: 集成 Consul 实现 服务注册与健康检查。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是 Consul?

官网:https://www.consul.io/

Consul 是一款开源的服务发现和配置管理工具,它能够监控应用程序和服务之间的通信,并提供了一组 API 和 Web UI,用于管理服务和配置。

Consul 是分布式的、高可用的、可横向扩展的,具备以下特性:

  1. 服务发现:Consul 通过 DNS 或者 HTTP 接口使服务注册和服务发现变得很容易,一些外部服务,例如 saas 提供的也可以一样注册。
  2. 健康检查:健康检测使 Consul 可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
  3. 键/值存储:一个用来存储动态配置的系统。提供简单的 HTTP 接口,可以在任何地方操作。
  4. 多数据中心:无需复杂的配置,即可支持任意数量的区域。

Consul 的优势:

  1. 使用 Raft 算法来保证一致性,比复杂的 Paxos 算法更直接。
  2. 支持多数据中心,内外网的服务采用不同的端口进行监听。多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟、分片等情况等。
  3. 支持健康检查。
  4. 支持 http 和 dns 协议接口。
  5. 官方提供 web 管理界面。
  6. 安装和部署简单,使用起来也较为简单。Consul 使用 Go 语言编写,因此具有天然可移植性(支持 Linux、windows 和 Mac OS X);安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合 。

安装和运行 Consul

下载地址:https://developer.hashicorp.com/consul/install?product_intent=consul#Windows

运行 consul,指定为开发环境

consul agent -dev

web 界面:http://localhost:8500/ui

Asp .Net Core 如何集成 Consul 实现服务注册和健康检查

要在 ASP.NET Core 应用程序中集成 Consul 实现服务注册和服务发现,可以按照以下步骤进行操作:

  1. 安装 Consul 客户端 SDK 和 Asp .Net Core 扩展包

首先,需要在 ASP.NET Core 应用程序中安装 Consul 客户端 SDK。可以通过 NuGet 包管理器来安装,在包管理器控制台中输入以下命令:

Install-Package Consul
Install-Package Consul.AspNetCore
  1. 配置服务注册
    在应用程序启动时,需要将服务注册到 Consul 中。这通常在 Startup 类的 ConfigureServices 方法中完成。首先,示例代码如下:
        /// <summary>
        /// 向容器中添加Consul必要的依赖注入
        /// </summary>
        /// <param name="services"></param>
        /// <returns></returns>
        public static IServiceCollection AddMCodeConsul(this IServiceCollection services)
        {
            var configuration = services.BuildServiceProvider().GetRequiredService<IConfiguration>();
            // 配置consul服务注册信息
            var consulOptions = configuration.GetSection("Consul").Get<ConsulOptions>();
            // 通过consul提供的注入方式注册consulClient
            services.AddConsul(options => options.Address = new Uri($"http://{consulOptions.ConsulIP}:{consulOptions.ConsulPort}"));

            // 通过consul提供的注入方式进行服务注册
            var httpCheck = new AgentServiceCheck()
            {
                DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后注册
                Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔,或者称为心跳间隔
                HTTP = $"http://{consulOptions.IP}:{consulOptions.Port}/health",//健康检查地址
                Timeout = TimeSpan.FromSeconds(10)
            };

            // Register service with consul
            services.AddConsulServiceRegistration(options =>
            {
                options.Checks = new[] { httpCheck };
                options.ID = Guid.NewGuid().ToString();
                options.Name = consulOptions.ServiceName;
                options.Address = consulOptions.IP;
                options.Port = consulOptions.Port;
                options.Meta = new Dictionary<string, string>() { { "Weight", consulOptions.Weight.HasValue ? consulOptions.Weight.Value.ToString() : "1" } };
                options.Tags = new[] { $"urlprefix-/{consulOptions.ServiceName}" }; //添加
            });

            return services;
        }

ConsulOptions 配置类

    public class ConsulOptions
    {
        /// <summary>
        /// 当前应用IP
        /// </summary>
        public string IP { get; set; }

        /// <summary>
        /// 当前应用端口
        /// </summary>
        public int Port { get; set; }

        /// <summary>
        /// 当前服务名称
        /// </summary>
        public string ServiceName { get; set; }

        /// <summary>
        /// Consul集群IP
        /// </summary>
        public string ConsulIP { get; set; }

        /// <summary>
        /// Consul集群端口
        /// </summary>
        public int ConsulPort { get; set; }

        /// <summary>
        /// 权重
        /// </summary>
        public int? Weight { get; set; }
    }

appsettings.json

{
    "Consul": {
        "ConsulIP": "127.0.0.1",
        "ConsulPort": "8500",
        "ServiceName": "ConsulDemoService",
        "Ip": "localhost",
        "Port": "5014",
        "Weight": 1
    }
}

Consul.AspNetCore 中的 AddConsul 和 AddConsulServiceRegistration 方法 究竟做了什么?

AddConsul 方法

可以看到通过 ConsulClientFactory 类创建和配置 Consul 的客户端实例,ConsulClientFactory 通过 IOptionsMonitor 读取应用程序的配置更改
IOptionsMonitor: 是 ASP.NET Core 的一个接口,它提供了一种方式来观察和监视应用程序的配置更改。通过实现 IOptionsMonitor 接口,你可以创建自定义的配置监视器,以便在配置更改时自动更新应用程序的设置

public static class ServiceCollectionExtensions
{
    public static IServiceCollection AddConsul(this IServiceCollection services)
    {
        return services.AddConsul(delegate
        {
        });
    }

    public static IServiceCollection AddConsul(this IServiceCollection services, Action<ConsulClientConfiguration> configure)
    {
        return services.AddConsul(Options.DefaultName, configure);
    }

    public static IServiceCollection AddConsul(this IServiceCollection services, string name, Action<ConsulClientConfiguration> configure)
    {
        services.Configure(name, configure);
        services.TryAddSingleton<IConsulClientFactory, ConsulClientFactory>();
        services.TryAddSingleton((IServiceProvider sp) => sp.GetRequiredService<IConsulClientFactory>().CreateClient(name));
        return services;
    }
    。。。
}

public class ConsulClientFactory : IConsulClientFactory
{
    private readonly IOptionsMonitor<ConsulClientConfiguration> _optionsMonitor;

    public ConsulClientFactory(IOptionsMonitor<ConsulClientConfiguration> optionsMonitor)
    {
        _optionsMonitor = optionsMonitor;
    }

    public IConsulClient CreateClient()
    {
        return CreateClient(Options.DefaultName);
    }

    public IConsulClient CreateClient(string name)
    {
        return new ConsulClient(_optionsMonitor.Get(name));
    }
}

AddConsulServiceRegistration 方法

可以看出使用 AgentServiceRegistrationHostedService 类定义应用程序的后台服务,用于注册和取消注册 Consul 实例

public static class ServiceCollectionExtensions
{
   public static IServiceCollection AddConsulServiceRegistration(this IServiceCollection services, Action<AgentServiceRegistration> configure)
   {
       AgentServiceRegistration agentServiceRegistration = new AgentServiceRegistration();
       configure(agentServiceRegistration);
       return services.AddSingleton(agentServiceRegistration).AddHostedService<AgentServiceRegistrationHostedService>();
   }
}

public class AgentServiceRegistrationHostedService : IHostedService
{
   private readonly IConsulClient _consulClient;

   private readonly AgentServiceRegistration _serviceRegistration;

   public AgentServiceRegistrationHostedService(IConsulClient consulClient, AgentServiceRegistration serviceRegistration)
   {
       _consulClient = consulClient;
       _serviceRegistration = serviceRegistration;
   }

   public Task StartAsync(CancellationToken cancellationToken)
   {
       return _consulClient.Agent.ServiceRegister(_serviceRegistration, cancellationToken);
   }

   public Task StopAsync(CancellationToken cancellationToken)
   {
       return _consulClient.Agent.ServiceDeregister(_serviceRegistration.ID, cancellationToken);
   }
}

配置 Consul 检查服务

        /// <summary>
        /// 配置Consul检查服务
        /// </summary>
        /// <param name="app"></param>
        /// <returns></returns>
        public static IApplicationBuilder UseConsulCheckService(this IApplicationBuilder app)
        {
            app.Map("/health", app =>
            {
                app.Run(async context =>
                {
                    await Task.Run(() => context.Response.StatusCode = 200);
                });
            });

            return app;
        }

封装成扩展

        /// <summary>
        /// 向容器中添加Consul必要的依赖注入
        /// </summary>
        /// <param name="services"></param>
        /// <param name="configuration"></param>
        /// <returns></returns>
        public static IServiceCollection AddMCodeConsul(this IServiceCollection services)
        {
            var configuration = services.BuildServiceProvider().GetRequiredService<IConfiguration>();
            // 配置consul服务注册信息
            var consulOptions = configuration.GetSection("Consul").Get<ConsulOptions>();
            // 通过consul提供的注入方式注册consulClient
            services.AddConsul(options => options.Address = new Uri($"http://{consulOptions.ConsulIP}:{consulOptions.ConsulPort}"));

            // 通过consul提供的注入方式进行服务注册
            var httpCheck = new AgentServiceCheck()
            {
                DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后注册
                Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔,或者称为心跳间隔
                HTTP = $"http://{consulOptions.IP}:{consulOptions.Port}/health",//健康检查地址
                Timeout = TimeSpan.FromSeconds(10)
            };

            // Register service with consul
            services.AddConsulServiceRegistration(options =>
            {
                options.Checks = new[] { httpCheck };
                options.ID = Guid.NewGuid().ToString();
                options.Name = consulOptions.ServiceName;
                options.Address = consulOptions.IP;
                options.Port = consulOptions.Port;
                options.Meta = new Dictionary<string, string>() { { "Weight", consulOptions.Weight.HasValue ? consulOptions.Weight.Value.ToString() : "1" } };
                options.Tags = new[] { $"urlprefix-/{consulOptions.ServiceName}" }; //添加
            });


            return services;
        }

        /// <summary>
        /// 配置Consul检查服务
        /// </summary>
        /// <param name="app"></param>
        /// <returns></returns>
        public static IApplicationBuilder UseConsulCheckService(this IApplicationBuilder app)
        {
            app.Map("/health", app =>
            {
                app.Run(async context =>
                {
                    await Task.Run(() => context.Response.StatusCode = 200);
                });
            });

            return app;
        }

效果

Asp .Net Core 系列: 集成 Consul 实现 服务注册与健康检查,.netcore,consul

Asp .Net Core 系列: 集成 Consul 实现 服务注册与健康检查,.netcore,consul文章来源地址https://www.toymoban.com/news/detail-812734.html

到了这里,关于Asp .Net Core 系列: 集成 Consul 实现 服务注册与健康检查的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Asp .Net Core 系列:基于 Swashbuckle.AspNetCore 包 集成 Swagger

    Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。它提供了一种规范的方式来定义、构建和文档化 RESTful Web 服务,使客户端能够发现和理解各种服务的功能。Swagger 的目标是使部署管理和使用功能强大的 API 从未如此简单。 Swagger 提供了

    2024年01月18日
    浏览(51)
  • ASP.NET Core SignalR 系列(二)- 中心(服务端)

    本章将和大家分享 ASP.NET Core SignalR 中的中心(服务端)。 本文大部分内容摘自微软官网:https://learn.microsoft.com/zh-cn/aspnet/core/signalr/hubs?view=aspnetcore-7.0 废话不多说,我们直接来看一个Demo,Demo的目录结构如下所示: 本Demo的Web项目为ASP.NET Core Web 应用程序( 目标框架为.NET 7.0

    2024年02月13日
    浏览(53)
  • .net core 6 集成nacos的服务注册和配置中心

    1、安装nuget包 2、加上配置文件         注意:         \\\"ConfigUseRpc\\\": false         \\\"NamingUseRpc\\\": false         http连接选false否则配置中心可能会获取不到内容 3、注册 启动后 4、使用服务发现 5、注册配置中心 随意添加配置 6、使用配置中心 7、配置变化的监听方法

    2024年01月16日
    浏览(35)
  • spring boot 服务健康检测返回OUT_OF_SERVICE,导致服务无法成功注册到consul

    健康检测接口返回OUT_OF_SERVICE 从日志启动看,没有任何报错信息;而且jvm进程也启动成功。 关键的一点信息是,服务的swagger地址访问也正常。 但是,consul上的服务状态就是不健康。 当然,重启大法不好使。 增加配置项: management.endpoint.health.show-details: always 可以看出,ela

    2024年02月14日
    浏览(44)
  • 2步轻松实现ASP.NET Core托管服务执行定时任务

    最近接到一个新项目,需要在项目里添加一个后台任务,定时去发邮件通知客户;由于是一个比较小型的项目,不希望引入Quartz.Net、Hangfire等太重的框架,同时也没持久化要;寻觅了一下发现ASP.NET Core本身带有托管服务,可以执行定时任务。ASP.NET Core提供了IHostedService接口,

    2024年02月06日
    浏览(47)
  • 在ASP.NET Core微服务架构下使用RabbitMQ如何实现CQRS模式

    前言 在现代软件开发中,微服务架构和CQRS模式都是备受关注的技术趋势。微服务架构通过将应用程序拆分为一系列小型、自治的服务,提供了更好的可伸缩性和灵活性。而CQRS模式则通过将读操作和写操作分离,优化了系统的性能和可维护性。本文小编将为大家介绍如何在

    2024年01月16日
    浏览(49)
  • Asp.net Core系列学习(1)

    ASP.NET Core 是一个跨平台的高性能开源 框架 ,用于生成启用云且连接 Internet 的新式应用。 使用 ASP.NET Core,可以: 生成 Web 应用和服务、物联网 (IoT) 应用和移动后端。 在 Windows、macOS 和 Linux 上使用喜爱的开发工具。 部署到云或本地。 在 .NET Core 上运行。 ASP.NET Core 是对 ASP

    2024年02月06日
    浏览(66)
  • ASP.NET Core 配置系列一

    A S P . N E T   C o r e   配 置 主 要 通 过 这 3 个 文 件 设 置 : 1   项 目 文 件 也 叫 . c s p r o j   文 件 2   P r o g r a m . c s 3   a p p s e t t i n g s . j s o n 这 些 配 置 告 诉 A S P . N E T   C o r e   应 用 程 序 基 于 用 户 的 交 互 是 如 何 工 作 的, 在 本 节 中 我 们 理 解 A S P .

    2024年02月03日
    浏览(108)
  • ASP.NET Core 依赖注入系列一

    什么是ASP.NET Core 依赖注入? 依赖注入也称DI是一项技术用来实现对象松耦合以至于应用程序更容易维护,ASP.NET Core通过控制器的构造函数自动注入依赖的对象,我们创建ASP.NET Core MVC应用程序演示依赖注入特性是如何工作, 在这节中我们讲解该特性 1 例子 我们创建一个ASP.NET C

    2024年02月11日
    浏览(54)
  • 实战指南:使用 xUnit 和 ASP.NET Core 进行集成测试【完整教程】

    集成测试可在包含应用支持基础结构(如数据库、文件系统和网络)的级别上确保应用组件功能正常。 ASP.NET Core 通过将单元测试框架与测试 Web 主机和内存中测试服务器结合使用来支持集成测试。 集成测试与单元测试相比,能够在更广泛的级别上评估应用的组件,确认多个

    2024年04月22日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包