一、為什么有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:\consul\consul 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:\Users\dell\Desktop\ConsulServiceFind\ConsulServiceFind\bin\Debug\netcoreapp2.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查看多個服務被發現和心跳檢測


轉載請註明出處,本文鏈接:https://www.uj5u.com/net/79169.html
標籤:.NET Core
