• 【微服务No.1】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)//服务的注册时间
                    }
                });
    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:当应用程序主机执行关机时触发。所有请求应该在这一点完成。关机将阻止此事件完成。

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

            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

    运行效果截图:

    客户端:

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

           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

    系列章节:

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

  • 相关阅读:
    Mysql 之导入导出
    Go gin之文件上传
    记录Go gin集成发送邮件接口的坑
    关于mysql某个用户无法登陆的情况
    面向对象程序设计的分析基本步骤
    提示框判断事件
    事件响应的公共方法
    IComparable<T>.CompareTo(T) 方法
    浏览器缓存机制
    PHP中include和require
  • 原文地址:https://www.cnblogs.com/yanbigfeg/p/9199590.html
Copyright © 2020-2023  润新知