【微服务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(),//服务启动多久后反注册
Interval = TimeSpan.FromSeconds(),//健康检查时间间隔,或者称为心跳间隔(定时检查服务是否健康)
HTTP = $"http://{ip}:{port}/api/Health",//健康检查地址
Timeout = TimeSpan.FromSeconds()//服务的注册时间
}
});
之后在增加一个回调方法:
回调方法是代表的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(),//服务启动多久后反注册
Interval = TimeSpan.FromSeconds(),//健康检查时间间隔,或者称为心跳间隔(定时检查服务是否健康)
HTTP = $"http://{ip}:{port}/api/Health",//健康检查地址
Timeout = TimeSpan.FromSeconds()//服务的注册时间
}
}); 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" + "\":\"" +  + "\",";
            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");
            }
        }
系列章节:
微服务系列文章主要介绍微服务所使用到的一些技术和一些技术示例:
- 微服务——微服务的介绍和目录
 - 微服务——【Consul】服务发现在windows下简单使用(一)
 - 微服务——【polly】微服务故障处理库(二)
 - 微服务——动态代理AspectCore的使用(三)
 - 微服务——网关Ocelot+Consul实现集群轮询(四)
 
【微服务No.1】Consul服务发现在windows下简单使用的更多相关文章
- Consul服务发现在windows下简单使用
		
目录 基本介绍: 服务连接: 客户端: 系列章节: 回到顶部 基本介绍: 安装: 下载地址:https://www.consul.io/downloads.html 运行: consul agent ...
 - 微服务(入门三):netcore ocelot  api网关结合consul服务发现
		
简介 api网关是提供给外部调用的统一入口,类似于dns,所有的请求统一先到api网关,由api网关进行指定内网链接. ocelot是基于netcore开发的开源API网关项目,功能强大,使用方便,它 ...
 - .NET Core微服务之基于Consul实现服务治理
		
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Consul基础介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发 ...
 - .NET Core微服务之基于Consul实现服务治理(续)
		
Tip: 此篇已加入.NET Core微服务基础系列文章索引 上一篇发布之后,很多人点赞和评论,不胜惶恐,这一篇把上一篇没有弄到的东西补一下,也算是给各位前来询问的朋友的一些回复吧. 一.Consul ...
 - ASP.NET Core 微服务初探[1]:服务发现之Consul
		
ASP.NET Core 微服务初探[1]:服务发现之Consul 在传统单体架构中,由于应用动态性不强,不会频繁的更新和发布,也不会进行自动伸缩,我们通常将所有的服务地址都直接写在项目的配置文件 ...
 - 微服务~Consul服务注册与发现
		
服务发现是基于微服务架构的关键原则之一.尝试配置每个客户端或某种形式的约定可能非常困难,可以非常脆弱.Consul通过HTTP API和DNS提供服务发现服务.Spring Cloud Consul利 ...
 - Spring Cloud 微服务一:Consul注册中心
		
Consul介绍 Consul is a service mesh solution providing a full featured control plane with service disc ...
 - (转)微服务_.NET Core Consul服务发现与治理
		
原文地址:https://www.cnblogs.com/waynechan/p/9354909.html Consul官网:https://www.consul.io Consul下载地址:http ...
 - Python微服务实践-集成Consul配置中心
		
A litmus test for whether an app has all config correctly factored out of the code is whether the co ...
 
随机推荐
- bzoj2730(割点+分类讨论)
			
把割点删去后,剩下的联通块个数就是答案,方案数就是siz乘一起,但要讨论一些特殊情况,没有割点时答案直接算,一个联通块如果连接多个割点是不需算入答案的: #include<iostream> ...
 - 通配符的匹配很全面, 但无法找到元素 'xxxxxxxx'
			
首先,一般配置通配符之前,你都会有如下xml头吧 <beans xmlns="http://www.springframework.org/schema/beans" xml ...
 - css基础回顾
			
1.css选择器分类: id选择器,类选择器,通用选择器, 包含(后代)选择器——加入空格,用于选择指定标签元素下的后辈元素. 子选择器(大于符号)——用于指定标签元素的第一代子元素. 伪类选择器—— ...
 - Firewalld的结构
			
原文地址:http://www.excelib.com/article/287/show firewalld简介 Centos7中默认将原来的防火墙iptables升级为了firewalld,fire ...
 - C#基础笔记
			
第一章: 1.C#创建程序的基本结构 class 类名 { static void Main(string[]args) { } } 注意:1)namespace2)using3)类名命名规则:字母. ...
 - 【sql注入】浅谈sql注入中的Post注入
			
[sql注入]浅谈sql注入中的Post注入 本文来源:i春秋学院 00x01在许多交流群中,我看见很多朋友对于post注入很是迷茫,曾几何,我也是这样,因为我们都被复杂化了,想的太辅助了所以导致现在 ...
 - Java 中的锁机制
			
多个进程或线程同时(或着说在同一段时间内)访问同一资源会产生并发(线程安全)问题.解决并发问题可以用锁. java的内置锁: 每个java对象都可以用做一个实现同步的锁,这些锁称为内置锁.线程进入同步 ...
 - 项目文件与 SVN 资源库同步提示错误 Attempted to lock an already-locked dir
			
问题描述 之前为了图方便,在eclipse中直接把三个jsp文件复制到了eclipse中我新建的一个文件夹中,把svn版本号信息也带过来了,然后我又删除了这三个jsp文件,接着先把这三个jsp复制到桌 ...
 - 整理+学习《骆昊-Java面试题全集(中)》
			
这部分主要是与Java Web和Web Service相关的面试题. 96.阐述Servlet和CGI的区别? 答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式运行 ...
 - Word文档使用密码加密
			
Word文档使用密码加密 方法如下: 文件-->信息-->保护文档-->用密码进行加密-->设置密码