由于工作的契機(jī),最近學(xué)習(xí)了下Gossip,以及go語(yǔ)言的實(shí)現(xiàn)版本HashiCorp/memberlist。網(wǎng)上有個(gè)最基本的memberlist使用的example,在下邊的鏈接中,感興趣可以按照文檔運(yùn)行下感受感受。本文主要講解memberlist v0.1.5 的使用細(xì)節(jié)。
讓客戶(hù)滿(mǎn)意是我們工作的目標(biāo),不斷超越客戶(hù)的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶(hù),將通過(guò)不懈努力成為客戶(hù)在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名與空間、網(wǎng)絡(luò)空間、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、廬江網(wǎng)站維護(hù)、網(wǎng)站推廣。
Gossip是最終一致性協(xié)議,是目前性能最好,容錯(cuò)性最好的分布式協(xié)議。目前Prometheus的告警組件alertmanager、redis、s3、區(qū)塊鏈等項(xiàng)目都有使用Gossip。本文不介紹Gossip原理,大家自行谷歌。
簡(jiǎn)單的幾步即可搭建gossip集群
感謝已經(jīng)有網(wǎng)友為我們實(shí)現(xiàn)了一個(gè)example(
)。
哪里有問(wèn)題,還請(qǐng)大家多多指正
1.Docker項(xiàng)目
網(wǎng)址為 。
介紹:Docker是一種操作系統(tǒng)層面的虛擬化技術(shù),可以在操作系統(tǒng)和應(yīng)用程序之間進(jìn)行隔離,也可以稱(chēng)之為容器。Docker可以在一臺(tái)物理服務(wù)器上快速運(yùn)行一個(gè)或多個(gè)實(shí)例。例如,啟動(dòng)一個(gè)Cent OS操作系統(tǒng),并在其內(nèi)部命令行執(zhí)行指令后結(jié)束,整個(gè)過(guò)程就像自己在操作系統(tǒng)一樣高效。
2.golang項(xiàng)目
網(wǎng)址為 。
介紹:Go語(yǔ)言的早期源碼使用C語(yǔ)言和匯編語(yǔ)言寫(xiě)成。從Go 1.5版本自舉后,完全使用Go語(yǔ)言自身進(jìn)行編寫(xiě)。Go語(yǔ)言的源碼對(duì)了解Go語(yǔ)言的底層調(diào)度有極大的參考意義,建議希望對(duì)Go語(yǔ)言有深入了解的讀者讀一讀。
3.Kubernetes項(xiàng)目
網(wǎng)址為 。
介紹:Google公司開(kāi)發(fā)的構(gòu)建于Docker之上的容器調(diào)度服務(wù),用戶(hù)可以通過(guò)Kubernetes集群進(jìn)行云端容器集群管理。
4.etcd項(xiàng)目
網(wǎng)址為 。
介紹:一款分布式、可靠的KV存儲(chǔ)系統(tǒng),可以快速進(jìn)行云配置。
5.beego項(xiàng)目
網(wǎng)址為 。
介紹:beego是一個(gè)類(lèi)似Python的Tornado框架,采用了RESTFul的設(shè)計(jì)思路,使用Go語(yǔ)言編寫(xiě)的一個(gè)極輕量級(jí)、高可伸縮性和高性能的Web應(yīng)用框架。
6.martini項(xiàng)目
網(wǎng)址為 。
介紹:一款快速構(gòu)建模塊化的Web應(yīng)用的Web框架。
7.codis項(xiàng)目
網(wǎng)址為 Labs/codis。
介紹:國(guó)產(chǎn)的優(yōu)秀分布式Redis解決方案。
8.delve項(xiàng)目
網(wǎng)址為 。
介紹:Go語(yǔ)言強(qiáng)大的調(diào)試器,被很多集成環(huán)境和編輯器整合。
有時(shí)候需要處理很多請(qǐng)求,顯然,一個(gè)一個(gè)去處理是要花費(fèi)很多時(shí)間的
我們就需要用到并發(fā)的方式,python并發(fā)請(qǐng)求的方法很多,從簡(jiǎn)單到復(fù)雜。
接口參數(shù)狠簡(jiǎn)單,headers、body,帶上cookie就好了
因?yàn)槭遣樵?xún)一組數(shù)據(jù),所有先把查詢(xún)對(duì)象變量化(可以寫(xiě)到excel里去讀,這里就不介紹了,提供這個(gè)思路)
構(gòu)造頭信息,直接復(fù)制
執(zhí)行請(qǐng)求步驟,這一步是核心內(nèi)容
git地址:
cobra是一個(gè)提供簡(jiǎn)單接口來(lái)創(chuàng)建強(qiáng)大的現(xiàn)代CLI界面的庫(kù)類(lèi)似git git tools,cobra也是一個(gè)應(yīng)用程序,它會(huì)生成你的應(yīng)用程序的腳手架來(lái)快速開(kāi)發(fā)基于cobra的應(yīng)用程序
cobra提供:
cobra建立在命令、參數(shù)、標(biāo)志的結(jié)構(gòu)之上
commands代表動(dòng)作,args是事物,flags是動(dòng)作的修飾符
最好的應(yīng)用程序在使用時(shí)讀起來(lái)就像句子,因此,用戶(hù)直觀地知道如何與它們交互
模式如下:APPNAME VERB NOUN --ADJECTIVE. or APPNAME COMMAND ARG --FLAG(APPNAME 動(dòng)詞 名詞 形容詞 或者 APPNAME 命令 參數(shù) 標(biāo)志)
一些真實(shí)世界的好例子可以更好地說(shuō)明這一點(diǎn)
kubectl 命令更能體現(xiàn)APPNAME 動(dòng)詞 名詞 形容詞
如下的例子,server 是command,port是flag
這個(gè)命令中,我們告訴git 克隆url
命令是應(yīng)用程序的中心點(diǎn),應(yīng)用程序支持的每一個(gè)交互都包含在一個(gè)命令中,命令可以有子命令,也可以運(yùn)行操作
在上面的例子中,server是命令
更多關(guān)于cobra.Command
flag是一種修改命令行為的方式,cobra支持完全兼容POSIX標(biāo)志,也支持go flag package,cobra可以定義到子命令上的標(biāo)志,也可以?xún)H對(duì)該命令可用的標(biāo)志
在上面的命令中,port是標(biāo)志
標(biāo)志的功能由 pflag library 提供,pflag library是flag標(biāo)準(zhǔn)庫(kù)的一個(gè)分支,在添加POSIX兼容性的同時(shí)維護(hù)相同的接口。
使用cobra很簡(jiǎn)單,首先,使用go get按照最新版本的庫(kù),這個(gè)命令會(huì)安裝cobra可執(zhí)行程序以及庫(kù)和依賴(lài)項(xiàng)
下一步,引入cobra到應(yīng)用程序中
雖然歡迎您提供自己的組織,但通?;贑obra的應(yīng)用程序?qū)⒆裱韵陆M織結(jié)構(gòu):
在Cobra應(yīng)用程序中,main.go文件通常非常簡(jiǎn)單。它有一個(gè)目的:初始化Cobra。
使用cobra生成器
cobra提供了程序用來(lái)創(chuàng)建你的應(yīng)用程序然后添加你想添加的命令,這是將cobra引入應(yīng)用程序最簡(jiǎn)單的方式
這兒 你可以發(fā)現(xiàn)關(guān)于cobra的更多信息
要手動(dòng)實(shí)現(xiàn)cobra,需要?jiǎng)?chuàng)建一個(gè)main.go 和rootCmd文件,可以根據(jù)需要提供其他命令
Cobra不需要任何特殊的構(gòu)造器。只需創(chuàng)建命令。
理想情況下,您可以將其放在app/cmd/root.go中:
在init()函數(shù)中定義標(biāo)志和處理配置
例子如下,cmd/root.go:
創(chuàng)建main.go
使用root命令,您需要讓主函數(shù)執(zhí)行它。為清楚起見(jiàn),Execute應(yīng)該在根目錄下運(yùn)行,盡管它可以在任何命令上調(diào)用。
在Cobra應(yīng)用程序中,main.go文件通常非常簡(jiǎn)單。它有一個(gè)目的:初始化Cobra。
可以定義其他命令,通常每個(gè)命令在cmd/目錄中都有自己的文件。
如果要?jiǎng)?chuàng)建版本命令,可以創(chuàng)建cmd/version.go并用以下內(nèi)容填充它:
如果希望將錯(cuò)誤返回給命令的調(diào)用者,可以使用RunE。
然后可以在execute函數(shù)調(diào)用中捕獲錯(cuò)誤。
標(biāo)志提供修飾符來(lái)控制操作命令的操作方式。
由于標(biāo)志是在不同的位置定義和使用的,因此我們需要在外部定義一個(gè)具有正確作用域的變量來(lái)分配要使用的標(biāo)志。
有兩種不同的方法來(lái)分配標(biāo)志。
標(biāo)志可以是“持久”的,這意味著該標(biāo)志將可用于分配給它的命令以及該命令下的每個(gè)命令。對(duì)于全局標(biāo)志,在根上指定一個(gè)標(biāo)志作為持久標(biāo)志。
也可以在本地分配一個(gè)標(biāo)志,該標(biāo)志只應(yīng)用于該特定命令。
默認(rèn)情況下,Cobra只解析目標(biāo)命令上的本地標(biāo)志,而忽略父命令上的任何本地標(biāo)志。通過(guò)啟用Command.TraverseChildren,Cobra將在執(zhí)行目標(biāo)命令之前解析每個(gè)命令上的本地標(biāo)志。
使用viper綁定標(biāo)志
在本例中,持久標(biāo)志author與viper綁定。注意:當(dāng)用戶(hù)未提供--author標(biāo)志時(shí),變量author將不會(huì)設(shè)置為config中的值。
更多關(guān)于 viper的文檔
Flags默認(rèn)是可選的,如果希望命令在未設(shè)置標(biāo)志時(shí)報(bào)告錯(cuò)誤,請(qǐng)根據(jù)需要進(jìn)行標(biāo)記:
持久性Flags
可以使用命令的Args字段指定位置參數(shù)的驗(yàn)證。
內(nèi)置了以下驗(yàn)證器:
在下面的示例中,我們定義了三個(gè)命令。兩個(gè)是頂級(jí)命令,一個(gè)(cmdTimes)是頂級(jí)命令之一的子命令。在這種情況下,根是不可執(zhí)行的,這意味著需要一個(gè)子命令。這是通過(guò)不為“rootCmd”提供“Run”來(lái)實(shí)現(xiàn)的。
我們只為一個(gè)命令定義了一個(gè)標(biāo)志。
有關(guān)標(biāo)志的更多文檔,請(qǐng)?jiān)L問(wèn)
對(duì)于一個(gè)更完整的例子更大的應(yīng)用程序,請(qǐng)檢查 Hugo 。
當(dāng)您有子命令時(shí),Cobra會(huì)自動(dòng)將help命令添加到應(yīng)用程序中。當(dāng)用戶(hù)運(yùn)行“應(yīng)用程序幫助”時(shí),將調(diào)用此函數(shù)。此外,help還支持所有其他命令作為輸入。例如,您有一個(gè)名為“create”的命令,沒(méi)有任何附加配置;調(diào)用“app help create”時(shí),Cobra將起作用。每個(gè)命令都會(huì)自動(dòng)添加“-help”標(biāo)志。
以下輸出由Cobra自動(dòng)生成。除了命令和標(biāo)志定義之外,不需要任何東西。
幫助就像其他命令一樣。它周?chē)鷽](méi)有特殊的邏輯或行為。事實(shí)上,你可以提供你想提供的。
您可以為默認(rèn)命令提供自己的幫助命令或模板,以用于以下功能:
當(dāng)用戶(hù)提供無(wú)效的標(biāo)志或無(wú)效的命令時(shí),Cobra通過(guò)向用戶(hù)顯示“用法”來(lái)響應(yīng)。
你可以從上面的幫助中認(rèn)識(shí)到這一點(diǎn)。這是因?yàn)槟J(rèn)幫助將用法作為其輸出的一部分嵌入。
您可以提供自己的使用函數(shù)或模板供Cobra使用。與幫助一樣,函數(shù)和模板也可以通過(guò)公共方法重寫(xiě):
如果在root命令上設(shè)置了version字段,Cobra會(huì)添加一個(gè)頂級(jí)的'--version'標(biāo)志。運(yùn)行帶有“-version”標(biāo)志的應(yīng)用程序?qū)⑹褂冒姹灸0鍖姹敬蛴〉綐?biāo)準(zhǔn)輸出。可以使用cmd.SetVersionTemplate(s string)函數(shù)自定義模板。
可以在命令的主運(yùn)行函數(shù)之前或之后運(yùn)行函數(shù)。PersistentPreRun和PreRun函數(shù)將在運(yùn)行之前執(zhí)行。PersistentPostRun和PostRun將在運(yùn)行后執(zhí)行。如果子函數(shù)不聲明自己的函數(shù),則它們將繼承Persistent*Run函數(shù)。這些函數(shù)按以下順序運(yùn)行:
輸出:
當(dāng)發(fā)生“未知命令”錯(cuò)誤時(shí),Cobra將打印自動(dòng)建議。這使得Cobra在發(fā)生拼寫(xiě)錯(cuò)誤時(shí)的行為類(lèi)似于git命令。例如:
基于注冊(cè)的每個(gè)子命令和Levenshtein距離的實(shí)現(xiàn),建議是自動(dòng)的。匹配最小距離2(忽略大小寫(xiě))的每個(gè)已注冊(cè)命令都將顯示為建議。
如果需要在命令中禁用建議或調(diào)整字符串距離,請(qǐng)使用:
or
您還可以使用SuggestFor屬性顯式設(shè)置將為其建議給定命令的名稱(chēng)。這允許對(duì)在字符串距離方面不接近的字符串提供建議,但在您的一組命令中是有意義的,并且對(duì)于某些您不需要?jiǎng)e名的字符串。例子:
Cobra可以基于子命令、標(biāo)志等生成文檔。請(qǐng)?jiān)?docs generation文檔 中閱讀更多關(guān)于它的信息。
Cobra可以為以下shell生成shell完成文件:bash、zsh、fish、PowerShell。如果您在命令中添加更多信息,這些補(bǔ)全功能將非常強(qiáng)大和靈活。在 Shell Completions 中閱讀更多關(guān)于它的信息。
Cobra is released under the Apache 2.0 license. See LICENSE.txt
當(dāng)您對(duì)外部模塊的存儲(chǔ)庫(kù)進(jìn)行了 fork (例如修復(fù)模塊代碼中的問(wèn)題或添加功能)時(shí),您可以讓 Go 工具將您的 fork 用于模塊的源代碼。這對(duì)于測(cè)試您自己的代碼的更改很有用。
為此,您可以使用go.mod 文件中的replace指令將外部模塊的原始模塊路徑替換為存儲(chǔ)庫(kù)中 fork 的路徑。這指示 Go 工具在編譯時(shí)使用替換路徑(fork 的位置),例如,同時(shí)允許您保留import 原始模塊路徑中的語(yǔ)句不變。
在以下 go.mod 文件示例中,當(dāng)前模塊需要外部模塊example.com/theirmodule。然后該replace指令將原始模塊路徑替換為example.com/myfork/theirmodule模塊自己的存儲(chǔ)庫(kù)的分支。
設(shè)置require/replace對(duì)時(shí),使用 Go 工具命令確保文件描述的需求保持一致。使用go list命令獲取當(dāng)前模塊正在使用的版本。然后使用go mod edit命令將需要的模塊替換為fork:
注意: 當(dāng)您使用該replace指令時(shí),Go 工具不會(huì)像添加依賴(lài)項(xiàng)中所述對(duì)外部模塊進(jìn)行身份驗(yàn)證。
您可以使用go get命令從其存儲(chǔ)庫(kù)中的特定提交為模塊添加未發(fā)布的代碼。
為此,您使用go get命令,用符號(hào)@指定您想要的代碼 。當(dāng)您使用go get時(shí),該命令將向您的 go.mod 文件添加一個(gè) 需要外部模塊的require指令,使用基于有關(guān)提交的詳細(xì)信息的偽版本號(hào)。
以下示例提供了一些說(shuō)明。這些基于源位于 git 存儲(chǔ)庫(kù)中的模塊。
當(dāng)您的代碼不再使用模塊中的任何包時(shí),您可以停止將該模塊作為依賴(lài)項(xiàng)進(jìn)行跟蹤。
要停止跟蹤所有未使用的模塊,請(qǐng)運(yùn)行g(shù)o mod tidy 命令。此命令還可能添加在模塊中構(gòu)建包所需的缺失依賴(lài)項(xiàng)。
要?jiǎng)h除特定依賴(lài)項(xiàng),請(qǐng)使用go get,指定模塊的模塊路徑并附加 @none,如下例所示:
go get命令還將降級(jí)或刪除依賴(lài)于已刪除模塊的其他依賴(lài)項(xiàng)。
當(dāng)您使用 Go 工具處理模塊時(shí),這些工具默認(rèn)從 proxy.golang.org(一個(gè)公共的 Google 運(yùn)行的模塊鏡像)或直接從模塊的存儲(chǔ)庫(kù)下載模塊。您可以指定 Go 工具應(yīng)該使用另一個(gè)代理服務(wù)器來(lái)下載和驗(yàn)證模塊。
如果您(或您的團(tuán)隊(duì))已經(jīng)設(shè)置或選擇了您想要使用的不同模塊代理服務(wù)器,您可能想要這樣做。例如,有些人設(shè)置了模塊代理服務(wù)器,以便更好地控制依賴(lài)項(xiàng)的使用方式。
要為 Go 工具指定另一個(gè)模塊代理服務(wù)器,請(qǐng)將GOPROXY 環(huán)境變量設(shè)置為一個(gè)或多個(gè)服務(wù)器的 URL。Go 工具將按照您指定的順序嘗試每個(gè) URL。默認(rèn)情況下,GOPROXY首先指定一個(gè)公共的 Google 運(yùn)行模塊代理,然后從模塊的存儲(chǔ)庫(kù)直接下載(在其模塊路徑中指定):
您可以將變量設(shè)置為其他模塊代理服務(wù)器的 URL,用逗號(hào)或管道分隔 URL。
Go 模塊經(jīng)常在公共互聯(lián)網(wǎng)上不可用的版本控制服務(wù)器和模塊代理上開(kāi)發(fā)和分發(fā)。您可以設(shè)置 GOPRIVATE環(huán)境變量。您可以設(shè)置GOPRIVATE環(huán)境變量來(lái)配置go命令以從私有源下載和構(gòu)建模塊。然后 go 命令可以從私有源下載和構(gòu)建模塊。
GOPRIVATE或環(huán)境變量可以設(shè)置為匹配模塊前綴的全局模式列表,這些GONOPROXY前綴是私有的,不應(yīng)從任何代理請(qǐng)求。例如: