.net Core微服务架构之健康检查和自定义负载均衡策略 以下是框架结构图
Nuget下载Consul,服务注册核心代码(写了一个扩展方法) Nuget下载Consul,服务注册核心代码(写了一个扩展方法)public static class ConsuHelper { public static void ConsuRegist(this IConfiguration configuration) { try { //与Consul建立连接 ConsulClient client = new ConsulClient(c => { c.Address = new Uri("http://42.51.12.85:8500");//localhost c.Datacenter = "dc1"; }); string ip = configuration["ip"];//这个一定要命令行启动,不然获取不到会报错 int port = int.Parse(configuration["port"]); //注册服务到Consul client.Agent.ServiceRegister(new AgentServiceRegistration() { ID = "Service" + Guid.NewGuid(),//维一ID Name = "lqwvje",//组名 Address = ip,//"127.0.0.1", Port = port, Check = new AgentServiceCheck() { Interval = TimeSpan.FromSeconds(5),//健康检查时间间隔,或者称为心跳间隔 HTTP = $"http://{ip}:{port}/api/HealthCheck",//健康检查地址 Timeout = TimeSpan.FromSeconds(5), DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5)//服务启动多久后注册 } }); } catch { } } } //下面是Startup类 Configure应用此扩展方法 这里我用的是.net core 3.0 public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { //TODO... this.Configuration.ConsuRegist(); }服务端心跳Api接口
[Route("api/[controller]")] [ApiController] public class HealthCheckController : ControllerBase { // GET: api/HealthCheck [HttpGet] public OkResult Get() { return Ok(); } }下面是客户端发现服务端核心代码如下
private static int iSeed = 0; public string GetAPIData() { //与Consul建立连接 ConsulClient client = new ConsulClient(c => { c.Address = new Uri("http://localhost:8500"); c.Datacenter = "dc1"; }); var dic = client.Agent.Services().Result.Response;//获取集群所有服务端信息 string url = "http://lqwvje/weatherforecast"; //lqwvje为服务端注册的组名 Uri uri = new Uri(url); string groupName = uri.Host; var list = dic.Where(k => k.Value.Service.Equals(groupName, StringComparison.OrdinalIgnoreCase)); if (list == null || list.Count() < 1) { return "未发现服务端"; } if (iSeed > 100_000_000) { iSeed = 0; } var keyValuePair = list.ToArray()[iSeed % list.Count()];//轮询策略--多线程的话对++上锁 //现在只用 { //keyValuePair = list.ToArray()[new Random(iSeed++).Next(0, list.Count())];//均衡策略--平均呗 } { //权重策略--原来也就这么简单 //客户端必须知道服务实例的权重---注册consul时提供的--1/3/6 //List<KeyValuePair<string, AgentService>> pairsList = new List<KeyValuePair<string, AgentService>>(); //foreach (var pair in list) //{ // int count = int.Parse(pair.Value.Tags?[0]); // for (int i = 0; i < count; i++) // { // pairsList.Add(pair); // } //} //keyValuePair = pairsList.ToArray()[new Random(iSeed++).Next(0, pairsList.Count())]; } iSeed++; string targetUrl = $"{uri.Scheme}://{keyValuePair.Value.Address}:{keyValuePair.Value.Port}/WeatherForecast"; using (HttpClient httpClient = new HttpClient())//获取接口数据 { HttpRequestMessage message = new HttpRequestMessage(); message.Method = HttpMethod.Get; message.RequestUri = new Uri(targetUrl); HttpResponseMessage result2 = httpClient.SendAsync(message).Result; string rs = result2.Content.ReadAsStringAsync().Result; return targetUrl+"\r\n" + rs; } }
转载请保留原创地址 http://www.luofenming.com/show.aspx?id=ART2019121800002
整套源码下载地址:https://pan.baidu.com/s/1Tjiii5R_cgwhqihTpvvpmg 提取码:74br
服务流程
启动 Consul服务
consul_1.6.2.exe agent -dev -http-port 8500 -ui -client 0.0.0.0
//查看Consul状态
http://localhost:8500
//启动服务端 端口可以随意写 多启动几个
dotnet apiServerDemo.dll --urls="http://*:5004" --ip="127.0.0.1" --port=5004
dotnet apiServerDemo.dll --urls="http://*:5005" --ip="127.0.0.1" --port=5005
dotnet apiServerDemo.dll --urls="http://*:5006" --ip="127.0.0.1" --port=5006
//客户端 启动就会根据 自定义负载均衡策略 在集群中某台服务器上执行业务
dotnet apiClient.dll
浏览器防问 http://localhost:5000/,每次刷新都会换成不同的服务端数据