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 </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(),//服务启动多久后反注册
Interval = TimeSpan.FromSeconds(),//健康检查时间间隔,或者称为心跳间隔(定时检查服务是否健康)
HTTP = $"http://{ip}:{port}/api/Health",//健康检查地址
Timeout = TimeSpan.FromSeconds()//服务的注册时间
}
});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>

系列章节:
微服务系列文章主要介绍微服务所使用到的一些技术和一些技术示例:
- 微服务——微服务的介绍和目录
- 微服务——【Consul】服务发现在windows下简单使用(一)
- 微服务——【polly】微服务故障处理库(二)
- 微服务——动态代理AspectCore的使用(三)
- 微服务——网关Ocelot+Consul实现集群轮询(四)
原文地址:https://www.cnblogs.com/yanbigfeg/p/9199590.html
Consul服务发现在windows下简单使用的更多相关文章
- 【微服务No.1】Consul服务发现在windows下简单使用
基本介绍: 安装: 下载地址:https://www.consul.io/downloads.html 运行: consul agent -dev 显示这个界面说明已经开启成功. 页面显示: 然后访问 ...
- windows下简单的缓冲区溢出
缓冲区溢出是什么? 当缓冲区边界限制不严格时,由于变量传入畸形数据或程序运行错误,导致缓冲区被“撑爆”,从而覆盖了相邻内存区域的数据 成功修改内存数据,可造成进程劫持,执行恶意代码,获取服务器控制权等 ...
- windows下简单安装postgres
目前版本是PostgreSQL 9.6,它经过以下平台认证: 32位Windows Windows 7,8和10 Windows 2008 Server 64位Windows Windows 7,8和 ...
- (一)Memcached初学教程之安装服务篇(Windows下)
1.下载Memcached的Windows服务安装程序(备注:memcached官网:http://memcached.org/ ,没有提供windows下的安装包,只有UNIX下的安装包,我们这里用 ...
- CentOS7下rsync服务端与Windows下cwRsync客户端实现数据同步配置方法
最近需求想定期备份服务器d盘的数据到Linux服务器上面,做个笔记顺便写下遇到的问题 以前整过一个win下的cwrsync(客户端)+rsync(服务端:存储)的bat脚本 和整过一个Linux下的r ...
- linux下启动mysql服务(类似于windows下net start mysql)
1.linux系统启动方式:service mysql start.其类似于windows下net start mysql
- windows下简单验证码识别——完美验证码识别系统
此文已由作者徐迪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 讲到验证码识别,大家第一个可能想到tesseract.诚然,对于OCR而言,tesseract确实很强大,自带 ...
- windows下简单配置squid反向代理服务器
下载windwosNT版本的squid下载地址: http://squid.acmeconsulting.it/download/squid-2.6.STABLE13-bin.zip 1.把squid ...
- windows下简单配置apache
不得不做个笔记,不然每次配置都记不清楚... 详细的配置朋友这边写的很好.地址 # 对 PHP 4 LoadModule php4_module "c:/php/php4apache2.dl ...
随机推荐
- const与#define的区别
1.const (1)为什么需要const成员函数? C中常用:“ #define 变量名 变量值”定义一个值替代,然而却有个致命缺点:缺乏类型检测机制,这样预处理在C++中成为可能引发错误的隐患,于 ...
- Spring Boot教程(十四)快速入门
快速入门 本章主要目标完成Spring Boot基础项目的构建,并且实现一个简单的Http请求处理,通过这个例子对Spring Boot有一个初步的了解,并体验其结构简单.开发快速的特性. 系统要求: ...
- C# Socket-TCP异步编程原理详解附源码
目录 目录异步原理主要方法源码Server源码:Client源码实验效果(广播为例)参考博客 TOC 异步原理 套接字编程原理:延续文件作用思想,打开-读写-关闭的模式. C/S编程模式如下: Ø 服 ...
- 后盾网lavarel视频项目---phpstorm 配置ftp, 自动更新同步代码
后盾网lavarel视频项目---phpstorm 配置ftp, 自动更新同步代码 一.总结 一句话总结: 1.在phpstorm中设置:路径Tools/Deployment/Configuratio ...
- ffmpeg转码指南
Windows下面的安装: 浏览器打开https://ffmpeg.zeranoe.com/builds/ 选择好版本,位数如果不确定的话就下载32bit的,然后选择static,然后下载 下载完成后 ...
- 提示标签title折行
使用代码换行共两种代码,均可实现html标签内title内容显示时换行.换行代码符分别为:“ ”和“ ”以上符合数字输入均必须英文半角模式输入.使用时候,在需要换行地方任选一种(组)换行符号代码即可.
- ACL 2019 分析
ACL 2019 分析 word embedding 22篇! Towards Unsupervised Text Classification Leveraging Experts and Word ...
- JS实现数组排序:升序和降序
如果指明了 compareFunction ,那么数组会按照调用该函数的返回值排序.即 a 和 b 是两个将要被比较的元素: 如果 compareFunction(a, b) 小于 0 ,那么 a 会 ...
- 使用C#分层查询多个表数据
下面我来给大家叙述一下视野分层加载多张表数据: 首先创建一个StudentExtends类: 在DAL层studentDAL类写如下代码: 在BLL层写如下代码,引用DAL层的LoadStudentI ...
- django连接和游标
连接和游标主要实现 PEP 249中描述的Python DB API标准——除非它涉及到事务处理. 如果你不熟悉Python DB-API,注意cursor.execute()中的SQL语句使用占位符 ...