zoukankan      html  css  js  c++  java
  • 微服务--Consul服务注册与发现,健康检查

    一、为什么有Consul?

    在微服务架构中,每1个服务都是集群式的提供服务,订单服务在10台服务器上都有,那么用户的请求到达,获取哪台服务器的订单服务呢?如果10台中有的订单服务挂了怎么办?10台服务器扛不住了,水平扩展又新增加了1台服务器提供订单服务,怎么让用户请求知道有新的服务器提供订单服务了?这时候就需要Consul了,它能通过心跳检测哪些服务还活着,而且有新的服务启动,它也能够主动发现。

    1、S-B-1服务,S-B-2服务,S-B-3服务注册到Consul

    2、Consul健康检查S-B-1服务,S-B-2服务,S-B-3服务

    3、S-A调用S-B-1服务,或S-B-2服务,或S-B-3服务

    二、Consul环境准备

    1、Consul环境下载

    Consul官网:https://www.consul.io/downloads.html,下载windows 64bit

    2、启动Consul管理后台

    盘符切到放consul.exe的目录,然后cmd启动,cd D:consulconsul agent -dev

    3、访问Consul管理后台:http://localhost:8500

    三、代码实现

    1、添加WebApi服务

    namespace ConsulServiceFind.Controllers
    {
        [Route("api/[controller]")]
        [ApiController]
        public class ValuesController : ControllerBase
        {
            private IConfiguration _IConfiguration = null;
            private ILogger<ValuesController> _logger = null;
    
            public ValuesController(IConfiguration iConfiguration, ILogger<ValuesController> logger)
            {
                _IConfiguration = iConfiguration;
                _logger = logger;
            }
    
            // GET api/values
            [HttpGet]
            public ActionResult<IEnumerable<string>> Get()
            {
                this._logger.LogWarning("ValuesController-Get 执行");
                return new JsonResult(new
                {
                    Id = 123,
                    Name = "david_test",
                    IP = this._IConfiguration["ip"],
                    port = this._IConfiguration["port"],
                    urls = this._IConfiguration["urls"],
                    CurrentPath = base.HttpContext.Request.Path
                });
            }
    
        }
    }

    2、log4net 集成到Core

    2.1、Nuget引入log4net

    2.2、Nuget引入Microsoft.Extensions.Logging.Log4Net.AspNetCore

    2.3、添加log4net 配置文件 (设置配置文件属性为始终复制,默认配置文件放在根目录下)

    2.4、注入ILogger

    namespace ConsulServiceFind
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                CreateWebHostBuilder(args).Build().Run();
            }
    
    
            public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                .ConfigureLogging((context, LoggingBuilder) =>//ILogger
                {
                    LoggingBuilder.AddFilter("System", LogLevel.Warning); //忽略系统的其他日志
                    LoggingBuilder.AddFilter("Microsoft", LogLevel.Warning);
                    LoggingBuilder.AddLog4Net();
                })
                .UseStartup<Startup>();
        }
    }

    3、网站启动后需要Consul注册

    3.1、Nuget引用Consul后,封装ConsulRegister类

    namespace ConsulServiceFind
    {
        public static class ConsulRegister
        {
            public static void RegistConsul(this IConfiguration configuration)
            {
                string ip = configuration["ip"] ?? "Localhost";
                //部署到不同服务器的时候不能写成127.0.0.1或者0.0.0.0,因为这是让服务消费者调用的地址
                int port = int.Parse(configuration["port"]);
                //实例化Consul客户端
                ConsulClient consulClient = new ConsulClient(c => {
                    c.Address = new Uri("http://127.0.0.1:8500");
                    c.Datacenter = "consul";
                });
                //向Consul注册服务
                Task<WriteResult> result = consulClient.Agent.ServiceRegister(new AgentServiceRegistration() {
                    ID = "david_webapi_test_" + Guid.NewGuid(),//服务编号,不能重复
                    Name = "david_webapi",//服务的名字--将来调用时用的就是这个
                    Address = ip,
                    Port = port,
                    Tags = new string[] { },//可以用来设置权重
                    Check=new AgentServiceCheck() {
                        DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务停止多久后反注册
                        Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔,或者称为心跳间隔
                        HTTP = $"http://{ip}:{port}/api/health",//健康检查地址
                        Timeout = TimeSpan.FromSeconds(5)
                    }
                });
            }
        }
    }

    3.2、在Startup的Configure方法里使用Consul

    3.3、ConsulRegister心跳检测,添加HealthCheck也就是另外一个WebApi,做健康检查

    namespace ConsulServiceFind
    {
        [Route("api/[controller]")]
        [ApiController]
        public class HealthController : ControllerBase
        {
            private IConfiguration _IConfiguration = null;
            private ILogger<HealthController> _logger = null;
            public HealthController(IConfiguration configuration, ILogger<HealthController> logger)
            {
                this._IConfiguration = configuration;
                this._logger = logger;
            }
           
            [HttpGet]
            public IActionResult Check()
            {
                this._logger.LogWarning($"{this._IConfiguration["port"]}-Health Check!");
                return Ok();//200
            }
        }
    }

    4、启动多个WebApi实例,运行两个WebApi服务起来

    4.1、cd  切路径--C:UsersdellDesktopConsulServiceFindConsulServiceFindinDebug etcoreapp2.2

    4.2、通过命令行启动2个不同端口的WebApi

    dotnet ConsulServiceFind.dll --urls="http://*:10010" --ip="127.0.0.1" --port=10010

    dotnet ConsulServiceFind.dll --urls="http://*:10020" --ip="127.0.0.1" --port=10020

    http://localhost:10010/api/values

    http://localhost:10020/api/values

    4.3、去Consul管理后台http://localhost:8500查看多个服务被发现和心跳检测 

     

  • 相关阅读:
    入门级科普 | ICO→STO→IEO,下一个会是IDO吗?
    去中心化金融(DeFi):一个新的金融科技革命
    kubernetes docker 查看站点访问权限问题
    Pycharm 插件中的git使用
    Selenium 中对于table的判断
    macOS 终端打开提示:zsh compinit: insecure directories
    Mac 删除开机选项
    pytest-BDD 的学习
    Gherkin学习笔记
    Cucumber入门之Gherkin
  • 原文地址:https://www.cnblogs.com/menglin2010/p/12114473.html
Copyright © 2011-2022 走看看