微服务之Consul注册中心

概述

Consul是一个分布式、高可用的扩展的用于服务发现和配置的工具

特性

  • 服务发现
    使用Consul可以更加简单的通过DNS或者HTTP方式来进行服务的注册和发现,外部的服务也可以进行注册。
  • 健康检查
    使用Consul的健康检查可以确认集中服务的状态信息,这项功能的集成有助于更好地进行路由分发等操作。
  • Key/Value存储
    可以通过简单的HTTP API进行Key/Value的使用,使得动态配置、特性标记、Leader选举等变得更加灵活。
  • 多数据中心
    Consul内建支持多数据中心,可以不需要复杂的配置就可以实现任意数量区域的支持。
  • 服务网格
    应用可以在服务网格配置使用sidecar代理来建立TLS连接,而在使用中也可以做到对于连接的透明性和无意识。

概念

  • Consul的官网组织图如下所示

    images

  • CLIENT
    CLIENT表示consul的client模式,就是客户端模式。是consul节点的一种模式,这种模式下,所有注册到当前节点的服务会被转发到SERVER,本身是不持久化这些信息。
  • SERVER
    SERVER表示consul的server模式,表明consul是个server,这种模式下,功能和CLIENT都一样,唯一不同的是,它会把所有的信息持久化到本地,这样遇到故障,信息是可以被保留的。
  • SERVER-LEADER
    是SERVER的老大,与SERVER不一样的是,它需要负责同步注册的信息给其它的SERVER,同时也要负责各个节点的健康检查。

安装

Docker中安装

  1. 拉取镜像

    1
    docker pull consul
  2. 宿主机创建文件夹

    期望容器中的配置文件、数据、日志再容器异常关闭或主动删除后保留,则需要配置挂载

    1
    mkdir -p /data/consul/{conf,data}
  3. 启动启动 将Consul默认的8500端口映射到宿主机的8599端口

    1
    docker run --name consul -p 8500:8500 -v /data/consul/conf/:/consul/conf/ -v /data/consul/data/:/consul/data/ -d consul

Windows下的测试安装

  1. 下载consul.exe文件

  2. 启动

    1
    consul.exe agent --dev
  3. 浏览器打开127.0.0.1:8500,如下所示即为成功

    consul

Consul的服务注册

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using Consul;

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
ConsulClient client = new ConsulClient(config => {
config.Address = new Uri(Configuration["ConsulServer:Uri"]);
config.Datacenter = Configuration["ConsulServer:Datacenter"];
});
Task<WriteResult> result = client.Agent.ServiceRegister(new AgentServiceRegistration()
{
ID = "BlogService_" + Guid.NewGuid().ToString().Substring(0, 7),//服务编号,不能重复,用Guid最简单
Name = "BlogService",//服务的名字
Address = ipAddress,//我的ip地址(可以被其他应用访问的地址,本地测试可以用127.0.0.1,机房环境中一定要写自己的内网ip地址)
Port = port,//我的端口
Check = new AgentServiceCheck()
{
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务停止多久后反注册
Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔,或者称为心跳间隔
HTTP = $"http://{ipAddress}:{port}/blog/health",//健康检查地址,
Timeout = TimeSpan.FromSeconds(5)
}
});
}