一、为什么有Consul?

在微服务架构中,每1个服务都是集群式的提供服务,订单服务在10台服务器上都有,那么用户的请求到达,获取哪台服务器的订单服务呢?如果10台中有的订单服务挂了怎么办?10台服务器扛不住了,水平扩展又新增加了1台服务器提供订单服务,怎么让用户请求知道有新的服务器提供订单服务了?这时候就需要Consul了,它能通过心跳检测哪些服务还活着,而且有新的服务启动,它也能够主动发现。

1、S-B-1服务,S-B-2服务,S-B-3服务注册到Consul

2、Consul健康检查S-B-1服务,S-B-2服务,S-B-3服务

3、S-A调用S-B-1服务,或S-B-2服务,或S-B-3服务

二、Consul环境准备

1、Consul环境下载

Consul官网:https://www.consul.io/downloads.html,下载windows 64bit

2、启动Consul管理后台

盘符切到放consul.exe的目录,然后cmd启动,cd D:\consul\consul agent -dev

3、访问Consul管理后台:http://localhost:8500

三、代码实现

1、添加WebApi服务

namespace ConsulServiceFind.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
private IConfiguration _IConfiguration = null;
private ILogger<ValuesController> _logger = null; public ValuesController(IConfiguration iConfiguration, ILogger<ValuesController> logger)
{
_IConfiguration = iConfiguration;
_logger = logger;
} // GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
this._logger.LogWarning("ValuesController-Get 执行");
return new JsonResult(new
{
Id = ,
Name = "david_test",
IP = this._IConfiguration["ip"],
port = this._IConfiguration["port"],
urls = this._IConfiguration["urls"],
CurrentPath = base.HttpContext.Request.Path
});
} }
}

2、log4net 集成到Core

2.1、Nuget引入log4net

2.2、Nuget引入Microsoft.Extensions.Logging.Log4Net.AspNetCore

2.3、添加log4net 配置文件 (设置配置文件属性为始终复制,默认配置文件放在根目录下)

2.4、注入ILogger

namespace ConsulServiceFind
{
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
} public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureLogging((context, LoggingBuilder) =>//ILogger
{
LoggingBuilder.AddFilter("System", LogLevel.Warning); //忽略系统的其他日志
LoggingBuilder.AddFilter("Microsoft", LogLevel.Warning);
LoggingBuilder.AddLog4Net();
})
.UseStartup<Startup>();
}
}

3、网站启动后需要Consul注册

3.1、Nuget引用Consul后,封装ConsulRegister类

namespace ConsulServiceFind
{
public static class ConsulRegister
{
public static void RegistConsul(this IConfiguration configuration)
{
string ip = configuration["ip"] ?? "Localhost";
//部署到不同服务器的时候不能写成127.0.0.1或者0.0.0.0,因为这是让服务消费者调用的地址
int port = int.Parse(configuration["port"]);
//实例化Consul客户端
ConsulClient consulClient = new ConsulClient(c => {
c.Address = new Uri("http://127.0.0.1:8500");
c.Datacenter = "consul";
});
//向Consul注册服务
Task<WriteResult> result = consulClient.Agent.ServiceRegister(new AgentServiceRegistration() {
ID = "david_webapi_test_" + Guid.NewGuid(),//服务编号,不能重复
Name = "david_webapi",//服务的名字--将来调用时用的就是这个
Address = ip,
Port = port,
Tags = new string[] { },//可以用来设置权重
Check=new AgentServiceCheck() {
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(),//服务停止多久后反注册
Interval = TimeSpan.FromSeconds(),//健康检查时间间隔,或者称为心跳间隔
HTTP = $"http://{ip}:{port}/api/health",//健康检查地址
Timeout = TimeSpan.FromSeconds()
}
});
}
}
}

3.2、在Startup的Configure方法里使用Consul

3.3、ConsulRegister心跳检测,添加HealthCheck也就是另外一个WebApi,做健康检查

namespace ConsulServiceFind
{
[Route("api/[controller]")]
[ApiController]
public class HealthController : ControllerBase
{
private IConfiguration _IConfiguration = null;
private ILogger<HealthController> _logger = null;
public HealthController(IConfiguration configuration, ILogger<HealthController> logger)
{
this._IConfiguration = configuration;
this._logger = logger;
} [HttpGet]
public IActionResult Check()
{
this._logger.LogWarning($"{this._IConfiguration["port"]}-Health Check!");
return Ok();//
}
}
}

4、启动多个WebApi实例,运行两个WebApi服务起来

4.1、cd  切路径--C:\Users\dell\Desktop\ConsulServiceFind\ConsulServiceFind\bin\Debug\netcoreapp2.2

4.2、通过命令行启动2个不同端口的WebApi

dotnet ConsulServiceFind.dll --urls="http://*:10010" --ip="127.0.0.1" --port=10010

dotnet ConsulServiceFind.dll --urls="http://*:10020" --ip="127.0.0.1" --port=10020

http://localhost:10010/api/values

http://localhost:10020/api/values

4.3、去Consul管理后台http://localhost:8500查看多个服务被发现和心跳检测

1、微服务--为什么有consul,consul注册,心跳检测,服务发现的更多相关文章

  1. .netcore 微服务快速开发框架 Anno&Viper 注册中心 (服务上线下线预警通知)

    1.微服务时代,服务上线先预警通知 在微服务大行其道的今天,相信很多人都用上了微服务或者是微服务的概念也已经有了一个深刻的了解.今天我们不在这里展开阐述,今天我们要说的是微服务伴侣预警通知. 2.注册 ...

  2. NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成

    本篇内容属于非实用性(拿来即用)介绍,如对框架设计没兴趣的朋友,请略过. 快一个月没有写博文了,最近忙着两件事;    一:阅读刘墉先生的<说话的魅力>,以一种微妙的,你我大家都会经常遇见 ...

  3. .NET Core微服务之路:基于Consul最少集群实现服务的注册与发现(二)

    重温Consul最少化集群的搭建  

  4. Ocelot + Consul + Registrator 基于Docker 实现服务发现、服务自动注册

    目录 1. Consul集群搭建 1.1 F&Q Consul官方推荐的host网络模式运行 2. Registrator服务注册工具 2.1 F&Q Registrator悬挂服务 ...

  5. 【微服务No.1】Consul服务发现在windows下简单使用

    基本介绍: 安装: 下载地址:https://www.consul.io/downloads.html 运行: consul agent -dev 显示这个界面说明已经开启成功. 页面显示: 然后访问 ...

  6. (转)微服务_.NET Core Consul服务发现与治理

    原文地址:https://www.cnblogs.com/waynechan/p/9354909.html Consul官网:https://www.consul.io Consul下载地址:http ...

  7. 注册服务到服务中心(Consul)

    注册服务到服务中心(Consul) 添加POM文件中的依赖 在POM文件添加如下依赖: <dependency> <groupId>org.springframework.bo ...

  8. Consul 多数据中心下的服务注册发现与配置共享

    1. Consul简介   Consul是HashiCorp公司推出的开源软件,它提供了一套分布式高可用可横向扩展的解决方案,能为微服务提供服务治理.健康检查.配置共享等能力.   Eurake2.x ...

  9. 使用docker+consul+nginx集成分布式的服务发现与注册架构

    一.环境说明: 1.一台虚拟机,该系统已经装好了docker: ip 192.168.10.224 虚拟网卡,与主机互通 操作系统rhel6 内核 2.6.32  64位 docker版本 1.7.1 ...

随机推荐

  1. 使用helm安装jenkin和gitlab

    一.使用服务介绍 存储: 阿里云NAS k8s网络插件: calico k8s版本: 1.15.2 二.helm安装 https://www.cnblogs.com/zhangb8042/p/1020 ...

  2. apache 负载均衡

    此次使用mod_proxy的方式来实现的,因为在Apache2以上的版本中已经集成了,因此不需要再另行安装和配置了. 只需要把注释去掉即可,去掉以下模块的注释: LoadModule proxy_mo ...

  3. 使用docker创建MySQL容器,并在springboot中使用

    最近在看网上找了个springboot的项目试试,在项目中需要的MySQL版本是5.7,但是本机的MySQL只有5.5.因此想着在我的服务器上跑一个MySQL:5.7的容器解决这一问题,但是在实际操作 ...

  4. docker安装db2数据库

    查询可安装的db2镜像 # docker search db2 [root@docker-servers ~]# docker search db2 INDEX NAME DESCRIPTION ST ...

  5. Oracle Linux下安装Oracle11gR2

    Linux上Oracle11g R2安装及配置 一. 安装环境准备 1.  环境说明 Linux服务器系统:Oracle Linux Release 6 Update 2 (64bit),先安装好. ...

  6. [Wpf学习] 1.传说中的Main

    原来的C#程序都有Main的,现在用vs新建一个Wpf项目,启动似乎变成App.xmal,前期项目中为了获取启动参数,很是折腾了一番: 1.先是修改App.xaml,添加StartUp事件 <A ...

  7. DotNet源码学习-HASHSET(初探)

    命名空间:System.Collections.Generic 先看一下官方说明:类提供了高级的设置操作.集是不包含重复元素的集合,其元素无特定顺序. HashSet <T>对象的容量是对 ...

  8. uniapp简易直播

    实验准备 在服务器部署nginx-rtmp作为我们直播推流和拉流的服务器(如果服务商选择七牛,也是直接给地址推流).为了加快部署,我在这一步使用Docker. docker pull tiangolo ...

  9. SAP VL10B 报错 - 4500000317 000010 交付 $ 1 的交付项目 000010 与 POD 无关-

    SAP VL10B 报错 - 4500000317 000010 交付 $ 1 的交付项目 000010 与 POD 无关- 如下公司间STO单据, 业务背景是货物从公司代码LYSP转入公司代码BTS ...

  10. MySQL导出数据时提示文件损坏

    使用Navicat工具,优先将整个数据库的表和数据导出. 如果遇到文件损坏错误可以在表实例界面选中所有表,然后将表转储为SQL文件(结构和数据). 在目标数据库执行导出的SQL文件,导入结构和数据. ...