在上篇.Net微服务实践(四)[网关]:Ocelot限流熔断、缓存以及负载均衡中介绍Ocelot的限流、熔断、缓存、负载均衡以及其他一些特性,Ocelot的基本配置和功能都已经介绍完了。本篇我们会介绍服务发现Consul.
介绍
Consul是一款简单、易用、可伸缩性强的服务治理系统。主要核心功能有:服务发现、健康检查、键值存储和多数据中心。
服务发现
服务发现是consul的核心功能,分为服务注册和服务查找。
- 服务注册 - 将服务节点信息(地址+端口)添加(删除)到服务注册表,服务注册表会记录着服务的节点信息和状态
- 服务查找 - 由其他的服务或者系统通过注册表查询到指定可用服务的节点信息。
服务发现的方式又分自主式和代理式
自主式
由各个服务主动的将自己节点信息添加(删除)到注册中心。实现是通过统一封装或者程序库,由服务各个节点承担服务发现的功能,与代理式相比由各自节点分担的访问压力。
代理式
由一个系统(负载均衡系统)或者服务(API网关)来完成服务发现。因为由一个系统或者服务完成,随着注册服务的增加会带来性能瓶颈,因此需要对此做集群
健康检查、键值存储和数据中心
健康检查
consul代理会每隔一段时间对注册中心的服务节点进行访问,如果响应码为“20X"认为是健康。
键值存储
键值存储可以认为是一个简易的k/v数据库,因此可以用此来存放配置信息。
数据中心
consul支持多数据中心,多数据中心进一步保证了Consul的可用性。
架构
- Agent - Agent是Consul集群中每个成员长时间运行的守护进程。它是通过运行consul agent启动的。Agent可以运行在client或server模式。由于所有节点都必须运行一个agent,因此将节点称为客户端或服务器更简单,但agent还有其他实例。所有agent都可以运行DNS或HTTP接口,并负责运行检查和保持服务同步。
- Client - Client是将所有RPC转发给服务器的agent。client是相对无状态的。client执行的唯一后台活动是参与局域网gossip池。 这具有最小的资源开销并且仅消耗少量的网络带宽。
- Server - Server是具有扩展职责的 agent,包括参与Raft仲裁,维护集群状态,响应RPC查询,通过广域网的 gossip与其他数据中心通讯,以及将查询转发给leader或远程数据中心。
- Datacenter - 虽然数据中心的定义似乎是显而易见的,但必须考虑一些细微的细节。例如,在EC2中,多个可用区域被认为是由一个数据中心组成的? 我们将数据中心定义为私有、低延迟和高带宽的网络环境。 这不包括通过公共互联网的通信,但为了我们的目的,单个EC2区域内的多个可用区域将被视为单个数据中心的一部分。
- Consensus - 在我们的文档中使用Consensus来表示对当选*的同意以及对交易顺序的协议。由于这些事务被应用于有限状态机,我们对Consensus的定义意味着复制状态机的一致性。
- Gossip - Consul建立在Serf之上,它提供了一个完整的gossip协议用于多种目的。 Serf提供会员资格、失败检测和事件广播。在Gossip文档中更多地描述了这些用法。 只要知道gossip涉及随机的节点到节点的通信就足够了,主要是通过UDP。
- LAN Gossip - 指包含全部位于同一局域网或数据中心的节点的局域网gossip池。
- WAN Gossip—- 指仅包含服务器的WAN gossip池。这些服务器主要位于不同的数据中心,通常通过互联网或广域网进行通信。
- RPC - 远程过程调用。 这是一个请求/响应机制,允许客户端发出服务器请求。
Consul模式
Consul有两种模式,Client和Server,无论各种模式都有一个consul agent。
Client模式
Client模式是一个轻量级的consul agent,只拥有注册服务、健康检查、转发查询等功能。
Server模式
Server模式与Client模式相比,除了拥有Client模式的功能还多出了数据存储,leader选举等。
官方建议Server模式应保证3-5个,而且应该是奇数,为什么呢,因为少于3个无法保证高可用,多于5个又会给数据库同步的一致性带来压力,而Client数量控制则没有讲究
环境安装
下面介绍一下Windows系统下如何快速简单的部署一个Consul的开发环境(实际生产环境要部署集群)
下载 https://www.consul.io/downloads.html windows 版本,解压
添加consul.exe 的路径到环境变量
cmd运行 consul ,验证
启动cosul服务, cmd中输入 consul agent -dev (dev是开发模式,生产环境下不要使用)
HTTP API 和Command CLI
consul提供了丰富和command CLI和API来管理和操作Consul, 例如服务的注册、服务的查找、服务取消注册、健康检查等都有相应的Command CLI和 API
详细的大家可以参考官方的API文档和Command CLI文档
- HTTP API - https://www.consul.io/api/health.html
- Command CLI - https://www.consul.io/docs/commands/index.html
示例API介绍
在这里我们介绍几个比较常用的API
服务注册
PUT http://localhost:8500/v1/agent/service/register
body
{
"ID": "nginx1",
"Name": "nginx",
"Tags": ["primary", "v1"],
"Address": "127.0.0.1",
"Port": 80,
"EnableTagOverride": false,
"Check": {
"DeregisterCriticalServiceAfter": "100s",
"HTTP": "http://localhost:5000/health",
"Interval": "1s"
}
}
注册一个ID为nginx1的服务
服务查找
GET http://localhost:8500/v1/agent/services
调用后我们可以在response中看到刚刚注册的nginx1的服务
{
"nginx1": {
"ID": "nginx1",
"Service": "nginx",
"Tags": [
"primary",
"v1"
],
"Meta": {},
"Port": 80,
"Address": "127.0.0.1",
"TaggedAddresses": {
"lan_ipv4": {
"Address": "127.0.0.1",
"Port": 80
},
"wan_ipv4": {
"Address": "127.0.0.1",
"Port": 80
}
},
"Weights": {
"Passing": 1,
"Warning": 1
},
"EnableTagOverride": false
}
}
服务取消注册
PUT http://localhost:8500/v1/agent/service/deregister/nginx1
取消注服务nginx1, 这时我们再调用服务查找的API,会返现response中已经没有nginx1这个服务了
代理健康检查
GET http://localhost:8500/v1/agent/checks
http 状态码返回200, 表示正常
最后
本篇我们对consul做了基本的介绍、如何在windows系统下快速的搭建consul的开发环境,以及Consul的常用API介绍。 接下来我们会结合Ocelot,在Ocelot中集成Consul做服务发现。