Consul 是一个分布式、高度可用的数据中心感知服务发现平台,包括简单的服务注册、运行状况检查、故障检测和密钥值存储。 它基于这样一个前提:数据中心中的每个节点都运行一个 Consul 代理,并充当服务器或客户端。 每个代理通过可缩放的 gossip 协议进行通信。
Consul 的详细概述,包括与类似解决方案的比较,请参阅什么是 Consul?
Consul 是 用 Go 编写的,是 开源的。 编译的下载适用于 macOS X、FreeBSD、Linux、Solaris 和 Windows。
为什么选择 Consul?
作为成员资格提供商,Consul 是一个Orleans不错的选择,用于交付不需要客户拥有现有基础结构或合作 IT 提供商的本地解决方案。 Consul 是一个轻量级单个可执行文件,无需依赖项,可以轻松地构建到中间件解决方案中。 使用 Consul 发现、检查和维护微服务时,与 Orleans 成员资格完全集成可简化操作并且便于使用。 Consul 还提供一个成员身份表(也称为“Orleans 自定义系统存储”),该 Orleans表与'群集 管理'完全集成。
安装 Consul
Consul 文档中提供了有关设置稳定 Consul 群集的广泛文档,因此不会在此处重复信息。 但是,为了方便起见,本指南演示如何快速使用独立的 Consul 代理运行 Orleans。
创建将 Consul 安装到的文件夹(例如 C:\Consul)。
创建子文件夹:C:\Consul\Data(如果不存在,Consul 不会创建此目录)。
下载 并将 Consul.exe 解压缩到 C:\Consul。
在 C:\Consul 打开命令提示符,并运行以下命令:
./consul.exe agent -server -bootstrap -data-dir "C:\Consul\Data" -client='0.0.0.0'
在前面的命令中:
-
agent
:指示 Consul 运行托管服务的代理进程。 如果没有此开关,Consul 进程会尝试使用 RPC 配置正在运行的代理。 -
-server
:将代理定义为服务器,而不是客户端。 (Consul 客户端 是代理托管服务和数据,但缺乏投票权,不能成为群集领导者)。 -
-bootstrap
:群集中的第一个(且只有第一个!)节点必须启动才能承担群集领导。 -
-data-dir [path]
:指定存储所有 Consul 数据(包括群集成员身份表)的路径。 -
-client='0.0.0.0'
:告知 Consul 要在哪个 IP 地址上开启服务。
存在许多其他参数,包括使用 JSON 配置文件的选项。 请参阅 Consul 文档以查看完整列表。
-
验证 Consul 是否正在运行,并准备好从Orleans接受成员身份请求,方法是打开浏览器中
http://localhost:8500/v1/catalog/services
的服务终结点。 正常运行时,浏览器会显示以下 JSON:{ "consul": [] }
配置 Orleans
若要配置Orleans使用 Consul 作为成员资格提供程序,silo项目需要引用 Microsoft.Orleans.Clustering.Consul NuGet 包。 添加引用后,在 silo 的 Program.cs 文件中配置成员身份提供程序,如下所示:
IHostBuilder builder = Host.CreateDefaultBuilder(args)
.UseOrleans(silo =>
{
silo.UseConsulSiloClustering(options =>
{
// The address of the Consul server
var address = new Uri("http://localhost:8500");
options.ConfigureConsulClient(address);
});
})
.UseConsoleLifetime();
using IHost host = builder.Build();
host.Run();
前面的代码:
- 使用Host.CreateDefaultBuilder()的默认值创建一个IHostBuilder。
- 链式调用UseOrleans(IHostBuilder, Action<HostBuilderContext,ISiloBuilder>)以配置Orleans服务程序。
- 给定的 ISiloBuilder,调用 UseConsulSiloClustering。
- 在给定 Consul
address
的情况下,将群集成员资格提供程序配置为使用 Consul。
若要配置客户端,请引用相同的 NuGet 包并调用 UseConsulClientClustering 扩展方法。
客户端 SDK
如果有兴趣使用 Consul 进行服务发现, 客户端 SDK 适用于最常用的语言。
实施细节
成员资格表提供程序将 Consul 的键/值存储 功能与 Check-And-Set(CAS)配合使用。 当每个Silo启动时,它会注册两个键值条目:一个包含Silo的详细信息,另一个记录最后一次Silo报告其存活状态的时间。 后者是指诊断“我活着”条目,而不是故障检测信号,这些信号直接在不同的孤岛之间发送,不会写入表。 所有对表的写操作都使用CAS来提供并发控制,这是根据Orleans的群集管理协议的要求。
Silo 系统运行后,在网络浏览器中查看这些条目 http://localhost:8500/v1/kv/?keys&pretty
。 输出如下所示:
[
"orleans/default/192.168.1.11:11111@43165319",
"orleans/default/192.168.1.11:11111@43165319/iamalive",
"orleans/default/version"
]
所有键都带有 orleans
前缀 。 此前缀在服务提供商中被硬编码,旨在避免和其他 Consul 用户的键空间冲突。 检索每个密钥的其他信息,请将密钥名称(不含引号)追加到 Consul KV 根目录 http://localhost:8500/v1/kv/
。 这样做会显示以下 JSON:
[
{
"LockIndex": 0,
"Key": "orleans/default/192.168.1.11:11111@43165319",
"Flags": 0,
"Value": "[BASE64 UTF8 Encoded String]",
"CreateIndex": 321,
"ModifyIndex": 322
}
]
解码 Base64 UTF-8 编码字符串 Value
以提供实际 Orleans 成员数据:
http://localhost:8500/v1/KV/orleans/default/[SiloAddress]
{
"Hostname": "[YOUR_MACHINE_NAME]",
"ProxyPort": 30000,
"StartTime": "2023-05-15T14:22:00.004977Z",
"Status": 3,
"SiloName": "Silo_fcad0",
"SuspectingSilos": []
}
http://localhost:8500/v1/KV/orleans/default/[SiloAddress]/IAmAlive
"2023-05-15T14:27:01.1832828Z"
当客户端连接时,它们通过一个 HTTP GET 请求使用 URI http://localhost:8500/v1/KV/orleans/default/?recurse
读取集群中所有仓库的 KV。
局限性
请注意将 Consul 用作成员资格提供程序时的一些限制。
Orleans 扩展成员身份协议(表版本和 ETag)
Consul KV 目前不支持原子更新。 因此,Orleans Consul Membership Provider 仅实现 Orleans 基本的成员协议,如 Orleans 中 群集管理所述。 它不支持扩展成员身份协议。 此扩展协议作为一种额外的(虽然不是必要的)仓库连接验证被引入,并作为尚未实现的功能的基础。
多个数据中心
Consul 中的键值对当前不会在 Consul 数据中心之间复制。 存在一个单独的项目来解决此复制工作,但尚未证明其能够支持Orleans。
在 Windows 上运行时
Consul 在 Windows 上启动时,它会记录以下消息:
==> WARNING: Windows is not recommended as a Consul server. Do not use in production.
出现此警告消息的原因是在 Windows 环境中运行时缺少对测试的关注,而不是因为存在任何实际的已知问题。 在决定 Consul 是否是正确的选择之前阅读 讨论 。
潜在的未来增强功能
- 证明 Consul KV 复制项目可以在多个 Consul 数据中心之间的 WAN 环境中支持 Orleans 群集。
- 在 Consul 中实现提醒表。
- 实现扩展成员身份协议。 Consul 背后的团队计划实施原子操作。 一旦此功能可用,提供程序中的限制可能就能去除。