趁着刚过完年,还没有开始做业务的时候,学习下consul 概念自己去官网看,这里只讲下具体实现
官网下载https://www.consul.io/downloads 我下载的是Windows版本
启动consul命令
consul agent -dev -client 0.0.0.0
新建.net5的api项目,.net5直接默认是swagger
4.新建扩展服务注册到Consul方法,ConsulExtenions.cs
public static void ConsulRegist(this IConfiguration configuration) { try { string ip = configuration["ip"]; string port = configuration["port"]; string weight = configuration["weight"]; string consulAddress = configuration["ConsulAddress"]; string consulCenter = configuration["ConsulCenter"]; ConsulClient client = new ConsulClient(c => { c.Address = new Uri(consulAddress); c.Datacenter = consulCenter; }); client.Agent.ServiceRegister(new AgentServiceRegistration() { ID = "CommService" + Guid.NewGuid(),//--唯一的 Name = "CommService",//分组---根据Service Address = ip, Port = int.Parse(port), Tags = new string[] { weight.ToString() },//额外标签信息 Check = new AgentServiceCheck() { Interval = TimeSpan.FromSeconds(12), HTTP = $"http://{ip}:{port}/Api/Health/Index", // 给到200 Timeout = TimeSpan.FromSeconds(5), DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(20) }//配置心跳 }); Console.WriteLine($"{ip}:{port}--weight:{weight}"); //命令行参数获取 } catch (Exception ex) { Console.WriteLine($"Consul注册:{ex.Message}"); } }
ip port 配置在appsettings.json里面
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*", "ip": "localhost", "port": 5000, "weight": 1, "ConsulAddress": "http://127.0.0.1:8500", "ConsulCenter": "dc1" }
Startup注册ConsulRegist方法
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { //if (env.IsDevelopment()) //{ app.UseDeveloperExceptionPage(); app.UseSwagger(); app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "comm.api v1")); //} // app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); // Consul注册 this.Configuration.ConsulRegist(); }
可以用dotnet 启动2个comm.api.dll 端口号自己随便取,我取的5000和6000 HealthController为配置的心跳api返回的结果
再来看下Consul 会发现多了CommService
2 Instances为端口号5000和6000的api
注册完成了,接下来实现调用看效果图
调用代码
public static AgentService ChooseService(string serviceName) { using (ConsulClient client = new ConsulClient(c => c.Address = new Uri("http://localhost:8500"))) { var services = client.Agent.Services().Result.Response; // 找出目标服务 var targetServices = services.Where(c => c.Value.Service.Equals(serviceName)).Select(s => s.Value); // 实现随机负载均衡 var targetService = targetServices.ElementAt(new Random().Next(1, 1000) % targetServices.Count()); Console.WriteLine($"{DateTime.Now} 当前调用服务为:{targetService.Address}:{targetService.Port}"); return targetService; } }
public string GetCommUrl() { AgentService agentService = ConsulClientExtenions.ChooseService("CommService"); string url = $"http://{agentService.Address}:{agentService.Port}/api/Comm/GetProvince"; return url; }
需要demo的留言