Consul服务治理发现学习记录
Consul 简介
Consul是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控)解决方案,它是一个一个分布式的,高度可用的系统,而且开发使用都很简便。它提供了一个功能齐全的控制平面,主要特点是:服务发现、健康检查、键值存储、安全服务通信、多数据中心。除了 Consul 之外,还有 Eureka、Zookeeper 等类似软件。
安装Consul
我们这里是直接在Windows上开发,所以对应下载Windows版本的。下载地址:
下载完成后实际就是consul.exe,我们在下载位置运行cmd命令
consul agent -dev

然后我们打开浏览器,输入http://localhost:8500/

可以看到Consul已经启动了,但是除了他自己外还没有其他服务注册进来。
服务注册
我们创建一个Api项目,比如订单服务OrderService。

安装Consul

健康检查
创建完成后就是默认的项目结构,我们添加一个健康检查的Controller。健康检查的意思是Consul会根据我们的配置定时的去请求健康检查接口,判断当前服务是不是可用。避免提供挂掉的服务给消费者,当然间隔时间也会有,需要配合后面的熔断、降级使用。
using System;
using Microsoft.AspNetCore.Mvc;
namespace Consul.OrderService.Controllers
{
[ApiController]
[Route("[controller]")]
public class HealthController : ControllerBase
{
public IActionResult Get()
{
Console.WriteLine("调用了健康检查" + DateTime.Now);
return Ok("OK");
}
}
}
调用时我们输出下当前时间,可以看到Consul有没有调用健康检查。
服务注册及注销
因为这里需要指定Api的地址,所以我们配置一下获取配置。
修改Program.cs
public static IHostBuilder CreateHostBuilder(string[] args)
{
var config = new ConfigurationBuilder().AddCommandLine(args).Build();
string ip = config["ip"];
string port = config["port"];
return Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>()
.UseUrls($"http://{ip}:{port}");
});
}
修改Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,IHostApplicationLifetime applicationLifetime)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
string ip = Configuration["ip"];
int port = Convert.ToInt32(Configuration["port"]);
string serveiceName = "OrderService";
string serviceId = serveiceName + Guid.NewGuid();
using (var consulClient = new ConsulClient(ConsulConfig))
{
AgentServiceRegistration agentServiceRegistration = new AgentServiceRegistration();
//服务编号,不能重复,用 Guid 最简单
agentServiceRegistration.ID = serviceId;
//服务的名字
agentServiceRegistration.Name = serveiceName;
//服务提供者的能被消费者访问的 ip 地址(可以被其他应用访问的 地址,本地测试可以用 127.0.0.1,机房环境中一定要写自己的内网 ip 地址)
agentServiceRegistration.Address = ip;
// 服务提供者的能被消费者访问的端口
agentServiceRegistration.Port = port;
agentServiceRegistration.Check = new AgentServiceCheck()
{
//服务停止多久 后反注册(注销)
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),
//健康检查时间间隔,或者称为心跳 间隔
Interval = TimeSpan.FromSeconds(10),
//健康检查地址
HTTP = $"http://{ip}:{port}/health",
Timeout = TimeSpan.FromSeconds(5)
};
//注册服务到 Consul
consulClient.Agent.ServiceRegister(agentServiceRegistration).Wait();//Consult 客户端的所有方法几乎都是异步方法,但是都没按照规范加上 Async 后缀,所以容易误导。记得调用后要 Wait()或者 await
}
//程序正常退出的时候从 Consul 注销服务
////要通过方法参数注入 IHostApplicationLifetime
applicationLifetime.ApplicationStopped.Register(() =>
{
using (var consulClient = new ConsulClient(ConsulConfig))
{
Console.WriteLine($"应用退出,开始从consul注销{serveiceName}");
consulClient.Agent.ServiceDeregister(serviceId).Wait();
}
});
}
private void ConsulConfig(ConsulClientConfiguration configuration)
{
configuration.Address = new Uri("http://127.0.0.1:8500/");
configuration.Datacenter = "dc1";
}
启动
我们生成下Api项目,用命令启动
dotnet Consul.OrderService.dll --ip localhost --port 5000

打开Consul看一下,已经可以看到OrderService已经注册好了。而且是有健康检查的。

服务消费
我们创建一个控制台程序,并安装Consul。
修改下Program.cs
class Program
{
static void Main(string[] args)
{
using (var consulClient = new ConsulClient(c =>
{
c.Address = new Uri("http://127.0.0.1:8500");
}))
{
var services = consulClient.Agent.Services().Result.Response;
foreach (var agentService in services.Values)
{
Console.WriteLine($"id={agentService.ID},name={agentService.Service},ip={agentService.Address},port={agentService.Port}");
}
}
Console.ReadKey();
}
}
由于刚才我们只开了一个OrderService,现在我们多打开几个。
dotnet Consul.OrderService.dll --ip localhost --port 5001
dotnet Consul.OrderService.dll --ip localhost --port 5002
dotnet Consul.OrderService.dll --ip localhost --port 5003
我们可以看到4个服务都有健康检查,并且Consul也可以看到。


我们启动下控制台应用程序

可以看到我们注册的4个服务都是可以获取到的,那么我们随便请求一个试一下。
static void Main(string[] args)
{
using (var consulClient = new ConsulClient(c =>
{
c.Address = new Uri("http://127.0.0.1:8500");
}))
{
var services = consulClient.Agent.Services().Result.Response.Values.Where(s => s.Service.Equals("OrderService", StringComparison.OrdinalIgnoreCase));
if (!services.Any())
{
Console.WriteLine("找不到服务的实例");
}
else
{
//随机获取
var service = services.ElementAt(Environment.TickCount % services.Count());
using (HttpClient client=new HttpClient())
{
var result= client.GetAsync(new Uri($"http://{service.Address}:{service.Port}/WeatherForecast")).Result;
Console.WriteLine(result.Content.ReadAsStringAsync().Result);
}
}
}
Console.ReadKey();
}

Consul服务治理发现学习记录的更多相关文章
- (3).NET CORE微服务 Micro-Service ---- Consul服务治理
Consul是注册中心,服务提供者.服务提供者.服务消费者等都要注册到Consul中,这样就可以实现服务提供者.服务消费者的隔离. 除了Consul之外,还有Eureka.Zookeeper等类似软件 ...
- (3)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Consul服务治理
Consul是注册中心,服务提供者.服务提供者.服务消费者等都要注册到Consul中,这样就可以实现服务提供者.服务消费者的隔离. 除了Consul之外,还有Eureka.Zookeeper等类似软件 ...
- spring cloud consul 服务治理
对照系统安装响应consul文件(以window为例) 解压文件之后配置环境,进入Path添加文件所在目录, 测试:在文件所在目录下进入指令操作 输入 consul agent -dev 启动成功,在 ...
- .NET Core微服务之基于Consul实现服务治理
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Consul基础介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发 ...
- 实战中的asp.net core结合Consul集群&Docker实现服务治理
0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言 在写这篇文章之前,我看了很多关于consul的服务治理,但发现基本上都是直接在powershell或者以命令工具的方式在 ...
- .net core结合Consul集群&Docker实现服务治理
实战中的asp.net core结合Consul集群&Docker实现服务治理 https://www.cnblogs.com/guolianyu/p/9614050.html 0.目录 整体 ...
- Consul实现服务治理
.NET Core微服务之基于Consul实现服务治理 https://www.cnblogs.com/edisonchou/p/9124985.html 一.Consul基础介绍 Consul是Ha ...
- ASP.NET CORE 使用Consul实现服务治理与健康检查(2)——源码篇
题外话 笔者有个习惯,就是在接触新的东西时,一定要先搞清楚新事物的基本概念和背景,对之有个相对全面的了解之后再开始进入实际的编码,这样做最主要的原因是尽量避免由于对新事物的认知误区导致更大的缺陷,Bu ...
- .NET Core微服务实施之Consul服务发现与治理
.NET Core微服务实施之Consul服务发现与治理 Consul官网:https://www.consul.io Consul下载地址:https://www.consul.io/downl ...
随机推荐
- CSS背景处理
CSS背景处理 背景样式 背景颜色 如果想让一个区域具有纯色的背景,可以使用background-color进行设置,背景颜色可以是rgb,rgba,#16网页色. <!DOCTYPE html ...
- git和github连接权限(这是一个简便方法,不是很安全,建议大家还是用ssh解决)
在使用,git从github上clone下来代码后. 我们再工作区进行编辑,然后提交. 最后我们想要将我们的改变推送到github上. 但是往往这个时候,我们可能会面临这样的问题. 我们没有权限将代码 ...
- 集训 T1-找试场
大致题意: 按照给定的指令移动,输出最后到达的点. 若没有走动过则输出(0,0). 基本思路 这题就是模拟,主要是判断指令的时候不太好判断, 先用字符串把指令读取进来,看看第一位是否是数字(如果是数字 ...
- echarts 实战 : 图表竖着或横着是怎样判定的?
这个问题比较简单. echarts 的图表默认是竖着的. 只要 xAxis 和 yAxis 互换,竖着的图就变成了横着的图了. 所以我们可以可以写一个xy轴互换的方法. reverseXYAxis = ...
- 题解 洛谷 P3825 【[NOI2017]游戏】
从题面中四元组\((i,h_i,j,h_j)\)限制选择车子型号,不难想到这题要用\(2-SAT\)解决. 考虑转化为\(2-SAT\)模型,发现除地图\(x\)外,其他地图都只有两种车子型号可以参加 ...
- 毫无基础的人入门Python,Python入门教程
随着人工智能的发展,Python近两年也是大火,越来越多的人加入到Python学习大军,对于毫无基础的人该如何入门Python呢?这里整理了一些个人经验和Python入门教程供大家参考. 如果你是零基 ...
- P1852 跳跳棋 [LCA思想+二分答案]
题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有\(3\)颗棋子,分别在\(a,b,c\)这三个位置.我们要通过最少的跳动 ...
- phpcms根据二级栏目列表写的三级栏目列表
<div class="container"> <!--左边树状导航--> <div class="CNLTreeMenu" id ...
- Window版本的Python安装库大全
1. 位置 python的pip安装包网站 https://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载方法 wget https://download.lfd.uci ...
- Day10_ElasticSearch
学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 老师的码 ...