摘要
Consul,一款开源系统工具,能够帮助分布式架构实现高可用性和横向拓展。它能够让你轻松地申请注册和发现服务项目,手机客户端更是能够随时随地地完成这些操作。Consul,你值得拥有!
正文
Consul 服务项目的申请注册和发觉
Consul 是Hashicorp企业发布的开源系统专用工具,用以完成分布式架构的服务发现与配备。Consul是分布式系统的,高可用性的,可横着拓展的。
Consul 的主要特点有:
Service Discovery : 服务项目申请注册与发觉,Consul 的手机客户端能够作为一个服务项目申请注册到 Consul,还可以根据 Consul 来搜索特殊的服务供应商,而且依据给予的信息内容开展启用。
Health Checking: Consul 手机客户端会按时推送一些健康体检数据信息和服务器端开展通信,分辨手机客户端的情况、运行内存应用状况是不是一切正常,用于监管全部群集的情况,避免服务项目分享到常见故障的服务项目上边。
KV Store: Consul 还给予了一个非常容易应用的键值储存。这能够用于维持动态性配备,帮助服务项目融洽、创建 Leader 大选,及其开发人员想结构的其他一些事务管理。
Secure Service Communication: Consul 能够为服务项目转化成分布式系统的 TLS 资格证书,以创建互相的 TLS 联接。 能够应用 intentions 界定容许什么服务项目开展通讯。 能够应用 intentions 轻轻松松管理服务防护,而不是应用繁杂的互联网拓 扑和静态数据服务器防火墙标准。
Multi Datacenter: Consul 适用拆箱既用的多大数据中心,这代表着客户不用担忧必须创建附加的抽象性层让业务流程拓展到好几个地区。
Consul 人物角色
Server: 服务器端, 储存配备信息内容, 高可用性群集, 在局域网络内与当地手机客户端通信, 根据局域网与其他大数据中心通信。 每一个大数据中心的 Server 总数强烈推荐为 3 个或者 5 个。
Client: 手机客户端, 无状态, 将 HTTP 和 DNS 插口要求发送给局域网络内的服务器端群集。
Consul 致力于对 DevOps 小区和应用软件开发者友善,使其变成当代、延展性系统架构的理想化挑选。
最先免费下载Consul服务项目部件:官方网站下载:https://www.consul.io/downloads
运行Consul:
依据运行后的http表明端口号8500端口号:
根据电脑浏览器查询 Consul服务站是不是运行取得成功,详细地址:http://localhost:8500,假如取得成功,实际效果以下:
随后建立一个服务器端案例工程项目:
加上必需的检测类:
using System; using System.Collections.Generic; using System.Text; namespace Demo { /// <summary> /// 客户实体模型。 /// </summary> public class User { /// <summary> /// 获得或是设定客户外键约束。 /// </summary> public int ID { get; set; } /// <summary> /// 获得或是设定客户名字。 /// </summary> public string Name { get; set; } /// <summary> /// 获得或是设定客户账户名字。 /// </summary> public string Account { get; set; } /// <summary> /// 获得或是设定客户登陆密码。 /// </summary> public string Password { get; set; } /// <summary> /// 获得或是设定客户的电子器件邮件地址。 /// </summary> public string Email { get; set; } /// <summary> /// 获得或是设定客户人物角色。 /// </summary> public string Role { get; set; } /// <summary> /// 获得或是设定客户的登陆時间。 /// </summary> public DateTime LoginTime { get; set; } } }
using System; using System.Collections.Generic; using System.Text; namespace Demo { /// <summary> /// 客户服务的接口标准。 /// </summary> public interface IUserService { /// <summary> /// 搜索特定外键约束的客户案例目标。 /// </summary> /// <param name="id">客户的外键约束。</param> /// <returns>回到搜索到的客户案例目标。</returns> User FindUser(int id); /// <summary> /// 获得全部客户的案例结合。 /// </summary> /// <returns>回到全部的客户案例。</returns> IEnumerable<User> UserAll(); } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Demo { /// <summary> /// 完成客户服务插口的完成种类。 /// </summary> public class UserService : IUserService { private IList<User> dataList; /// <summary> /// 复位种类的案例 /// </summary> public UserService() { dataList = new List<User>() { new User {ID=1,Name="张三",Account="5435435345",Password="4535435435",Email="4535345345", Role="Admin", LoginTime=DateTime.Now}, new User {ID=2,Name="李四",Account="5435435345",Password="5435345345",Email="543534535", Role="Admin", LoginTime=DateTime.Now.AddDays(-5) }, new User { ID = 3, Name = "王二", Account = "45354", Password = "3245345", Email = "54353455", Role = "Admin", LoginTime = DateTime.Now.AddDays(-30) }, new User { ID = 4, Name = "大麻子", Account = "45354", Password = "4534535", Email = "453534534", Role = "Admin", LoginTime = DateTime.Now.AddDays(-90) }, new User { ID = 5, Name = "陈五", Account = "54353", Password = "5435345", Email = "5435345345", Role = "Admin", LoginTime = DateTime.Now.AddMinutes(-50) } }; } /// <summary> /// 搜索特定外键约束的客户案例目标。 /// </summary> /// <param name="id">客户的外键约束。</param> /// <returns>回到搜索到的客户案例目标。</returns> public User FindUser(int id) { return dataList.FirstOrDefault(user => user.ID == id); } /// <summary> /// 获得全部客户的案例结合。 /// </summary> /// <returns>回到全部的客户案例。</returns> public IEnumerable<User> UserAll() { return dataList; } } }
using Consul; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using System; using System.Collections.Generic; using System.Text; namespace Demo { /// <summary> /// Consul 静态数据拓展类。 /// </summary> public static class ConsulExtension { /// <summary> ///种类复位器,复位 Consul 网站地址和大数据中心。 /// </summary> static ConsulExtension() { Uri = new Uri("http://localhost:8500"); DataCenter = "dc1"; } /// <summary> /// 获得或是设定 Consul 的网站地址。 /// </summary> public static Uri Uri { get; set; } /// <summary> /// 获得或是设定大数据中心。 /// </summary> public static string DataCenter { get; set; } /// <summary> /// 向 Consul 服务站申请注册服务项目案例。 /// </summary> /// <param name="configuration">配备目标。</param> /// <param name="consulServiceName">在 Consul 服务站申请注册的服务项目类型名字,好几个案例的 ID 能够归属于一个服务项目类型名字。</param> /// <param name="serviceID">服务项目案例的主键值,务必唯一。</param> public static void ConsulRegist(this IConfiguration configuration, string consulServiceName, string serviceID) { if (string.IsNullOrEmpty(consulServiceName) || string.IsNullOrWhiteSpace(consulServiceName)) { throw new ArgumentNullException("consulServiceName is null"); } if (string.IsNullOrEmpty(serviceID) || string.IsNullOrWhiteSpace(serviceID)) { throw new ArgumentNullException("serviceID is null."); } using (ConsulClient client = new ConsulClient(config => { config.Address = Uri; config.Datacenter = DataCenter; })) { string ip = configuration["ip"]; int port = int.Parse(configuration["port"]); int weight = string.IsNullOrWhiteSpace(configuration["weight"]) ? 1 : int.Parse(configuration["weight"]); client.Agent.ServiceRegister(new AgentServiceRegistration() { ID = serviceID, Name = consulServiceName, Address = ip, Port = port, Tags = new string[] { weight.ToString() }, Check = new AgentServiceCheck() { Interval = TimeSpan.FromSeconds(12), HTTP = $"http://{ip}:{port}/API/Health/Index", Timeout = TimeSpan.FromSeconds(5), DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(20) } }).Wait(); Console.WriteLine($"申请注册服务项目:{ip}:{port}--Weight:{weight}"); }; } /// <summary> /// 向 Consul 服务站销户服务项目案例。 /// </summary> /// <param name="applicationLifetime">配备目标。</param> /// <param name="serviceID">服务项目案例的主键值,务必唯一。</param> public static void ConsulDown(this iapplicationLifetime applicationLifetime, string serviceID) { if (string.IsNullOrEmpty(serviceID) || string.IsNullOrWhiteSpace(serviceID)) { throw new ArgumentNullException("serviceID is null"); } applicationLifetime.ApplicationStopped.Register(() => { using (var consulClient = new ConsulClient(config => { config.Address = Uri; config.Datacenter = DataCenter; })) { Console.WriteLine("服务项目早已撤出"); consulClient.Agent.ServiceDeregister(serviceID); } }); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; namespace ConsulAPIDemo.Controllers { [Route("api/[controller]")] [ApiController] public class HealthController : ControllerBase { private IConfiguration _configuration; /// <summary> /// 复位该种类的新案例。 /// </summary> /// <param name="configuration">配备插口。</param> public HealthController(IConfiguration configuration) { _configuration = configuration; } /// <summary> /// 要启用的插口。 /// </summary> [HttpGet] [Route("Index")] public IActionResult Index() { Console.WriteLine($"This is HealhController {_configuration["port"]} Invoke"); return Ok(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using Demo; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; namespace ConsulAPIDemo.Controllers { [Route("api/[controller]")] [ApiController] public class ValuesController : ControllerBase { /// <summary> /// 客户的 API 种类。 /// </summary> [Route("api/[controller]")] [ApiController] public class UsersController : ControllerBase { #region 独享字段名 private readonly ILogger<UsersController> _logger; private readonly IUserService _userService; private IConfiguration _configuration; #endregion #region 构造方法 /// <summary> /// 复位该种类的新案例。 /// </summary> /// <param name="logger">日志监控软件。</param> /// <param name="userService">客户服务插口。</param> /// <param name="configuration">配备服务项目。</param> public UsersController(ILogger<UsersController> logger, IUserService userService, IConfiguration configuration) { _logger = logger; _userService = userService; _configuration = configuration; } #endregion #region 实例方法 /// <summary> /// 获得一条纪录 /// </summary> /// <param name="id"></param> /// <returns></returns> [HttpGet] [Route("Get")] public User Get(int id) { return _userService.FindUser(id); } /// <summary> /// 获得全部纪录。 /// </summary> /// <returns></returns> [HttpGet] [Route("All")] //[Authorize] public IEnumerable<User> Get() { Console.WriteLine($"This is UsersController {this._configuration["port"]} Invoke"); return this._userService.UserAll().Select((user => new User { ID = user.ID, Name = user.Name, Account = user.Account, Password = user.Password, Email = user.Email, Role = $"{this._configuration["ip"]}:{this._configuration["port"]}", LoginTime = user.LoginTime })); ; } /// <summary> /// 请求超时解决 /// </summary> /// <returns></returns> [HttpGet] [Route("Timeout")] public IEnumerable<User> Timeout() { Console.WriteLine($"This is Timeout Start"); //请求超时设定。 Thread.Sleep(3000); Console.WriteLine($"This is Timeout End"); return this._userService.UserAll().Select((user => new User { ID = user.ID, Name = user.Name, Account = user.Account, Password = user.Password, Email = user.Email, Role = $"{this._configuration["ip"]}:{this._configuration["port"]}", LoginTime = user.LoginTime })); ; } #endregion } } }
startup里边的配备:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Demo; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.HttpsPolicy; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; namespace ConsulAPIDemo { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { //必须提升的 services.AddSingleton<IUserService, UserService>(); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, Microsoft.AspNetCore.Hosting.IHostingEnvironment env, Microsoft.Extensions.Hosting.IApplicationLifetime applicationLifetime) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } #region Consul 申请注册,必须提升的 string serviceID = $"Service:{Configuration["ip"]}:{Configuration["port"]}---{Guid.NewGuid()}"; string consuleServiceName = "PatrickLiuService"; //申请注册服务项目。 Configuration.ConsulRegist(consuleServiceName, serviceID); //销户服务项目 applicationLifetime.ConsulDown(serviceID); #endregion app.UseHttpsRedirection(); app.UseMvc(); } } }
编译程序一下,依据不一样端口号运行API接口服务项目:
API端口设置为2000:
API端口设置为3000:
申请注册四个案例:
上边全部全过程早已完成了服务项目的申请注册,对于察觉自己能够测一下,自身关闭一个服务项目,Consul会全自动查验每个服务项目的身心健康度,假如哪一个服务项目发现异常,consul会全自动去除出现异常服务项目。
参照文本文档:https://www.cnblogs.com/PatrickLiu/p/13939135.html
关注不迷路
扫码下方二维码,关注宇凡盒子公众号,免费获取最新技术内幕!
评论0