一、微服務--爲何有consul,consul註冊,心跳檢測,服務發現

1、爲何有consul?html

在微服務,每1個服務都是集羣式的,訂單服務在10臺服務器上都有,那麼用戶的請求到達,獲取哪臺服務器的訂單服務呢?若是10臺中的有的訂單服務掛了怎麼辦?10臺服務器扛不住了,水平擴展又新增長了1臺服務器提供訂單服務,怎麼讓用戶請求知道有新的服務器提供服務了?這時候就須要Consul了,它能經過心跳檢測哪些服務還活着,並且有新的服務啓動,它也能主動發現web

一、S-B-1服務,S-B-2服務,S-B-2服務註冊到consulwindows

二、consul健康檢查S-B-1服務,S-B-2服務,S-B-2服務api

三、S-A調用S-B-1服務或S-B-2服務或S-B-2服務服務器

2、consul環境準備app

一、consul環境微服務

consul官網:https://www.consul.io/downloads.html,下載windows 64bit網站

二、啓動consul管理後臺ui

而後cmd啓動,注意切盤符,路徑要對,盤符切到放consul.exe的目錄,cd D:\consul\consul agent -devthis

訪問consul管理後臺:http://localhost:8500

3、代碼實現

一、添加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
            });
        }

    }
}

二、log4net 集成到Core

2.一、Nuget引入log4net

2.二、Nuget引入Microsoft.Extensions.Logging.Log4Net.AspNetCore

2.三、添加log4net 配置文件 (設置配置文件屬性爲始終複製,默認配置文件放在根目錄下)

2.四、注入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>();
    }
}

三、網站啓動後須要consul註冊

3.一、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.二、在Startup的Configure方法裏使用consul

3.三、ConsulRegister心跳檢測,添加health-check,健康檢查

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
        }
    }
}

四、啓動多個WebApi實例,運行兩個WebApi服務起來

4.一、cd  切路徑--C:\Users\dell\Desktop\ConsulServiceFind\ConsulServiceFind\bin\Debug\netcoreapp2.2

4.二、經過命令行啓動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.三、去http://localhost:8500查看多個服務被發現和心跳檢測 

 

 

相關文章
相關標籤/搜索