Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用C# 和Consul进行分布式系统协调

使用C# 和Consul进行分布式系统协调

作者头像
张善友
发布于 2018-01-19 02:44:51
发布于 2018-01-19 02:44:51
1.9K0
举报
文章被收录于专栏:张善友的专栏张善友的专栏

随着大数据时代的到来,分布式是解决大数据问题的一个主要手段,随着越来越多的分布式的服务,如何在分布式的系统中对这些服务做协调变成了一个很棘手的问题。今天我们就来看看如何使用C# ,利用开源对分布式服务做协调。

在对分布式的应用做协调的时候,主要会碰到以下的应用场景:

  • 业务发现(service discovery)

找到分布式系统中存在那些可用的服务和节点

  • 名字服务 (name service)

通过给定的名字知道到对应的资源

  • 配置管理 (configuration management)

如何在分布式的节点中共享配置文件,保证一致性。

  • 故障发现和故障转移 (failure detection and failover)

当某一个节点出故障的时候,如何检测到并通知其它节点, 或者把想用的服务转移到其它的可用节点

  • 领导选举(leader election)

如何在众多的节点中选举一个领导者,来协调所有的节点

  • 分布式的锁 (distributed exclusive lock)

如何通过锁在分布式的服务中进行同步

  • 消息和通知服务 (message queue and notification)

如何在分布式的服务中传递消息,以通知的形式对事件作出主动的响应

Consul

Consul是用Go开发的分布式服务协调管理的工具,它提供了服务发现,健康检查,Key/Value存储等功能,并且支持跨数据中心的功能。consul提供的一些关键特性:

  • service discovery:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。
  • health checking:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
  • key/value storage:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。
  • multi-datacenter:无需复杂的配置,即可支持任意数量的区域。

Consul基于HTTP的API可以方便的和各种语言进行绑定,C# 语言绑定https://github.com/PlayFab/consuldotnet

Consul在Cluster上的每一个节点都运行一个Agent,这个Agent可以使用Server或者Client模式。Client负责到Server的高效通信,相对为无状态的。 Server负责包括选举领导节点,维护cluster的状态,对所有的查询做出响应,跨数据中心的通信等等。

consul官网已经有编译好的二进制包,支持各种平台:win、linux等等,下载符合你平台的软件包:在这里,下载包:0.5.2_windows_386.zip。解压完毕后只有一个consul文件。

代码语言:js
AI代码解释
复制
D:\GitHub\consuldotnet\Consul.Test>consul
usage: consul [--version] [--help] <command> [<args>]
Available commands are:
agent Runs a Consul agent
configtest Validate config file
event Fire a new event
exec Executes a command on Consul nodes
force-leave Forces a member of the cluster to enter the "left" state
info Provides debugging information for operators
join Tell Consul agent to join cluster
keygen Generates a new encryption key
keyring Manages gossip layer encryption keys
leave Gracefully leaves the Consul cluster and shuts down
lock Execute a command holding a lock
maint Controls node or service maintenance mode
members Lists the members of a Consul cluster
monitor Stream logs from a Consul agent
reload Triggers the agent to reload configuration files
version Prints the Consul version
watch Watch for changes in Consul

consul安装完毕后,agent就可以启动了,agent可以运行在server或者client模式,每个数据中心至少有一个agent运行在server模式,一般建议是3或者5个server。部署单个server是非常不好的,因为在失败场景中出现数据丢失是不可避免的。本文涵盖的是创建一个新的数据中心,所有其他的agents都运行在client模式,这是一个非常轻量级的服务注册进程,它会运行健康监测,并将查询结果转发到服务。agent必须运行在集群中的每一个节点上。

代码语言:js
AI代码解释
复制
consul.exe agent -config-file test_config.json

我们先运行一个agent在server模式:

代码语言:js
AI代码解释
复制
D:\GitHub\consuldotnet\Consul.Test> consul.exe agent -config-file test_config.json
==> WARNING: Bootstrap mode enabled! Do not enable unless necessary
==> WARNING: Windows is not recommended as a Consul server. Do not use in production.
==> WARNING: It is highly recommended to set GOMAXPROCS higher than 1
==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Consul agent running!
Node name: 'GEFFZHANG-NB'
Datacenter: 'dc1'
Server: true (bootstrap: true)
Client Addr: 127.0.0.1 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400)
Cluster Addr: 192.168.1.4 (LAN: 8301, WAN: 8302)
Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false
Atlas: <disabled>
==> Log data will now stream in as it occurs:
2015/08/09 09:14:48 [INFO] serf: EventMemberJoin: GEFFZHANG-NB 192.168.1.4
2015/08/09 09:14:48 [INFO] serf: EventMemberJoin: GEFFZHANG-NB.dc1 192.168.1.4
2015/08/09 09:14:48 [INFO] raft: Node at 192.168.1.4:8300 [Follower] entering Follower state
2015/08/09 09:14:48 [INFO] consul: adding server GEFFZHANG-NB (Addr: 192.168.1.4:8300) (DC: dc1)
2015/08/09 09:14:48 [INFO] consul: adding server GEFFZHANG-NB.dc1 (Addr: 192.168.1.4:8300) (DC: dc1)
2015/08/09 09:14:48 [ERR] agent: failed to sync remote state: No cluster leader
2015/08/09 09:14:50 [WARN] raft: Heartbeat timeout reached, starting election
2015/08/09 09:14:50 [INFO] raft: Node at 192.168.1.4:8300 [Candidate] entering Candidate state
2015/08/09 09:14:50 [DEBUG] raft: Votes needed: 1
2015/08/09 09:14:50 [DEBUG] raft: Vote granted. Tally: 1
2015/08/09 09:14:50 [INFO] raft: Election won. Tally: 1
2015/08/09 09:14:50 [INFO] raft: Node at 192.168.1.4:8300 [Leader] entering Leader state
2015/08/09 09:14:50 [INFO] consul: cluster leadership acquired
2015/08/09 09:14:50 [INFO] consul: New leader elected: GEFFZHANG-NB
2015/08/09 09:14:50 [INFO] raft: Disabling EnableSingleNode (bootstrap)
2015/08/09 09:14:50 [DEBUG] raft: Node 192.168.1.4:8300 updated peer set (2): [192.168.1.4:8300]
2015/08/09 09:14:50 [DEBUG] consul: reset tombstone GC to index 2
2015/08/09 09:14:50 [INFO] consul: member 'GEFFZHANG-NB' joined, marking health alive
2015/08/09 09:14:51 [INFO] agent: Synced service 'consul'
2015/08/09 09:16:03 [DEBUG] agent: Service 'consul' in sync
2015/08/09 09:17:30 [DEBUG] agent: Service 'consul' in sync
2015/08/09 09:18:38 [DEBUG] agent: Service 'consul' in sync
2015/08/09 09:19:47 [DEBUG] http: Request /v1/status/peers (0)
2015/08/09 09:19:52 [DEBUG] agent: Service 'consul' in sync

正如你看到的一样,consul agent已经启动了,并且打印了一些日志到终端上,从日志中可以看到我们的agent已经运行在server模式了,并且已经是整个集群的领导节点。而且,本地成员已经被标记为集群中的健康成员了。这时候你在另一个终端中运行consul members就可以看到整个集群中的成员了。这时候你只能看到你自己,因为我们的集群中还没加入其他成员。

输出已经显示了你自己的节点信息,有地址信息、健康状况、在集群中的角色、以及一些版本信息,如果要查看一些metadata,则可以加入-detailed标记

consul members命令输出的信息是基于gossip协议产生的,并且最终一致的。

KV基本操作

Consul提供了一个简单的K/V存储系统,这可以用来动态获取配置、进行服务协调、主节点选举,其他开发人员能想到的build过程等等。

代码语言:js
AI代码解释
复制
var client = new Client();
var kv = client.KV;
var key = GenerateTestKeyName();
var value = Encoding.UTF8.GetBytes("test");
var getRequest = kv.Get(key);
Assert.IsNull(getRequest.Response);
var pair = new KVPair(key)
{
Flags = 42,
Value = value
};
var putRequest = kv.Put(pair);
Assert.IsTrue(putRequest.Response);
getRequest = kv.Get(key);
var res = getRequest.Response;
Assert.IsNotNull(res);
Assert.IsTrue(StructuralComparisons.StructuralEqualityComparer.Equals(value, res.Value));
Assert.AreEqual(pair.Flags, res.Flags);
Assert.IsTrue(getRequest.LastIndex > 0);
var del = kv.Delete(key);
Assert.IsTrue(del.Response);
getRequest = kv.Get(key);
Assert.IsNull(getRequest.Response);

服务发现(Service Discovery)和健康检查(Health Check)

Consul的另一个主要的功能是用于对分布式的服务做管理,用户可以注册一个服务,同时还提供对服务做健康检测的功能。

服务定义:一个服务可以通过提供服务定义配置文件或者通过调用HTTP API来动态的增加、删除、修改服务。

服务查询:一旦agent启动后,并且服务已经同步,我们就可以使用DNS或者HTTP API来进行查询了。

服务升级:服务定义的升级可以通过先修改服务定义配置文件,然后给agent发送一个SIGHUP信号即可,这样允许你在升级服务时,而不会产生agent宕机时间或者服务不可达。或者通过HTTP API接口来动态的增加、删除、修改服务。

Consul支持三种Check的模式:

  • 调用一个外部脚本(Script),在该模式下,consul定时会调用一个外部脚本,通过脚本的返回内容获得对应服务的健康状态。
  • 调用HTTP,在该模式下,consul定时会调用一个HTTP请求,返回2XX,则为健康;429 (Too many request)是警告。其它均为不健康
  • 主动上报,在该模式下,服务需要主动调用一个consul提供的HTTP PUT请求,上报健康状态。

C# API提供对应的接口

  • Client.Agent.Service
  • Client.Agent.Check

Consul的Health Check,通过调用脚本,HTTP或者主动上报的方式检查服务的状态,更为灵活,可以获得等多的信息,但是也需要做更多的工作。

故障检测(Failure Detection)

Consul提供Session的概念,利用Session可以检查服务是否存活。对每一个服务我们都可以创建一个session对象,注意这里我们设置了ttl,consul会以ttl的数值为间隔时间,持续的对session的存活做检查。对应的在服务中,我们需要持续的renew session,保证session是合法的。

代码语言:js
AI代码解释
复制
var client = new Client();
var sessionRequest = client.Session.Create(new SessionEntry() { TTL = TimeSpan.FromSeconds(10) });
var id = sessionRequest.Response;
Assert.IsTrue(sessionRequest.RequestTime.TotalMilliseconds > 0);
Assert.IsFalse(string.IsNullOrEmpty(sessionRequest.Response));
var tokenSource = new CancellationTokenSource();
var ct = tokenSource.Token;
client.Session.RenewPeriodic(TimeSpan.FromSeconds(1), id, WriteOptions.Empty, ct);
tokenSource.CancelAfter(3000);
Task.Delay(3000, ct).Wait(ct);
var infoRequest = client.Session.Info(id);
Assert.IsTrue(infoRequest.LastIndex > 0);
Assert.IsNotNull(infoRequest.KnownLeader);
Assert.AreEqual(id, infoRequest.Response.ID);
Assert.IsTrue(client.Session.Destroy(id).Response);

这里注意,因为是基于ttl(最小10秒)的检测,从业务中断到被检测到,至少有10秒的时延,对应需要实时响应的情景,并不适用。

领导选举和分布式的锁

这篇文档介绍了如何利用Consul的KV存储来实现Leader Election,利用Consul的KV功能,可以很方便的实现领导选举和锁的功能。

WEB UI

consul同样也支持web界面,这个UI可以用来查看所有的服务和节点,所有的健康检测和它们当前的状态,读取设置K/V系统的值。UI默认自动支持多datacenter。这些UI是静态html你不需要单独运行一个web服务器,consul agent本身可以配置一个web服务。

下载UI组件:WEB UI

        下载完成后是一个0.5.2_web_ui.zip压缩文件,解压后是一个dist目录。然后添加-ui-dir参数和-client参数重新启动agent。

代码语言:js
AI代码解释
复制
D:\GitHub\consuldotnet\Consul.Test> consul.exe agent -config-file test_config.json -ui-dir=
D:\GitHub\consuldotnet\Consul.Test\0.5.2_web_ui\dist

在浏览器中输入http://127.0.0.1:8500,即可访问UI了

有services、nodes、K/V、acl、datacenter的管理,很完善的一个系统了。

总结

Consul作为使用Go语言开发的分布式协调,对业务发现的管理提供很好的支持,他的HTTP API也能很好的和不同的语言绑定,并支持跨数据中心的应用。缺点是相对较新,适合喜欢尝试新事物的用户。

https://github.com/anurse/Consulate

https://github.com/geffzhang/Consul-IO-WindowsDemo

https://github.com/catwithboots/Hortlak

https://github.com/catwithboots/Orek

https://github.com/geffzhang/Pk.OrleansUtils

http://blog.csdn.net/u010246789/article/category/6286612 

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-08-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Consul 的安装和配置(一)
Consul是一个开源的分布式服务发现和配置管理工具。它提供了一个分布式的、高可用的数据存储,可以用来存储键值对、配置数据、服务发现信息等。同时,Consul还提供了HTTP和DNS接口,可以用来查询服务、配置和健康状态等信息。
堕落飞鸟
2023/04/17
2.9K0
基于consul的Redis高可用方案
这几天在研究如何做Redis的高可用容灾方案,查询了资料和咨询DBA同行,了解到Redis可以基于consul和sentinel实现读写分离以及HA高可用方案。本文讲述基于consul的Redis高可用方案实践。
用户1278550
2018/08/09
3.1K0
Consul 学习总结
Consul是一种服务网络解决方案,使团队能够管理服务之间以及跨本地和多云环境和运行时的安全网络连接。Consul提供服务发现、服务网格(service mesh)、流量管理和网络基础设施设备的自动更新。可以在单个Consul部署中单独或一起使用这些功能。
授客
2024/12/14
2830
Consul 学习总结
服务发现之consul的介绍、部署和使用
微服务的框架体系中,服务发现是不能不提的一个模块。我相信了解或者熟悉微服务的童鞋应该都知道它的重要性。这里我只是简单的提一下,毕竟这不是我们的重点。我们看下面的一幅图片:
sunsky
2020/08/20
1.8K0
基于Consul的分布式锁实现
我们在构建分布式系统的时候,经常需要控制对共享资源的互斥访问。这个时候我们就涉及到分布式锁(也称为全局锁)的实现,基于目前的各种工具,我们已经有了大量的实现方式,比如:基于Redis的实现、基于Zookeeper的实现。本文将介绍一种基于Consul 的Key/Value存储来实现分布式锁以及信号量的方法。 分布式锁实现 基于Consul的分布式锁主要利用Key/Value存储API中的acquire和release操作来实现。acquire和release操作是类似Check-And-Set的操作: -
程序猿DD
2018/02/01
2.3K0
基于Consul的分布式锁实现
Consul 基础3
每一个数据中心必须有至少一个服务节点,3到5个服务节点最好,非常不建议只运行一个服务节点,因为在节点失效的情况下数据有极大的丢失风险
franket
2021/12/01
2800
Prometheus 通过 consul 分布式集群实现自动服务发现
本次演示环境,我是在虚拟机上安装 Linux 系统来执行操作,以下是安装的软件及版本:
哎_小羊
2020/04/08
2.3K0
Prometheus 通过 consul 分布式集群实现自动服务发现
Consul 基础7
Consul 会加载配置目录中的所有配置文件,配置文件是以 .json 结尾的,并且以字典顺序加载
franket
2021/12/01
2160
Consul1.7 多数据中心 新Hashicorp学习指南
在微服务化的趋势下,为了最大限度增加扩容缩容的灵活性,名字服务和服务发现等方式就越来越受到青睐了。目前,主流的服务发现组件有:consul、etcd、zookeeper,其中的区别这里就不展开说明了,可以在官网查看这些服务之间的区别。
公众号: 云原生生态圈
2021/11/15
1.4K0
Consul1.7 多数据中心 新Hashicorp学习指南
Consul 入门教程
微服务的框架体系中,服务发现是不能不提的一个模块。我相信了解或者熟悉微服务的童鞋应该都知道它的重要性。这里我只是简单的提一下,毕竟这不是我们的重点。我们看下面的一幅图片:
菲宇
2019/06/12
48.4K1
Consul 入门教程
Web基础配置篇(十五): Consul单机、集群的安装使用及作为配置中心使用
Consul是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控)解决方案,它是一个一个分布式的,高度可用的系统,而且开发使用都很简便。它提供了一个功能齐全的控制平面,主要特点是:服务发现、健康检查、键值存储、安全服务通信、多数据中心。
品茗IT
2020/05/28
2.4K0
Spring Cloud(二)Consul 服务治理实现
Spring Cloud Consul 项目是针对Consul的服务治理实现。Consul是一个分布式高可用的系统,具有分布式、高可用、高扩展性。 Consul 简介 Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,Consul的方案更“一站式” ,内置了服务注册与发现框 架、具有以下性质: 分布一致性协议实现、 健康检查、 Key/Value存储、 多数据中心方案, 不再需要依赖其他工具(比如ZooKeeper等)。 使用起来
程序员鹏磊
2018/02/09
1.5K0
Spring Cloud(二)Consul 服务治理实现
微服务系统consul初探
简单来说,consul就是一个用于微服务治理的系统,什么是微服务,这个大家自行了解。consul的主要功能有如下几个:
tunsuy
2022/10/27
8970
Spring Cloud Consul入门 1. Consul介绍2. 安装3. 启动Consul4. 使用SpringCloud Consul组件
Consul是一套开源的分布式服务发现和配置管理系统,支持多数据中心分布式高可用。Consul是HashiCorp( Vagrant的创建者)开发的一个服务发现与配置项目,用Go语言开发,基于 Mozilla Public License 2.0 的协议开源。
mantou
2019/02/13
1.3K0
Spring Cloud Consul入门
		1. Consul介绍2. 安装3. 启动Consul4. 使用SpringCloud Consul组件
docker+consul+ nginx集成分布式的服务发现与注册架构
Consul是一个分布式、高可用的系统,是一个为了解决在生产环境中服务注册,服务发现,服务配置的一个工具,它有多个组件,提供如下几个关键功能:
不吃小白菜
2020/09/25
1.1K0
Consul+Prometheus系统监控之注册发现
缘起 前面几篇文章分别对系统服务、MySql以及Redis相关软件做了监控预警,但是大家有没有发现,在prometheus.yml里配置需要监听的服务时,我们需要按服务名手动写入,也就是说以后每增加一个服务,就得手动修改此配置,并重启promethues服务。 那么我们如何做到动态的监听服务呢?相信不少接触过分布式框架Dubbo的小伙伴们都知道它是靠zookeeper做注册监听的,最近比较流行的Spring Cloud Netflix的Eureka,consul也是比较常用的注册中心。 参考官方文档con
小柒2012
2018/04/13
6.9K1
Consul+Prometheus系统监控之注册发现
Spring Cloud构建微服务架构:服务注册与发现(Eureka、Consul)【Dalston版】
前言 已经有非常长的时间没有更新《Spring Cloud构建微服务架构》系列文章了,自从开始写Spring Cloud的专题内容开始就获得了不少的阅读量和认可,当然也有一些批评,其中也不乏一些很中肯的意见和深度的问题,对我来说也是进一步提高的契机,在此感谢所有关注我博客的读者们。 由于之前主要精力都花在的编写《Spring Cloud微服务实战》一书上,所以该系列文章就没有得到持续的维护和更新。由于漫长的写书过程和繁琐的出版流程,在本书一面世的时候,在版本上已经落后于当前的最新版本。虽然在书中前前后后加入
程序猿DD
2018/02/01
1.1K0
Spring Cloud构建微服务架构:服务注册与发现(Eureka、Consul)【Dalston版】
Consul 启动命令,Web UI
-bootstrap:启动模式,此模式下,节点可以选举自己为leader,一个数据中心只能有一个此模式启动的节点。机群启动后,新启动的节点不建议使用这种模式。
WindWant
2020/09/11
4.6K0
.netcore consul实现服务注册与发现-单节点部署
    Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,比如 Airbnb的SmartStack等相比,Consul的方案更“一站式”,内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等),使用起来也较 为简单。Consul用Golang实现,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合。
hailang2zh
2019/08/29
9480
.netcore consul实现服务注册与发现-单节点部署
consul配置与实战
上一篇提到,项目用的分布式服务发现与注册组件是consul,这篇文章主要来讲下consul组件在项目中的应用以及相关介绍。本文以官方文档为主要参考consul文档。 1. consul介绍 consul是一个服务管理软件,主要功能如下: 支持多数据中心下,分布式高可用的,服务发现和配置共享。 consul支持健康检查,允许存储键值对。 一致性协议采用 Raft算法,用来保证服务的高可用。 成员管理和消息广播采用 GOSSIP协议,支持ACL访问控制。 1.1 服务注册与发现 服务注册是一个服务将其位置信息在
aoho求索
2018/04/03
2.2K0
consul配置与实战
相关推荐
Consul 的安装和配置(一)
更多 >
LV.1
广东智用人工智能应用研究院CTO
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档