Consul 学习笔记-服务注册
Consul简介:
Consul是一种服务网格解决方案,提供具有服务发现,配置和分段功能的全功能控制平面。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建完整的服务网格。Consul需要一个数据平面,并支持代理和本机集成模型。Consul附带了一个简单的内置代理,因此开箱即用,但也支持Envoy等第三方代理集成。
特点:
- 服务发现: Consul的客户端可用提供一个服务,比如 api 或者mysql ,另外一些客户端可用使用Consul去发现一个指定服务的提供者.通过DNS或者HTTP应用程序可用很容易的找到他所依赖的服务.
- 健康检查: Consul客户端可用提供任意数量的健康检查,指定一个服务(比如:webserver是否返回了200 OK 状态码)或者使用本地节点(比如:内存使用是否大于90%). 这个信息可由operator用来监视集群的健康.被服务发现组件用来避免将流量发送到不健康的主机.
- Key/Value存储: 应用程序可用根据自己的需要使用Consul的层级的Key/Value存储.比如动态配置,功能标记,协调,领袖选举等等,简单的HTTP API让他更易于使用.
- 多数据中心: Consul支持开箱即用的多数据中心.这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域.
Consul安装运行:
Consul支持各种平台的安装,可以前往https://www.consul.io/downloads.html下载相关安装包,也可以使用docker部署,本次采用docker部署方式实现:
1、拉取consul镜像
docker pull consul
2、配置并运行Consul服务器
docker run \
-d \
-p 8500:8500 \
-p 8600:8600/udp \
--name=badger \
consul agent -server -ui -node=server -bootstrap-expect=1 -client=0.0.0.0
3、打开地址http://localhost:8500/ui/dc1/services查看consului界面,基本运行效果如下图:

简单使用
本次继续使用 IdentityServer.Demo 中,cz.Api.Goods、cz.Api.Order两个项目进行改造,实现服务注册和服务发现效果,首先调整两个接口方法返回结果:
cz.Api.Goods项目:
public IActionResult Get()
{
var result = new
{
Message = $"Name:{nameof(cz.Api.Goods)},Time:{DateTime.Now}",
LocalIp = Request.HttpContext.Connection.LocalIpAddress.ToString(),
};
return Ok(result);
} cz.Api.Order项目:
[HttpGet]
public IActionResult Get()
{
var result = new
{
Message = $"Name:{nameof(cz.Api.Order)},Time:{DateTime.Now}",
IP = Request.HttpContext.Connection.LocalIpAddress.ToString(),
};
return Ok(result);
}
服务注册:
1、添加Consul配置内容:
"Consul": {
"Address": "http://host.docker.internal:8500",
"HealthCheck": "/healthcheck",
"Name": "cz.Api.Goods",
"Ip": "host.docker.internal"
}
因为会在docker中运行:使用host.docker.internal代替localhost
2、注册Consul组件:
A:在两个项目中添加Consul包:使用命令:Install-Package Consul、
B:添加心跳检查控制器:
[Route("api/[controller]")]
[ApiController]
public class HealthCheckController : ControllerBase
{
/// <summary>
/// 健康检查
/// </summary>
/// <returns></returns>
[HttpGet]
public IActionResult api()
{
return Ok();
}
}
C:注册组件:在项目项目中添加ConsulExtensions方法类:
public static class ConsulExtensions
{
public static IApplicationBuilder UseConul(this IApplicationBuilder app, IConfiguration configuration, IHostApplicationLifetime lifetime)
{
var client = new ConsulClient(options =>
{
// Consul客户端地址
options.Address = new Uri(configuration["Consul:Address"]);
}); var registration = new AgentServiceRegistration
{
// 唯一Id
ID = Guid.NewGuid().ToString(),
// 服务名
Name = configuration["Consul:Name"],
// 服务绑定IP
Address = configuration["Consul:Ip"],
// 服务绑定端口
Port = Convert.ToInt32(configuration["Consul:Port"]),
Check = new AgentServiceCheck
{
// 服务启动多久后注册
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),
// 健康检查时间间隔
Interval = TimeSpan.FromSeconds(10),
// 健康检查地址
HTTP = $"http://{configuration["Consul:Ip"]}:{configuration["Consul:Port"]}{configuration["Consul:HealthCheck"]}",
// 超时时间
Timeout = TimeSpan.FromSeconds(5)
}
}; // 注册服务
client.Agent.ServiceRegister(registration).Wait();
// 应用程序终止时,取消服务注册
lifetime.ApplicationStopping.Register(() =>
{
client.Agent.ServiceDeregister(registration.ID).Wait();
}); return app;
}
}
在Startup文件中:使用该方法:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime lifetime)
{
……
app.UseConul(Configuration, lifetime);
}
D:添加Docker操作,编译镜像;运行镜像
在解决方案所在目录执行docker命令:
编译镜像:
docker build -t cz.api.goods:dev -f ./cz.Api.Goods/Dockerfile .
docker build -t cz.api.order:dev -f ./cz.Api.Order/Dockerfile .
运行镜像
docker run -d -p 5050:80 --name cz.api.goods_1 cz.api.goods:dev
docker run -d -p 5051:80 --name cz.api.goods_2 cz.api.goods:dev
docker run -d -p 5052:80 --name cz.api.goods_3 cz.api.goods:dev
docker run -d -p 5060:80 --name cz.api.order_1 cz.api.order:dev
docker run -d -p 5061:80 --name cz.api.order_2 cz.api.order:dev
docker run -d -p 5062:80 --name cz.api.order_3 cz.api.order:dev

E:进入Consul的UI界面查看服务注册情况,注册成功



后续:
后续将进一步对Consul进行学习验证,以及对原理进一步了解。
参考:
官方文档:
https://www.consul.io/docs
https://www.consul.io/docs/guides/containers-guide
源码github: https://github.com/cwsheng/Consul.Demo.git
Consul 学习笔记-服务注册的更多相关文章
- Consul 学习笔记—服务发现
前言: 上一篇文章简单实用Consul试下服务注册,本篇继续学习Consul中的另外特性:服务发现.KV操作 :以及对上篇文章中存在的问题进行解决 问题解决 在上一篇文章中,注册服务提示检查失败. 通 ...
- Docker+Consul+Registrator 实现服务注册与发现
Docker+Consul+Registrator实现服务注册与发现 逻辑图 实现nginx节点自动化加入容器IP代理 1.三台Consul agent server作为高可用通过Consul Tem ...
- Consul之:服务注册与发现
一.服务的管理(注册与发现)有三种方式: 1:通过配置文件的方式静态注册2:通过HTTP API接口来动态注册(spring cloud使用方式,spring cloud中使用的是consul api ...
- spring cloud学习(一) 服务注册
首先spring-cloud相关的简介可以去百度搜索,这里就不多说了,这里分享一个翻译spring cloud官网的中文网站spring cloud中文网 这个学习项目的代码放在 https://gi ...
- python与consul 实现gRPC服务注册-发现
背景 通过对gRPC的介绍我们知道,当正常启动服务后,我们只需要知道ip,port就可以进行gRPC的连接.可以想到,这种方式并不适合用于线上环境,因为这样直连的话就失去了扩展性,当需要多机部署的时候 ...
- .Net Core 商城微服务项目系列(二):使用Ocelot + Consul构建具备服务注册和发现功能的网关
1.服务注册 在上一篇的鉴权和登录服务中分别通过NuGet引用Consul这个包,同时新增AppBuilderExtensions类: public static class AppBuilderEx ...
- SpringCloud学习--Eureka 服务注册与发现
目录 一:构建项目 二:服务注册与发现 为什么选择Eureka,请看上一篇博客 Eureka -- 浅谈Eureka 项目构建 IDEA 选择 New Project 选择 Spring Initia ...
- 微服务Consul系列之服务注册与服务发现
在进行服务注册之前先确认集群是否建立,关于服务注册可以看上篇微服务Consul系列之集群搭建的介绍,两种注册方式:一种是注册HTTP API.另一种是通过配置文件定义,下面讲解的是基于后者配置文件定义 ...
- 【转】用 Consul 来做服务注册与服务发现
原文:https://segmentfault.com/a/1190000018731395?utm_source=tag-newest ------------------------------- ...
随机推荐
- Unity 3D的版本控制问题
译林军 李慧爽|2014-02-13 11:21|9231次浏览|Unity(286)移动应用(19)技术开发(9)0 Unity中的源码控制并非和其他开发环境一样简单.我们可以从开发和美术两个角度讲 ...
- C#知识点:操作XML
XML是什么就不用说了文本标记语言. 主要纪录如何对XML文件进行增删改查. Xml的操作类都存在System.xml命名空间下面. 应用型的直接上代码 using System; using Sys ...
- sublime3 激活
起因 这段时间sublime一直抽风,每次打开都提示让我更新. 身为强迫症的我当然不能忍! 方法 关闭自动更新 点击菜单栏"Preferences"=> "Sett ...
- js-正则表达式的初步应用(一)
一.正则表达式是使用单个字符串来描述.匹配一系列符合某个句法规则的字符串搜索模式.注:搜索模式也可用于文本替换 例子1 输出结果 注:(我为了方便在控制台输出,所以结果如下) 例子2 输出结果 上面 ...
- 【python】列表与数组之间的相互转换
安装numpy pip3 install numpy 列表转数组 np.array() import numpy as np a = [1, 2, 3] b = np.array(a) 列表转数组 a ...
- Maven学习总结:几个常用的maven插件
我们使用maven做一些日常的工作开发的时候,无非是想利用这个工具带来的一些便利.比如它带来的依赖管理,方便我们打包和部署运行.这里几个常见的插件就是和这些工程中常用的步骤相关. maven-comp ...
- python常用sys模块
sys.argv 命令行参数List,第一个元素是程序本身路径 sys.modules.keys() 返回所有已经导入的模块列表 sys.exc_info() 获取当前正在处理的异常类,exc_typ ...
- 【性能优化】面试官:Java中的对象都是在堆上分配的吗?
写在前面 从开始学习Java的时候,我们就接触了这样一种观点:Java中的对象是在堆上创建的,对象的引用是放在栈里的,那这个观点就真的是正确的吗?如果是正确的,那么,面试官为啥会问:"Jav ...
- Redis5设计与源码分析读后感(四)压缩列表
一.引言 上一节我们总结了跳跃表的知识,我们知道了有序数组可以用跳跃表实现,也可以用压缩列表来实现,这一篇文章我们来总结一下压缩列表相关的知识. 二.压缩列表简介 定义:压缩列表 ziplist 本质 ...
- tf.split函数的用法(tensorflow1.13.0)
tf.split(input, num_split, dimension): dimension指输入张量的哪一个维度,如果是0就表示对第0维度进行切割:num_split就是切割的数量,如果是2就表 ...