首页 > Python基础教程 >
-
C#教程之Consul服务发现在windows下简单使用
基本介绍:
安装:
下载地址:https://www.consul.io/downloads.html
运行:
consul agent -dev
显示这个界面说明已经开启成功。
页面显示:
然后访问8500端口就可以看到页面:
命令:
consul members:输出当前服务的信息,显示的所有配置节点。
install-package Consul:在vs项目中安装Consul
服务连接:
开启consul服务之后需要把现有的项目连接集群到consul服务,这时候需要在项目中注册服务(在startup.cs文件下的Configure方法):
String ip = Configuration["ip"];//部署到不同服务器的时候不能写成127.0.0.1或者0.0.0.0,因为这是让服务消费者调用的地址 int port = int.Parse(Configuration["port"]);//获取服务端口 var client = new ConsulClient(ConfigurationOverview); //回调获取 var result = client.Agent.ServiceRegister(new AgentServiceRegistration() { ID = "ServerNameFirst" + Guid.NewGuid(),//服务编号保证不重复 Name = "MsgServer",//服务的名称 Address = ip,//服务ip地址 Port = port,//服务端口 Check = new AgentServiceCheck //健康检查 { DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后反注册 Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔,或者称为心跳间隔(定时检查服务是否健康) HTTP = $"http://{ip}:{port}/api/Health",//健康检查地址 Timeout = TimeSpan.FromSeconds(5)//服务的注册时间 } });
之后在增加一个回调方法:
回调方法是代表的consul服务的地址配置。
private static void ConfigurationOverview(ConsulClientConfiguration obj) { //consul的地址 obj.Address = new Uri("http://127.0.0.1:8500"); //数据中心命名 obj.Datacenter = "dc1"; }
服务到这里已经是配置完毕。但是我们怎么注销服务哪。当然是有办法的拉。通过api我们可以知道ServiceDeregister方法是注销服务的方法。那么我们应该怎么写哪:
首先我们要去了解一下IApplicationLifetime接口:允许消费者在优雅关机期间执行清理工作
ApplicationStarted:当应用程序主机已完全启动并将要等待时触发
ApplicationStopping:当应用程序主机执行优美关机时触发。请求可能还在运行中。关闭将阻止此事件完成
ApplicationStopped:当应用程序主机执行关机时触发。所有请求应该在这一点完成。关机将阻止此事件完成。
好了,我的英语确实不好,这些就是自动翻译的意思。不过也能让我们明白大概的意思。知道有这个东西我们就可以实现功能了完整代码:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime lifetime) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseMvc(); String ip = Configuration["ip"];//部署到不同服务器的时候不能写成127.0.0.1或者0.0.0.0,因为这是让服务消费者调用的地址 int port = int.Parse(Configuration["port"]);//获取服务端口 var client = new ConsulClient(ConfigurationOverview); //回调获取 string serverId = "ServerNameFirst" + Guid.NewGuid(); var result = client.Agent.ServiceRegister(new AgentServiceRegistration() { ID = serverId,//服务编号保证不重复 Name = "MsgServer",//服务的名称 Address = ip,//服务ip地址 Port = port,//服务端口 Check = new AgentServiceCheck //健康检查 { DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后反注册 Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔,或者称为心跳间隔(定时检查服务是否健康) HTTP = $"http://{ip}:{port}/api/Health",//健康检查地址 Timeout = TimeSpan.FromSeconds(5)//服务的注册时间 } }); lifetime.ApplicationStopping.Register(() => { Console.WriteLine("注销方法"); client.Agent.ServiceDeregister(serverId).Wait();//服务停止时取消注册 }); }
运行效果截图:
客户端:
简单介绍一个获取服务所有地址,然后打印并从其中随机选取一个进行请求并打印:
static List<string> Urls = new List<string>(); static void Main(string[] args) { Console.WriteLine("开始输出当前所有服务地址"); Catalog_Nodes().GetAwaiter().GetResult(); //Console.WriteLine(HelloConsul().GetAwaiter().GetResult()); Console.WriteLine("开始随机请求一个地址服务地址"); int index = new Random().Next(Urls.Count); string url = Urls[index]; string param = "";//这里是开始位置 param += "{"; param += "\"" + "id" + "\":\"" + 5 + "\","; param = param.TrimEnd(','); param += "}"; Console.WriteLine("请求的随机地址:" + url); string result = HttpClientHelpClass.PostResponse(url, param, out string statusCode); Console.WriteLine("返回状态:" + statusCode); Console.WriteLine("返回结果:" + result); Console.ReadLine(); } public static async Task Catalog_Nodes() { var client = new ConsulClient(); var nodeList = await client.Agent.Services(); var url = nodeList.Response.Values; foreach (var item in url) { string Address = item.Address; int port = item.Port; string name = item.Service; Console.WriteLine($"地址:{Address}:{port},name:{name}"); Urls.Add($"http://{Address}:{port}/api/Test"); } }