Consul是一个分布式、高可用性和数据中心感知的服务发现平台,包括简单的服务注册、健康检查、故障检测和键/值存储。它建立在这样的前提下:即数据中心中的每个节点都运行一个Consul代理,该代理充当服务器或客户端,通过可扩展的gossip协议进行通信。
这里有一个非常详细的Consul介绍,包括与类似的解决方案比较。
Consul是用GO编写的,是开源的;已编译的下载,适用于Mac OS X,FreeBSD,Linux,Solaris和Windows
作为Orleans成员资格提供程序,当您需要交付一个on-premise的解决方案时,Consul是一个不错的选择,它不需要您的潜在客户拥有现有基础架构和一个合作的IT提供商。Consul是一个非常轻量级的单一可执行文件,没有依赖项,因此可以很容易地构建到您自己的中间件解决方案中。当Consul已经是您发现、检查和维护微服务的解决方案时,与Orleans成员身份完全集成是有意义的,这样既简单又易于操作。因此,我们在Consul(也称为“Orleans Custom System Store”)中实施了一个成员表,该表与Orleans的集群管理完全集成。
Consul.io上有非常广泛的、关于建立一个稳定的Consul集群的文档,在这里重复这一点是没有意义的; 但为了您的方便,我们提供了本指南,以便您可以非常快速地让Orleans与一个独立的Consul代理一起运行。
1)创建一个文件夹以将Consul安装到例如C:\Consul中
2)创建一个子文件夹:C:\Consul\Data (如果它不存在,Consul不会创建它)
3)下载 Consul.exe并将其解压缩到C:\Consul\
4)在C:\Consul\下打开命令提示符
5)输入 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文档。
6)通过在浏览器中打开服务端点,验证Consul是否正在运行,并准备好接受来自Orleans的成员身份请求。
目前,“自定义”成员资格提供程序的OrleansConfiguration.xml配置文件存在一个已知问题,无法正确解析。因此,在启动Silo之前,您必须在xml中提供一个占位符SystemStore,然后在代码中配置提供程序。
OrleansConfiguration.xml
<OrleansConfiguration xmlns="urn:orleans">
<Globals>
<SystemStore SystemStoreType="None" DataConnectionString="http://localhost:8500" DeploymentId="MyOrleansDeployment" />
Globals>
<Defaults>
<Networking Address="localhost" Port="22222" />
<ProxyingGateway Address="localhost" Port="30000" />
Defaults>
OrleansConfiguration>
代码
public void Start(ClusterConfiguration config)
{
_siloHost = new SiloHost(System.Net.Dns.GetHostName(), config);
_siloHost.Config.Globals.LivenessType = GlobalConfiguration.LivenessProviderType.Custom;
_siloHost.Config.Globals.MembershipTableAssembly = "OrleansConsulUtils";
_siloHost.Config.Globals.ReminderServiceType = GlobalConfiguration.ReminderServiceProviderType.Disabled;
_siloHost.InitializeOrleansSilo();
var startedok = _siloHost.StartOrleansSilo();
if (!startedok)
throw new SystemException(String.Format("Failed to start Orleans silo '{0}' as a {1} node", _siloHost.Name, _siloHost.Type));
Log.Information("Orleans Silo is running.\n");
}
或者,您可以完全在代码中配置silo。
客户端配置更简单
ClientConfiguration.xml
<ClientConfiguration xmlns="urn:orleans">
<SystemStore SystemStoreType="Custom" CustomGatewayProviderAssemblyName="OrleansConsulUtils" DataConnectionString="http://192.168.1.26:8500" DeploymentId="MyOrleansDeployment" />
ClientConfiguration>
如果您有兴趣使用Consul进行自己的服务发现,则可以使用客户端SDK,它适用于大多数的流行语言。
成员身份表提供程序使用带CAS的Consul的键/值存储功能。当每个silo启动时,它会记录两个KV条目,一个包含Silo的详细信息,另一个保存上一次Silo它还活着的报告(后者是指诊断“我还活着”的条目,而不是直接在silo之间发送且不写入表中的故障检测的心跳)。所有对表的写入都使用CAS执行,以提供并发控制,这是Orleans的集群管理协议所必需的。在Silo运行后,您可以在Web浏览器中的此处查看这些条目,这将显示如下内容:
[
"orleans/MyOrleansDeployment/192.168.1.26:11111@191780753",
"orleans/MyOrleansDeployment/192.168.1.26:11111@191780753/iamalive"
]
您会注意到键是以“orleans/”为前缀的,这在提供程序中是硬编码的,旨在避免键空间与Consul的其他用户发生冲突。每个键都可以通过将其键名称(当然没有引用)附加到Consul KV根,来实现读取。这样做,会为您呈现以下内容:
[
{
"LockIndex": 0,
"Key": "orleans/MyOrleansDeployment/192.168.1.26:22222@191780753",
"Flags": 0,
"Value": "[BASE64 UTF8 Encoded String]",
"CreateIndex": 10,
"ModifyIndex": 12
}
]
解码字符串,为您提供实际的Orleans成员身份的数据:
http://localhost:8500/v1/KV/orleans/MyOrleansDeployment/[SiloAddress]
{
"Hostname": "[YOUR_MACHINE_NAME]",
"ProxyPort": 22222,
"StartTime": "2016-01-29T16:25:54.9538838Z",
"Status": 3,
"SuspectingSilos": []
}
http://localhost:8500/v1/KV/orleans/MyOrleansDeployment/[SiloAddress]/IAmAlive
"2016-01-29T16:35:58.9193803Z"
当客户端连接时,它们使用uri,在一个HTTP GET中读取集群中所有silo的KV http://192.168.1.26:8500/v1/KV/orleans/MyOrleansDeployment/?recurse
。
Consul KV目前不支持原子更新。因此,Orleans Consul成员身份提供程序,只实现了基本的Orleans成员身份协议,并不支持扩展成员资格协议,如这里的描述。此扩展协议是作为附加但非必要的silo连接验证而引入的,并作为尚未实现的功能的基础。如果您的基础架构配置正确,您将不会因缺乏支持而受到任何不利影响。
Consul的键值对目前尚未在Consul数据中心之间进行复制。有一个单独的项目来解决这个问题,但尚未证明它可以支持奥尔良。
当Consul在Windows上启动时,它会记录以下消息:
==> WARNING: Windows is not recommended as a Consul server. Do not use in production.
这仅仅是因为在Windows环境中运行时,对测试的程度不够充分,而不是因为任何实际已知问题而显示。在决定Consul是否适合您之前,请先阅读此处的讨论。
1)证明Consul KV复制项目,能够在WAN环境中的多个Consul数据中心之间,支持Orleans集群。
2)在Consul中实施提醒器表。
3)实施扩展成员协议。Consul背后的团队确实计划实施原子操作,一旦此功能可用,就可以消除提供程序的限制。