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 ------------------------------- ...
随机推荐
- unity5打包机制下,一种资源打ab和资源管理的方案
unity5打包机制下,一种资源打ab和资源管理的方案.1.打ab: 1.设置平台 2.清楚所有资源的assetbundlename: string[] abNameArr = AssetDataba ...
- Educational Codeforces Round 65 (Rated for Div. 2)(ACD)B是交互题,不怎么会
A. Telephone Number A telephone number is a sequence of exactly 11 digits, where the first digit is ...
- Java远程连接Linux服务器并执行命令及上传文件
最近再开发中遇到需要将文件上传到Linux服务器上,至此整理代码笔记. 此种连接方法中有考虑到并发问题,在进行创建FTP连接的时候将每一个连接对象存放至 ThreadLocal<Ftp> ...
- 沉珂日重的Java项目 Spring真的帮到我们了吗?
开局三连图. 这是刚开始时的程序结构,虽清晰已经有混乱的前兆. 业务增加,人员增加后就会沉珂日重. 几年后,最后的模样会让使用者和维护者都很无奈. 人们喜欢把Java程序的层次结构比作建筑,实际却最像 ...
- Vue文件模板
<template> <div> </div> </template> <script> export default { } </s ...
- @RequestBody使用说明
@RequestBody 使用 @RequestBody这个对于一般刚接触来说,确实有点陌生,但是现在前端,后端技术分的太细,越来越多的技术层出不穷,前端就分化出POST ,GET,PUT,DELET ...
- python3和python2语法区别
1.print python2中是print xxx python3中是print(xxx) 2.抛异常except python2中except Exception,e: print "E ...
- [LeetCode]42. 接雨水(双指针,DP)
题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下, ...
- 如何使用 TDengine 2.0 最新开源的集群功能?
导读:8月3日,TDengine 发布了 v2.0 版本,这次更新最大的亮点是,我们将分布式集群功能开源.开源后,引起了很大反响,又连续几天在 GitHub 趋势榜排名第一.不少关注TDengine的 ...
- python的多行注释
单行注释# 多行注释""