(转)微服务_.NET Core Consul服务发现与治理
原文地址:https://www.cnblogs.com/waynechan/p/9354909.html
Consul官网:https://www.consul.io
Consul下载地址:https://www.consul.io/downloads.html
Consul nuget 命令:Install-Package Consul
我的理解是,Consul是一个服务管理者,系统中所有使用到的服务他都帮你管理好,促销高峰需要新增服务的时候,服务开启来就自动注册到Consul中,服务下线关闭,也自动从Consul注销,无缝衔接,对于使用者来说,你只需要跟Consul说我要某某某服务,Consul就会返回当前在Consul上注册的可用的服务给回你,你也无需像以前那样将服务的地址配置在系统当中,就好像DNS服务器那样,你输入域名,DNS服务器返回其中一个IP地址给你,然后你就可以正常访问, 另外在集群环境下选择服务的策略交给调用方,你可以选择随机、轮询、权重等方式,具体视乎你的需求。
一、Windows系统启动Consul
这里以Windows系统进行演示,实际项目中可以搭建在Linux上,下载到本地之后解压,使用命令行模式进入到Consul目录,输入命令启动Consul服务:
consul.exe agent -dev
启动Consul成功,命令行信息中显示,可以使用地址: http://127.0.0.1:8500 打开UI管理界面进行查看管理操作。
二、.NET Core+Consul 演示
1、新建一个ASP.NET Core Web 应用程序,nuget安装Consul:Install-Package Consul
2、增加用于Consul健康监测的Controller,这里就是一个简单的Controller、Action,能正常被访问即可。
namespace MsgService.Controllers
{
[Produces("application/json")]
[Route("api/Health")]
public class HealthController : Controller
{
[HttpGet]
public IActionResult Get()
{
Console.WriteLine("健康检查" + DateTime.Now);
return Content("ok");
}
}
}
3、修改应用程序站点的Startup类 ,在函数Configure 中增加多一个参数 IApplicationLifetime appLifeTime,然后在Configure函数中增加注册、注销的代码,这段代码的意思是,当应用程序站点启动或者注销的时候,就会对Consul进行消息通知。这里ConsulConfig方法里写死了我本机运行的Consul地址:http://127.0.0.1:8500,实际项目中肯定是要做成配置的。
//Consul 新增 IApplicationLifetime appLifeTime参数
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime appLifeTime)
{
//注册Consul
string ip = Configuration["ip"];
string port = Configuration["port"];
string serviceName = "MsgService";
string serviceId = serviceName + Guid.NewGuid();
using (var consulClient = new ConsulClient(ConsulConfig))
{
AgentServiceRegistration asr = new AgentServiceRegistration
{
Address = ip,
Port = Convert.ToInt32(port),
ID = serviceId,
Name = serviceName,
Check = new AgentServiceCheck
{
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),
HTTP = $"http://{ip}:{port}/api/Health",
Interval = TimeSpan.FromSeconds(10),
Timeout = TimeSpan.FromSeconds(5),
},
};
consulClient.Agent.ServiceRegister(asr).Wait();
} //注销Consul
appLifeTime.ApplicationStopped.Register(() =>
{
using (var consulClient = new ConsulClient(ConsulConfig))
{
Console.WriteLine("应用退出,开始从consul注销");
consulClient.Agent.ServiceDeregister(serviceId).Wait();
}
});
} //Consul 配置委托
private void ConsulConfig(ConsulClientConfiguration config)
{
config.Address = new Uri("http://127.0.0.1:8500"); //Demo硬编码Consul的地址
config.Datacenter = "dc1";
}
4、修改应用程序站点的Program.BuildWebHost 方法,目的是方便我们在web应用程序bin目录下以指定的IP地址、指定的端口启动服务
/// <summary>
/// 设置NetCore监听端口取命令行中的参数
/// </summary>
/// <param name="args"></param>
/// <returns></returns>
public static IWebHost BuildWebHost(string[] args)
{
var config = new ConfigurationBuilder()
.AddCommandLine(args)
.Build();
string ip = config["ip"];
string port = config["port"];
Console.WriteLine($"ip={ip},port={port}");
return WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseUrls($"http://{ip}:{port}")
.Build();
}
5、启动服务
打开应用程序目录定位在bin目录下,使用命令行模式输入命令,以指定的IP、指定的端口启动服务, 一切正常的话,在consul管理界面可以看到已经注册上的服务信息。
这里只注册一个服务进行演示,在实际微服务项目中,肯定是集群环境的,比如同一个服务,你有4台机器,那consul上就注册了4个,服务名字都是一样的,只是URL地址不一样,当遇上促销的时候,服务压力比较大,这时候当要加多一台服务器,新的服务就自动加到consul上来,消费者就从consul取其中一个服务进行调用。
dotnet 【应用程序.dll】 --ip 127.0.0.1 --port 6001
三、服务消费
1、新建一个.NET Core 控制台应用程序;
2、nuget安装Consul组件;
3、取出已经在Consul注册的全部服务
static void Main(string[] args)
{ using (var consul = new Consul.ConsulClient(c =>
{
c.Address = new Uri("http://127.0.0.1:8500");
}))
{
//取在Consul注册的全部服务
var services = consul.Agent.Services().Result.Response;
foreach (var s in services.Values)
{
Console.WriteLine($"ID={s.ID},Service={s.Service},Addr={s.Address},Port={s.Port}");
}
} Console.ReadKey();
}
}
现在在Consul已经注册了3个MsgService服务,打印在控制台上。
4、随机从注册的服务中取出其中一个服务
当我们在consul上注册了N个相同的服务之后,我们肯定不能每次都选取某一个服务的,不然得累死那台服务,而其他服务却是空闲的状态,因此我们加入随机选取的逻辑,从注册的N个服务中,随机选取其中一个服务,另外还有其他比如轮询,权重等等的策略,使得我们更灵活的调用服务。
using (var consul = new Consul.ConsulClient(c =>
{
c.Address = new Uri("http://127.0.0.1:8500"); //Consul地址
}))
{
//取出全部的MsgService服务
var services = consul.Agent.Services().Result.Response.Values.Where(p => p.Service.Equals("MsgService", StringComparison.OrdinalIgnoreCase)); //客户端负载均衡,随机选出一台服务
Random rand = new Random();
var index = rand.Next(services.Count());
var s = services.ElementAt(index);
Console.WriteLine($"Index={index},ID={s.ID},Service={s.Service},Addr={s.Address},Port={s.Port}");
}
5、服务调用
//向服务发送请求
using (var httpClient = new HttpClient())
using (var httpContent = new StringContent("{phoneNum:'119',msg:'help me'}", Encoding.UTF8, "application/json"))
{
var result = httpClient.PostAsync($"http://{s.Address}:{s.Port}/api/SMS/Send_LX", httpContent);
Console.WriteLine($"调用{s.Service},状态:{result.Result.StatusCode}");
}
其它参考资料
1)https://www.cnblogs.com/xuanye/p/10223924.html
2) 健康检测https://www.cnblogs.com/duanxz/p/9662862.html
3)https://www.cnblogs.com/Leo_wl/p/9142530.html
4)https://www.cnblogs.com/alan-lin/p/9403762.html
(转)微服务_.NET Core Consul服务发现与治理的更多相关文章
- 【微服务No.1】Consul服务发现在windows下简单使用
基本介绍: 安装: 下载地址:https://www.consul.io/downloads.html 运行: consul agent -dev 显示这个界面说明已经开启成功. 页面显示: 然后访问 ...
- 搭建私人通讯录/日历同步服务_使用cardDAV/calDAV服务
搭建私人通讯录/日历同步服务_使用cardDAV/calDAV服务 转载注明来源: 本文链接 来自osnosn的博客,写于 2020-02-18. Radicale, Radicale (对cardd ...
- .net core consul 服务配置 服务发现 服务健康检测 服务变更加载
准备环境 安装consul之后 1. 创建一个.net core webapi 举例为UsercenterService 2. nuget引用Consul组件 https://github.com/ ...
- Consul服务发现在windows下简单使用
目录 基本介绍: 服务连接: 客户端: 系列章节: 回到顶部 基本介绍: 安装: 下载地址:https://www.consul.io/downloads.html 运行: consul agent ...
- .NET5 API 网关Ocelot+Consul服务注册
1|0网关介绍 网关其实就是将我们写好的API全部放在一个统一的地址暴露在公网,提供访问的一个入口.在 .NET Core下可以使用Ocelot来帮助我们很方便的接入API 网关.与之类似的库还有Pr ...
- ASP.NET Core Windows服务开发技术实战演练
一.课程介绍 人生苦短,我用.NET Core!大家都知道如果想要程序一直运行在Windows服务器上,最好是把程序写成Windows服务程序:这样程序会随着系统的自动启动而启动,自动关闭而关闭,不需 ...
- (4).NET CORE微服务 Micro-Service ---- Consul服务发现和消费
上一章说了 Consul服务注册 现在我要连接上Consul里面的服务 请求它们的API接口 应该怎么做呢? 1.找Consul要一台你需要的服务器 1.1 获取Consul下的所有注册的服务 u ...
- (4)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Consul服务发现和消费
上一章说了 Consul服务注册 现在我要连接上Consul里面的服务 请求它们的API接口 应该怎么做呢? 1.找Consul要一台你需要的服务器 1.1 获取Consul下的所有注册的服务 u ...
- .NET Core微服务实施之Consul服务发现与治理
.NET Core微服务实施之Consul服务发现与治理 Consul官网:https://www.consul.io Consul下载地址:https://www.consul.io/downl ...
随机推荐
- 关于lct维护动态生成树问题
水管局长数据加强版 题意是要求维护一棵最小生成树,支持删边操作. 删边操作比较难处理,因为如果删掉树上的边, 很难从已经有备选集合中找出连接不同联通块的最小的边. 然而题目并没有要求在线. 所以离线. ...
- Octopus501工作站 安装记录
cmake libreadline-dev 没有运行程序,nvidia-smi查看GPU-Util 达到100% 解决方案:需要把驱动模式设置为常驻内存才可以,设置命令:nvidia-smi -pm ...
- Spark2.x(六十三):(Spark2.4)Driver如何把Task(闭包等)分配给Executor
在Spark中一个appliation可能包含多个job,每个job都是由SparkContext#runJob(...)触发的,一个Job下包含1个或多个Stage,Job的最后一个stage为Re ...
- BaiduPCS-Go的安装及使用
BaiduPCS-Go的安装及使用 linux下会提示输入验证码,浏览器打开验证码url,多输入几次 Contents [hide] 一. 软件下载及安装 二. 软件的使用 1. 账号登录与退出 2. ...
- docker 镜像制作(jupyter)
docker pull centosdocker run -it -d --name test-centos1 centosdocker exec -it test-centos1 /bin/bash ...
- 审阅模式中word保存不了
word保存不了 觉得有用的话,欢迎一起讨论相互学习~Follow Me 昨天写论文出现一个怪事,发现自己word内容按ctrl+S 进行保存时可以的,但是当按X进行关闭时,出现 关闭不了,问我是否需 ...
- kafka中的配额管理(限速)机制
kafka支持配额管理,从而可以对Producer和Consumer的produce&fetch操作进行流量限制,防止个别业务压爆服务器.本文主要介绍如何使用kafka的配额管理功能. 1 K ...
- 工控随笔_22_关于Profibus网络接线的规则
最近在做一个项目调试,用的是西门子的PLC,416-2 DP,下面挂了几个DP子网,在进行现场网络测试的时候,有几个走的DP网络的 绝对值编码器,无论怎么弄DP网络不能联通. 一开始我以为DP网线接的 ...
- EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器开放平台利用 webpack 打包压缩后端代码
需求背景 javaScript的用途是解决页面交互和数据交互,最终目的是丰富客户端效果以及数据的有效传递. 并且具有良好的用户体验. javaScript可以快速实现页面交互,即js操作html的do ...
- hive 集群搭建
软件环境:centos7 + hadoop2.7.6 1.hive 下载 apache-hive-2.1.0-bin.tar.gz 2.copy apache-hive-2.1.0-bin.tar. ...