C#中怎么利用Consul實現(xiàn)分布式系統(tǒng)協(xié)調(diào)

這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)C# 中怎么利用Consul實現(xiàn)分布式系統(tǒng)協(xié)調(diào),文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

鄉(xiāng)寧ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!

在對分布式的應(yīng)用做協(xié)調(diào)的時候,主要會碰到以下的應(yīng)用場景:

  • 業(yè)務(wù)發(fā)現(xiàn)(service discovery)

找到分布式系統(tǒng)中存在那些可用的服務(wù)和節(jié)點

  • 名字服務(wù) (name service)

通過給定的名字知道到對應(yīng)的資源

  • 配置管理 (configuration management)

如何在分布式的節(jié)點中共享配置文件,保證一致性。

  • 故障發(fā)現(xiàn)和故障轉(zhuǎn)移 (failure detection and failover)

當某一個節(jié)點出故障的時候,如何檢測到并通知其它節(jié)點, 或者把想用的服務(wù)轉(zhuǎn)移到其它的可用節(jié)點

  • 領(lǐng)導選舉(leader election)

如何在眾多的節(jié)點中選舉一個領(lǐng)導者,來協(xié)調(diào)所有的節(jié)點

  • 分布式的鎖 (distributed exclusive lock)

如何通過鎖在分布式的服務(wù)中進行同步

  • 消息和通知服務(wù) (message queue and notification)

如何在分布式的服務(wù)中傳遞消息,以通知的形式對事件作出主動的響應(yīng)

Consul

Consul是用Go開發(fā)的分布式服務(wù)協(xié)調(diào)管理的工具,它提供了服務(wù)發(fā)現(xiàn),健康檢查,Key/Value存儲等功能,并且支持跨數(shù)據(jù)中心的功能。consul提供的一些關(guān)鍵特性:

  • service discovery:consul通過DNS或者HTTP接口使服務(wù)注冊和服務(wù)發(fā)現(xiàn)變的很容易,一些外部服務(wù),例如saas提供的也可以一樣注冊。

  • health checking:健康檢測使consul可以快速的告警在集群中的操作。和服務(wù)發(fā)現(xiàn)的集成,可以防止服務(wù)轉(zhuǎn)發(fā)到故障的服務(wù)上面。

  • key/value storage:一個用來存儲動態(tài)配置的系統(tǒng)。提供簡單的HTTP接口,可以在任何地方操作。

  • multi-datacenter:無需復雜的配置,即可支持任意數(shù)量的區(qū)域。

Consul基于HTTP的API可以方便的和各種語言進行綁定,C# 語言綁定https://github.com/PlayFab/consuldotnet

C# 中怎么利用Consul實現(xiàn)分布式系統(tǒng)協(xié)調(diào)

Consul在Cluster上的每一個節(jié)點都運行一個Agent,這個Agent可以使用Server或者Client模式。Client負責到Server的高效通信,相對為無狀態(tài)的。 Server負責包括選舉領(lǐng)導節(jié)點,維護cluster的狀態(tài),對所有的查詢做出響應(yīng),跨數(shù)據(jù)中心的通信等等。

consul官網(wǎng)已經(jīng)有編譯好的二進制包,支持各種平臺:win、linux等等,下載符合你平臺的軟件包:在這里,下載包:0.5.2_windows_386.zip。解壓完畢后只有一個consul文件。

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模式,每個數(shù)據(jù)中心至少有一個agent運行在server模式,一般建議是3或者5個server。部署單個server是非常不好的,因為在失敗場景中出現(xiàn)數(shù)據(jù)丟失是不可避免的。本文涵蓋的是創(chuàng)建一個新的數(shù)據(jù)中心,所有其他的agents都運行在client模式,這是一個非常輕量級的服務(wù)注冊進程,它會運行健康監(jiān)測,并將查詢結(jié)果轉(zhuǎn)發(fā)到服務(wù)。agent必須運行在集群中的每一個節(jié)點上。

consul.exe agent -config-file test_config.json

我們先運行一個agent在server模式:

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已經(jīng)啟動了,并且打印了一些日志到終端上,從日志中可以看到我們的agent已經(jīng)運行在server模式了,并且已經(jīng)是整個集群的領(lǐng)導節(jié)點。而且,本地成員已經(jīng)被標記為集群中的健康成員了。這時候你在另一個終端中運行consul members就可以看到整個集群中的成員了。這時候你只能看到你自己,因為我們的集群中還沒加入其他成員。

C# 中怎么利用Consul實現(xiàn)分布式系統(tǒng)協(xié)調(diào)

輸出已經(jīng)顯示了你自己的節(jié)點信息,有地址信息、健康狀況、在集群中的角色、以及一些版本信息,如果要查看一些metadata,則可以加入-detailed標記

C# 中怎么利用Consul實現(xiàn)分布式系統(tǒng)協(xié)調(diào)

consul members命令輸出的信息是基于gossip協(xié)議產(chǎn)生的,并且最終一致的。

KV基本操作

Consul提供了一個簡單的K/V存儲系統(tǒng),這可以用來動態(tài)獲取配置、進行服務(wù)協(xié)調(diào)、主節(jié)點選舉,其他開發(fā)人員能想到的build過程等等。

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);

服務(wù)發(fā)現(xiàn)(Service Discovery)和健康檢查(Health Check)

Consul的另一個主要的功能是用于對分布式的服務(wù)做管理,用戶可以注冊一個服務(wù),同時還提供對服務(wù)做健康檢測的功能。

服務(wù)定義:一個服務(wù)可以通過提供服務(wù)定義配置文件或者通過調(diào)用HTTP API來動態(tài)的增加、刪除、修改服務(wù)。

服務(wù)查詢:一旦agent啟動后,并且服務(wù)已經(jīng)同步,我們就可以使用DNS或者HTTP API來進行查詢了。

服務(wù)升級:服務(wù)定義的升級可以通過先修改服務(wù)定義配置文件,然后給agent發(fā)送一個SIGHUP信號即可,這樣允許你在升級服務(wù)時,而不會產(chǎn)生agent宕機時間或者服務(wù)不可達?;蛘咄ㄟ^HTTP API接口來動態(tài)的增加、刪除、修改服務(wù)。

Consul支持三種Check的模式:

  • 調(diào)用一個外部腳本(Script),在該模式下,consul定時會調(diào)用一個外部腳本,通過腳本的返回內(nèi)容獲得對應(yīng)服務(wù)的健康狀態(tài)。

  • 調(diào)用HTTP,在該模式下,consul定時會調(diào)用一個HTTP請求,返回2XX,則為健康;429 (Too many request)是警告。其它均為不健康

  • 主動上報,在該模式下,服務(wù)需要主動調(diào)用一個consul提供的HTTP PUT請求,上報健康狀態(tài)。

C# API提供對應(yīng)的接口

  • Client.Agent.Service

  • Client.Agent.Check

Consul的Health Check,通過調(diào)用腳本,HTTP或者主動上報的方式檢查服務(wù)的狀態(tài),更為靈活,可以獲得等多的信息,但是也需要做更多的工作。

故障檢測(Failure Detection)

Consul提供Session的概念,利用Session可以檢查服務(wù)是否存活。對每一個服務(wù)我們都可以創(chuàng)建一個session對象,注意這里我們設(shè)置了ttl,consul會以ttl的數(shù)值為間隔時間,持續(xù)的對session的存活做檢查。對應(yīng)的在服務(wù)中,我們需要持續(xù)的renew session,保證session是合法的。

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秒)的檢測,從業(yè)務(wù)中斷到被檢測到,至少有10秒的時延,對應(yīng)需要實時響應(yīng)的情景,并不適用。

領(lǐng)導選舉和分布式的鎖

這篇文檔介紹了如何利用Consul的KV存儲來實現(xiàn)Leader Election,利用Consul的KV功能,可以很方便的實現(xiàn)領(lǐng)導選舉和鎖的功能。

WEB UI

consul同樣也支持web界面,這個UI可以用來查看所有的服務(wù)和節(jié)點,所有的健康檢測和它們當前的狀態(tài),讀取設(shè)置K/V系統(tǒng)的值。UI默認自動支持多datacenter。這些UI是靜態(tài)html你不需要單獨運行一個web服務(wù)器,consul agent本身可以配置一個web服務(wù)。

下載UI組件:WEB UI

下載完成后是一個0.5.2_web_ui.zip壓縮文件,解壓后是一個dist目錄。然后添加-ui-dir參數(shù)和-client參數(shù)重新啟動agent。

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了

C# 中怎么利用Consul實現(xiàn)分布式系統(tǒng)協(xié)調(diào)

有services、nodes、K/V、acl、datacenter的管理,很完善的一個系統(tǒng)了。

上述就是小編為大家分享的C# 中怎么利用Consul實現(xiàn)分布式系統(tǒng)協(xié)調(diào)了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當前標題:C#中怎么利用Consul實現(xiàn)分布式系統(tǒng)協(xié)調(diào)
標題路徑:http://muchs.cn/article28/ghisjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、商城網(wǎng)站域名注冊、全網(wǎng)營銷推廣、移動網(wǎng)站建設(shè)、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作