.NET Core微服务实施之Consul服务发现与治理
.NET Core微服务实施之Consul服务发现与治理

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}");
}


出处: http://www.cnblogs.com/waynechan
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果你觉得本文写得不错,请点击右下角的推荐按钮,如果觉得本文有所欠缺,请评论或联系我!
.NET Core微服务实施之Consul服务发现与治理的更多相关文章
- (转)微服务_.NET Core Consul服务发现与治理
原文地址:https://www.cnblogs.com/waynechan/p/9354909.html Consul官网:https://www.consul.io Consul下载地址:http ...
- Redola.Rpc 集成 Consul 服务发现
Redola.Rpc 解决了什么问题? Redola.Rpc 是一个使用 C# 开发的 RPC 框架,代码开源在 GitHub 上.目前版本仅支持 .NET Framework 4.6 以上版本,未来 ...
- 基于Docker的Consul服务发现集群搭建
在去年的.NET Core微服务系列文章中,初步学习了一下Consul服务发现,总结了两篇文章.本次基于Docker部署的方式,以一个Demo示例来搭建一个Consul的示例集群,最后给出一个HA的架 ...
- 扩展gRPC支持consul服务发现和Polly策略
gRPC由于需要用工具生成代码实现,可开发性不是很高,在扩展这方面不是很友好 最近研究了下,进行了扩展,不需要额外的工具生成,直接使用默认Grpc.Tools生成的代理类即可 相关源码在文章底部 客户 ...
- 微服务(入门三):netcore ocelot api网关结合consul服务发现
简介 api网关是提供给外部调用的统一入口,类似于dns,所有的请求统一先到api网关,由api网关进行指定内网链接. ocelot是基于netcore开发的开源API网关项目,功能强大,使用方便,它 ...
- .NetCore Cap 注册 Consul 服务发现
注册服务发现 需要使用Cap中的UseDiscovery方法 具体用法如下 var capConsulConfig = Configuration.GetSection("CapConsul ...
- 学习搭建 Consul 服务发现与服务网格-有丰富的示例和图片
目录 第一部分:Consul 基础 1,Consul 介绍 2,安装 Consul Ubuntu/Debian 系统 Centos/RHEL 系统 检查安装 3,运行 Consul Agent 启动 ...
- 鹅长微服务发现与治理巨作PolarisMesh实践-上
@ 目录 概述 定义 核心功能 组件和生态 特色亮点 解决哪些问题 官方性能数据 架构原理 资源模型 服务治理 基本原理 服务注册 服务发现 安装 部署架构 集群安装 SpringCloud应用接入 ...
- (4).NET CORE微服务 Micro-Service ---- Consul服务发现和消费
上一章说了 Consul服务注册 现在我要连接上Consul里面的服务 请求它们的API接口 应该怎么做呢? 1.找Consul要一台你需要的服务器 1.1 获取Consul下的所有注册的服务 u ...
随机推荐
- 远程过程调用概述-RMI简介
简介: RPC是远程过程调用(Remote Procedure Call)的缩写形式.SAP系统RPC调用的原理其实很简单,有一些类似于三层构架的C/S系统,第三方的客户程序通过接口调用SAP内部的标 ...
- jQuery 练习:取出数组字典的值, 静态对话框, clone方法应用
jQuery 中文API文档 http://jquery.cuishifeng.cn/ jQuery 取出数组字典的值 <head> <meta charset="UTF- ...
- BZOJ3028: 食物(生成函数)
题意 链接 Sol 生成函数入门题. 对每个物品分别列一下,化到最后是\(\frac{x}{(1-x)^4}\) 根据广义二项式定理,最后答案是\(C_{(N - 1) + 4 - 1}^{4-1} ...
- js替换字符中的斜杠反斜杠
var reg=/\\|\//g; var a="a\a\\a/b" alert(a.replace(reg,"-"));
- [新特性]PeopleTools8.54+:PeopleSoft Application Engine新特性
PeopleTools 8.54 的Application Engine 已经被更新,特别是在AE跟踪设置中有了更多的选项,本文将帮助您了解8.54的新AE特性以及如何使用这些特性. AE trace ...
- ViewPager结合Fragment进行无限滑动
实现ViewPager结合Fragment实现无限循环切换,这里也是在适配器里面进行的,当然使用滑动监听也能够实现 import android.support.v4.app.Fragment; im ...
- Android为TV端助力 post带数据请求方式,传递的数据格式包括json和map
如下: public static String httpPost(String url, String json) { try { URL u = new URL(url); HttpURLConn ...
- 添加/删除/修改Windows 7右键的“打开方式”
右键菜单添加/删除"打开方式" 此"打开方式"非系统的"打开方式",二者可以并存. 右键菜单添加"打开方式" 在HKEY ...
- (后端)JackSon将java对象转换为JSON字符串(转)
转载小金金金丶园友: JackSon可以将java对象转换为JSON字符串,步骤如下: 1.导入JackSon 的jar包 2.创建ObjectMapper对象 3.使用ObjectMapper对象的 ...
- web前端(2)—— 前端技术介绍
前端技术 前文了解了什么是前端,那么前端技术到底有哪些呢?最核心的就这三个: html/html5 css/css3 javascript 什么是HTML HyperText Markup Langu ...