Net6+Consul的简单使用
先下载Consul
打开cmd
consul.exe agent -dev运行
可以在环境变量 PATH下添加当前Consul.exe 路径 全局使用
下面试启动ok界面,然后通过 localhost:8500 看到界面了
然后创建两个 api 程序,添加如下代码, [HttpGet("start")] public void Start() { string local = HttpContext.Request.Host.Host; int port = (int)HttpContext.Request.Host.Port!; string? url = HttpContext.Request.Host.Value; string? scheme = HttpContext.Request.Scheme + "://"; // int port = HttpContext.Request; //cmd 输入 consul 启动程序 var consulClient = new ConsulClient(p => { p.Address = new Uri($"http://127.0.0.1:8500"); });//请求注册的 Consul 地址 //这里的这个ip 就是本机的ip,这个端口8500 这个是默认注册服务端口 var httpCheck = new AgentServiceCheck() { DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后注册 Interval = TimeSpan.FromSeconds(10),//间隔固定的时间访问一次,https://localhost:44308/api/Health HTTP = $"{scheme + url}/WeatherForecast/HealthCheck",//健康检查地址 ,就是下main的方法 Timeout = TimeSpan.FromSeconds(5) }; var registration = new AgentServiceRegistration() { Checks = new[] { httpCheck }, ID = Guid.NewGuid().ToString() + "webapi1", Name = "test1", Address = $"{scheme + local}", Port = port, }; consulClient.Agent.ServiceRegister(registration).Wait();//注册服务 //consulClient.Agent.ServiceDeregister(registration.ID).Wait();//registration.ID是guid //当服务停止时需要取消服务注册,不然,下次启动服务时,会再注册一个服务。 //但是,如果该服务长期不启动,那consul会自动删除这个服务,大约2,3分钟就会删了 } [HttpGet("HealthCheck")] public bool HealthCheck() {//这里用于检测程序有没有挂的,这里要和上面对上,不然注册后也会是红叉,这里也坑了我一些时间 Console.WriteLine("ok"); return true; }
成功
同一项目多次注册
Consul参数 https://www.cnblogs.com/sunsky303/p/9209024.html
自定义端口,在consul.exe 同级目录下创建data.json { "ports": { "server":8300, "http":888 } } consul agent -server -bootstrap-expect 1 -data-dir .\ -advertise 127.0.0.1 -client 0.0.0.0 -ui -config-dir .\ cmd 命令启动也要到同目录下,不然报错,
启动成功后会生成多个文件和文件夹
var consulClient = new ConsulClient(x => x.Address = new Uri($"http://127.0.0.1:8500"));//请求注册的 Consul 地址 var ret = consulClient.Agent.Services(); --服务的监控注册的服务,这个慢启动,不然报错 var allServer = ret.GetAwaiter().GetResult(); //这个是个dictionary的返回值,他的key是string类型,就是8500/ui上services的instance的id var allServerDic = allServer.Response; var test1 = allServerDic; foreach (var item in test1) { string name = item.Value.Service;//服务名,就是注册的那个test1 string serverAddress = item.Value.Address; int serverPort = item.Value.Port; Console.WriteLine($"serverAddress:{serverAddress}==serverPort{serverPort}"); //我们可以在客户端启动的时候,调用一下consul来查找服务 //比如,我们可以在服务集合里查找 服务名叫test1的服务 然后在调用它 //这样,当服务器改变了test1的ip和端口,我们依然可以在集群里找他test1新的ip和端口了 Console.ReadKey();