微服務學習.net5+consul
趁着剛過完年,還沒有開始做業務的時候,學習下consul 概念自己去官網看,這裡只講下具體實現
官網下載//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 = $"//{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": "//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("//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 = $"//{agentService.Address}:{agentService.Port}/api/Comm/GetProvince"; return url; }
需要demo的留言