欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【Consul】服务发现在windows下简单使用(一)

程序员文章站 2022-04-12 16:51:43
系列章节: 微服务系列文章主要介绍微服务所使用到的一些技术和一些技术示例: 微服务——【Consul】服务发现在windows下简单使用(一) 微服务——【polly】微服务故障处理库(二) 微服务——动态代理AspectCore的使用(三) 微服务——网关Ocelot(四。待发布) 基本介绍: 安 ......

系列章节:

微服务系列文章主要介绍微服务所使用到的一些技术和一些技术示例:

  • 微服务——网关Ocelot(四。待发布)

基本介绍:

安装:

下载地址:https://www.consul.io/downloads.html

运行:

consul agent -dev

【Consul】服务发现在windows下简单使用(一)

显示这个界面说明已经开启成功。

页面显示:

然后访问8500端口就可以看到页面:

【Consul】服务发现在windows下简单使用(一)

 命令:

    consul members:输出当前服务的信息,显示的所有配置节点。

   install-package Consul:在vs项目中安装Consul

服务连接:

开启consul服务之后需要把现有的项目连接集群到consul服务,这时候需要在项目中注册服务(在startup.cs文件下的Configure方法):

【Consul】服务发现在windows下简单使用(一)
 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)//服务的注册时间
                }
            });
View Code

之后在增加一个回调方法:

回调方法是代表的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:当应用程序主机执行关机时触发。所有请求应该在这一点完成。关机将阻止此事件完成。

好了,我的英语确实不好,这些就是自动翻译的意思。不过也能让我们明白大概的意思。知道有这个东西我们就可以实现功能了完整代码:

【Consul】服务发现在windows下简单使用(一)
        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();//服务停止时取消注册
            });
        }
View Code

运行效果截图:

【Consul】服务发现在windows下简单使用(一)

 

 

客户端:

简单介绍一个获取服务所有地址,然后打印并从其中随机选取一个进行请求并打印:

【Consul】服务发现在windows下简单使用(一)
       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");
            }
        }
View Code