基本介绍:
安装:
下载地址: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 </span>= Configuration[<span style="color: #800000;">"</span><span style="color: #800000;">ip</span><span style="color: #800000;">"</span>];<span style="color: #008000;">//</span><span style="color: #008000;">部署到不同服务器的时候不能写成127.0.0.1或者0.0.0.0,因为这是让服务消费者调用的地址</span> <span style="color: #0000ff;">int</span> port = <span style="color: #0000ff;">int</span>.Parse(Configuration[<span style="color: #800000;">"</span><span style="color: #800000;">port</span><span style="color: #800000;">"</span>]);<span style="color: #008000;">//</span><span style="color: #008000;">获取服务端口</span> <span style="color: #0000ff;">var</span> client = <span style="color: #0000ff;">new</span> ConsulClient(ConfigurationOverview); <span style="color: #008000;">//</span><span style="color: #008000;">回调获取</span> <span style="color: #0000ff;">string</span> serverId = <span style="color: #800000;">"</span><span style="color: #800000;">ServerNameFirst</span><span style="color: #800000;">"</span> +<span style="color: #000000;"> Guid.NewGuid(); </span><span style="color: #0000ff;">var</span> result = client.Agent.ServiceRegister(<span style="color: #0000ff;">new</span><span style="color: #000000;"> AgentServiceRegistration() { ID </span>= serverId,<span style="color: #008000;">//</span><span style="color: #008000;">服务编号保证不重复</span> Name = <span style="color: #800000;">"</span><span style="color: #800000;">MsgServer</span><span style="color: #800000;">"</span>,<span style="color: #008000;">//</span><span style="color: #008000;">服务的名称</span> Address = ip,<span style="color: #008000;">//</span><span style="color: #008000;">服务ip地址</span> Port = port,<span style="color: #008000;">//</span><span style="color: #008000;">服务端口</span> Check = <span style="color: #0000ff;">new</span> AgentServiceCheck <span style="color: #008000;">//</span><span style="color: #008000;">健康检查</span>
{
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后反注册
Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔,或者称为心跳间隔(定时检查服务是否健康)
HTTP = $"http://{ip}:{port}/api/Health",//健康检查地址
Timeout = TimeSpan.FromSeconds(5)//服务的注册时间
}
});lifetime.ApplicationStopping.Register(() </span>=><span style="color: #000000;"> { Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">注销方法</span><span style="color: #800000;">"</span><span style="color: #000000;">); client.Agent.ServiceDeregister(serverId).Wait();</span><span style="color: #008000;">//</span><span style="color: #008000;">服务停止时取消注册</span>
});
}
运行效果截图:
客户端:
简单介绍一个获取服务所有地址,然后打印并从其中随机选取一个进行请求并打印:
static List<string> Urls = new List<string>();</span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> Main(<span style="color: #0000ff;">string</span><span style="color: #000000;">[] args) { Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">开始输出当前所有服务地址</span><span style="color: #800000;">"</span><span style="color: #000000;">); Catalog_Nodes().GetAwaiter().GetResult(); </span><span style="color: #008000;">//</span><span style="color: #008000;">Console.WriteLine(HelloConsul().GetAwaiter().GetResult());</span> Console.WriteLine(<span style="color: #800000;">"</span><span style="color: #800000;">开始随机请求一个地址服务地址</span><span style="color: #800000;">"</span><span style="color: #000000;">); </span><span style="color: #0000ff;">int</span> index = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Random().Next(Urls.Count); </span><span style="color: #0000ff;">string</span> url =<span style="color: #000000;"> Urls[index]; </span><span style="color: #0000ff;">string</span> param = <span style="color: #800000;">""</span>;<span style="color: #008000;">//</span><span style="color: #008000;">这里是开始位置</span> param += <span style="color: #800000;">"</span><span style="color: #800000;">{</span><span style="color: #800000;">"</span><span style="color: #000000;">; param </span>+= <span style="color: #800000;">"</span><span style="color: #800000;">"</span><span style="color: #800000;">"</span> + <span style="color: #800000;">"</span><span style="color: #800000;">id</span><span style="color: #800000;">"</span> + <span style="color: #800000;">"</span><span style="color: #800000;">":"</span><span style="color: #800000;">"</span> + <span style="color: #800080;">5</span> + <span style="color: #800000;">"</span><span style="color: #800000;">",</span><span style="color: #800000;">"</span><span style="color: #000000;">; param </span>= param.TrimEnd(<span style="color: #800000;">'</span><span style="color: #800000;">,</span><span style="color: #800000;">'</span><span style="color: #000000;">); param </span>+= <span style="color: #800000;">"</span><span style="color: #800000;">}</span><span style="color: #800000;">"</span><span style="color: #000000;">; Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">请求的随机地址:</span><span style="color: #800000;">"</span> +<span style="color: #000000;"> url); </span><span style="color: #0000ff;">string</span> result = HttpClientHelpClass.PostResponse(url, param, <span style="color: #0000ff;">out</span> <span style="color: #0000ff;">string</span><span style="color: #000000;"> statusCode); Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">返回状态:</span><span style="color: #800000;">"</span> +<span style="color: #000000;"> statusCode); Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">返回结果:</span><span style="color: #800000;">"</span> +<span style="color: #000000;"> result); Console.ReadLine(); } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">async</span><span style="color: #000000;"> Task Catalog_Nodes() { </span><span style="color: #0000ff;">var</span> client = <span style="color: #0000ff;">new</span><span style="color: #000000;"> ConsulClient(); </span><span style="color: #0000ff;">var</span> nodeList = <span style="color: #0000ff;">await</span><span style="color: #000000;"> client.Agent.Services(); </span><span style="color: #0000ff;">var</span> url =<span style="color: #000000;"> nodeList.Response.Values; </span><span style="color: #0000ff;">foreach</span> (<span style="color: #0000ff;">var</span> item <span style="color: #0000ff;">in</span><span style="color: #000000;"> url) { </span><span style="color: #0000ff;">string</span> Address =<span style="color: #000000;"> item.Address; </span><span style="color: #0000ff;">int</span> port =<span style="color: #000000;"> item.Port; </span><span style="color: #0000ff;">string</span> name =<span style="color: #000000;"> item.Service; Console.WriteLine($</span><span style="color: #800000;">"</span><span style="color: #800000;">地址:{Address}:{port},name:{name}</span><span style="color: #800000;">"</span><span style="color: #000000;">); Urls.Add($</span><span style="color: #800000;">"</span><span style="color: #800000;">http://{Address}:{port}/api/Test</span><span style="color: #800000;">"</span><span style="color: #000000;">); } }</span></pre>
系列章节:
微服务系列文章主要介绍微服务所使用到的一些技术和一些技术示例:
原文地址:https://www.cnblogs.com/yanbigfeg/p/9199590.html