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 学习笔记-服务注册的更多相关文章

  1. Consul 学习笔记—服务发现

    前言: 上一篇文章简单实用Consul试下服务注册,本篇继续学习Consul中的另外特性:服务发现.KV操作 :以及对上篇文章中存在的问题进行解决 问题解决 在上一篇文章中,注册服务提示检查失败. 通 ...

  2. Docker+Consul+Registrator 实现服务注册与发现

    Docker+Consul+Registrator实现服务注册与发现 逻辑图 实现nginx节点自动化加入容器IP代理 1.三台Consul agent server作为高可用通过Consul Tem ...

  3. Consul之:服务注册与发现

    一.服务的管理(注册与发现)有三种方式: 1:通过配置文件的方式静态注册2:通过HTTP API接口来动态注册(spring cloud使用方式,spring cloud中使用的是consul api ...

  4. spring cloud学习(一) 服务注册

    首先spring-cloud相关的简介可以去百度搜索,这里就不多说了,这里分享一个翻译spring cloud官网的中文网站spring cloud中文网 这个学习项目的代码放在 https://gi ...

  5. python与consul 实现gRPC服务注册-发现

    背景 通过对gRPC的介绍我们知道,当正常启动服务后,我们只需要知道ip,port就可以进行gRPC的连接.可以想到,这种方式并不适合用于线上环境,因为这样直连的话就失去了扩展性,当需要多机部署的时候 ...

  6. .Net Core 商城微服务项目系列(二):使用Ocelot + Consul构建具备服务注册和发现功能的网关

    1.服务注册 在上一篇的鉴权和登录服务中分别通过NuGet引用Consul这个包,同时新增AppBuilderExtensions类: public static class AppBuilderEx ...

  7. SpringCloud学习--Eureka 服务注册与发现

    目录 一:构建项目 二:服务注册与发现 为什么选择Eureka,请看上一篇博客 Eureka -- 浅谈Eureka 项目构建 IDEA 选择 New Project 选择 Spring Initia ...

  8. 微服务Consul系列之服务注册与服务发现

    在进行服务注册之前先确认集群是否建立,关于服务注册可以看上篇微服务Consul系列之集群搭建的介绍,两种注册方式:一种是注册HTTP API.另一种是通过配置文件定义,下面讲解的是基于后者配置文件定义 ...

  9. 【转】用 Consul 来做服务注册与服务发现

    原文:https://segmentfault.com/a/1190000018731395?utm_source=tag-newest ------------------------------- ...

随机推荐

  1. 【HttpRunner v3.x】笔记 ——2. 用脚手架快速创建项目

    环境装好了,相信很多童鞋已经迫不及待的想run起来了,但是面对一个陌生的框架又无从下手.没关系,我们可以用脚手架来快速生成一个httprunner项目. 一.快速生成项目 我们不妨先输入httprun ...

  2. 利用阿里云服务器免费体验word press博客、个人网站

    本文首发于我的个人博客:https://chens.life/create-wordpress-blog.html 前言 目前市面上有许许多多的虚拟云服务器ECS,例如阿里云.华为云.又拍云等等,他们 ...

  3. 09 promise then

    then() 方法返回一个 Promise 链式调用:then里面回调函数(成功回调和失败回调),凡事这两个回调函数里面抛出错误或者返回一个已经是拒绝状态的 Promise. 那么 then 返回的  ...

  4. java中变量在内存的位置

    package day02; /* * 成员变量:在堆内存中,因为对象的存在,才在内存中存在:作用于整改类中 * 局部变量:在栈内存中:作用于函数中,或者语句中 * */ class car{ //描 ...

  5. 使用java.io.RandomAccessFile更改文本文件的内容

    原文本内容: 2020-01-21 08:31:08.520 [main] INFO logbackCfg.App -秦时明月汉时关 2020-01-21 08:31:08.521 [main] ER ...

  6. python之os模块使用

    python中os模块的常用语法 1.查看当前路径及路径下的目录 os.getcwd():返回当前路径(不包括文件名) os.listdir():返回当前路径下的所有目录列表. os.listdir( ...

  7. oracle数据处理之expdb/impdb

    Oracle 数据泵的使用方法 一.新建逻辑目录 最好以system等管理员创建逻辑目录,Oracle不会自动创建实际的物理目录“D:\oracleData”(务必手动创建此目录),仅仅是进行定义逻辑 ...

  8. [Java并发编程之美]第2章 synchroized关键字

    ###synchronized关键字 synchronized块是Java提供的一种原子性内置锁,每个对象都可以把它当同步锁来用.线程在进入synchronized块钱会自动获取内部锁,这时候其他线程 ...

  9. 老生常谈SpringAop日志收集与处理做的工具包

    AopLog是基于Spring Aop 和ThreadLocal实现的一个专门对请求方法内容日志的拦截与处理的日志工具包. 场景 : 我想知道一些重要的请求方法的请求参数,响应参数,请求头,以及耗时, ...

  10. 使用Mysql分区表对数据库进行优化

    早期工作中没有做好足够的设计,目前记录表单表数据2000w且无有效索引,表现是分页缓慢,模糊查询拉闸. 当前业务中,写操作会多于读操作,时不时会遇到慢SQL占用过多的数据连接,导致写操作无法正常进行. ...