まず、なぜ領事?
マイクロサービスでは、各サービスは、ユーザの要求は、サーバーのサービスの受注を得るために、10台のサーバに到着し、注文サービスのクラスタが持っているのですか?10のステーションといくつかの受注サービスが行う方法のハングアップする場合は?10台のサーバーは運ぶことができなかった、と展開の新しいレベルは、台湾の増加サーバがどのように利用者がサービスを提供するために、サーバへの新しい要求がある知っているように、サービスの受注を提供しますか?この時間は、それが領事を必要とし、それがどのサービスハートビート、および新サービス開始により、まだ生きている、それはまた、見つけるためのイニシアチブを取ることができます
二、領事環境の準備
1、領事環境
領事の公式ウェブサイト:https://www.consul.io/downloads.html、ダウンロードの窓64
2、領事管理の背景を開始
その後始めるCMD、ディレクトリプットconsul.exeの手紙に右、カットにカット手紙、パスを見て、CDのD:\領事\ -dev領事エージェント
アクセス領事管理背景ます。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心跳检测,添加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 } } }
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、去http://localhost:8500查看多个服务被发现和心跳检测