一、为什么有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. vi/vim编辑器操作梳理

    1. vi/vim编辑器详细使用讲解 1.1 vi/vim编辑器的3种模式 1.2 vi/vim编辑器操作说明 参数/命令/模式 说明 ###普通模式   :set nu  显示行号 :set non ...

  2. JS推箱子游戏

    <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Inse ...

  3. codewars--js--Convert all the cases!

    问题描述: In this kata, you will make a function that converts between camelCase, snake_case, and kebab- ...

  4. Oracle Linux下安装Oracle11gR2

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

  5. 字节码操作、javassist使用

    一.功能 1.动态生成新的类 2.动态改变某个类的结构(添加.删除.修改   新的属性.方法) 二.优势 1.比反射开销小,性能高 2.JAVAasist性能高于反射,低于ASM 使用javassis ...

  6. 查看mysql是否锁表了

    1.查看表是否被锁: (1)直接在mysql命令行执行:show engine innodb status\G. (2)查看造成死锁的sql语句,分析索引情况,然后优化sql. (3)然后show p ...

  7. django-分页(非海量数据)

    views.py class AnalysisDataHandler(View): def get(self, request): analysis_data = MonitorCenterDataA ...

  8. CSS 如何实现当鼠标放在上面时整行变色呢?

    摘要:下文讲述css中实现鼠标放在指定行上面时,整行变色的方法分享,如下所示: 实现思路:使用:hover伪类,实现当鼠标指向时,其背景色发生相应的变化,如下例所示: 例: 下文中的div,当鼠标放上 ...

  9. 框架里增加.env文件的作用

    在实际开发中我们常常遇到这样的问题,就是开发地点不固定,这就造成了我们需要频繁的更改数据库配置,给开发工作造成了麻烦,.env环境文件的出现解决了这个麻烦,我们只需要在不同的工作地点配置好.env文件 ...

  10. 极其实用的JS单行代码

    个人博客 地址:https://www.wenhaofan.com/a/20190629211647 1.强制布尔值 要将变量强制转换为布尔值而不更改其值: const myBoolean = !!  ...