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. 【转】ANDROID LOLLIPOP SCREEN CAPTURE AND SHARING

    https://datatheorem.github.io/android/2014/12/26/android-screencapture/ https://www.youtube.com/watc ...

  2. 【接口自动化】selenium库也有大用场(获取cookie)

    相信有些童鞋在做接口.或者说接口自动化测试的过程中会遇到这样的场景:测试的接口,必须是需要登录后才能发起请求成功的. 那么怎么解决呢? 本着团队协作的精神,我们就去让开发同学开个后门,给你个" ...

  3. Easy Game(记忆化搜索)

    You are playing a two player game. Initially there are n integer numbers in an array and player A an ...

  4. 深入了解Netty【一】BIO、NIO、AIO简单介绍

    引言 在Java中提供了三种IO模型:BIO.NIO.AIO,模型的选择决定了程序通信的性能. 1.1.使用场景 BIO BIO适用于连接数比较小的应用,这种IO模型对服务器资源要求比较高. NIO ...

  5. [BUUOJ记录] [BJDCTF2020]The mystery of ip

    本题考察XFF头的ssti模板注入,没有过滤,算是入门题 进入题目hint.php的源码中可以看到一个hint 猜测是通过XFF头来获取信息的,发个HTTP请求添加一个XFF头测试一下: GET /f ...

  6. Cypress系列(44)- 命令行运行 Cypress

    如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 前言 前面也介绍过 Cypress 命令 ...

  7. 博主心酸历程:初始Hadoop安装安装过程出现的各种问题。

    首先,作为一名第一次安装Hadoop的小白,费时六七个小时终于安装好了. 如果你是一名小白也是第一次安装,请参考以下教程: 链接:https://pan.baidu.com/s/1pwu6_znWKz ...

  8. CSS的坑

    如何触发 bfc 规则 浮动元素:float 除 none 以外的值 绝对定位元素:position (absolute.fixed) display 为 inline-block.table-cel ...

  9. algorithm入门算法中的常见问题

    KMP算法(next数组) 二分查找(非递归) /** * 二分查找(非递归) * @param arr 从小到大的排序数组 * @param target 目标查找值 * @return */ pu ...

  10. python函数小案例

    python函数 目录 python函数 1.写一个函数求三个数的和,并返回结果 2.写一个函数,求平均值,并返回结果 写一个函数,求每个数与平均值之间的差,并放回结果 1.写一个函数求三个数的和,并 ...