基本介绍:

安装:

下载地址: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>=&gt;<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

Consul服务发现在windows下简单使用的更多相关文章

  1. 【微服务No.1】Consul服务发现在windows下简单使用

    基本介绍: 安装: 下载地址:https://www.consul.io/downloads.html 运行: consul agent -dev 显示这个界面说明已经开启成功. 页面显示: 然后访问 ...

  2. windows下简单的缓冲区溢出

    缓冲区溢出是什么? 当缓冲区边界限制不严格时,由于变量传入畸形数据或程序运行错误,导致缓冲区被“撑爆”,从而覆盖了相邻内存区域的数据 成功修改内存数据,可造成进程劫持,执行恶意代码,获取服务器控制权等 ...

  3. windows下简单安装postgres

    目前版本是PostgreSQL 9.6,它经过以下平台认证: 32位Windows Windows 7,8和10 Windows 2008 Server 64位Windows Windows 7,8和 ...

  4. (一)Memcached初学教程之安装服务篇(Windows下)

    1.下载Memcached的Windows服务安装程序(备注:memcached官网:http://memcached.org/ ,没有提供windows下的安装包,只有UNIX下的安装包,我们这里用 ...

  5. CentOS7下rsync服务端与Windows下cwRsync客户端实现数据同步配置方法

    最近需求想定期备份服务器d盘的数据到Linux服务器上面,做个笔记顺便写下遇到的问题 以前整过一个win下的cwrsync(客户端)+rsync(服务端:存储)的bat脚本 和整过一个Linux下的r ...

  6. linux下启动mysql服务(类似于windows下net start mysql)

    1.linux系统启动方式:service mysql start.其类似于windows下net start mysql

  7. windows下简单验证码识别——完美验证码识别系统

    此文已由作者徐迪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 讲到验证码识别,大家第一个可能想到tesseract.诚然,对于OCR而言,tesseract确实很强大,自带 ...

  8. windows下简单配置squid反向代理服务器

    下载windwosNT版本的squid下载地址: http://squid.acmeconsulting.it/download/squid-2.6.STABLE13-bin.zip 1.把squid ...

  9. windows下简单配置apache

    不得不做个笔记,不然每次配置都记不清楚... 详细的配置朋友这边写的很好.地址 # 对 PHP 4 LoadModule php4_module "c:/php/php4apache2.dl ...

随机推荐

  1. aspnet:MaxHttpCollectionKeys 不起作用

    场景: vs2010  webform  表单域长度,在webconfig中加入该节点,有的项目起作用,有的项目无效,不知道是什么原因??

  2. TCP大文件上传与UDP协议

    一.UCP大文件上传(解决粘包问题) ①客户端 import socket, os, json, struct client = socket.socket() client.connect(('12 ...

  3. Codechef TRIPS Children Trips (分块、倍增)

    题目链接: https://www.codechef.com/problems/TRIPS 感觉CC有点毒瘤啊.. 题解: 首先有一个性质可能是因为太傻所以网上没人解释,然而我看了半天: 就是正序和倒 ...

  4. java8 for循环了改为 流

    刚开始用java8的时候,很多都是替代for循环,因为java8推出了强大的流stream,关于流的用法很多,百度一下就可以搜到语法之类,所以这里我只想举一些简单替代for的例子,含义那些就自己去查吧 ...

  5. tomcat打开失败原因

    我重装系统以后,tomcat无法打开,原因是有的项目的虚拟路径有误 到server.xml下修改虚拟路径

  6. gunicorn+nginx配置方法

    对于gunicorn+nginx的配置,理解他们之间的关系很重要,以及最后如何确认配置结果是正确的也很重要 nginx 配置文件: 修改这个配置文件有3个用处: 假设服务器本身的Ip是A称为ip-A, ...

  7. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_2 连接池介绍

  8. 未解决:found 1 high severity vulnerability run `npm audit fix` to fix them, or `npm audit` for details

    问题出现: 在通过 `ng new hello-world` 命令新建项目时,项目出现以下警告: found high severity vulnerability run `npm audit fi ...

  9. Gradle之Android Gradle Plugin 主要流程分析(二)

    [Android 修炼手册]Gradle 篇 -- Android Gradle Plugin 主要流程分析 预备知识 理解 gradle 的基本开发 了解 gradle task 和 plugin ...

  10. SpringCloud:(一)服务注册与发现

    最近跟着方志明老师学习SpringCloud,博客地址如下: https://blog.csdn.net/forezp/article/details/81040925 自己也跟着撸了一遍,纸上得来终 ...