[轉(zhuǎn)]服務(wù)發(fā)現(xiàn):Zookeeper vs etcd vs Consul

http://dockone.io/article/667

【編者的話】本文對比了Zookeeper萄涯、etcd和Consul三種服務(wù)發(fā)現(xiàn)工具眯杏,探討了最佳的服務(wù)發(fā)現(xiàn)解決方案细移,僅供參考程梦。如果使用預(yù)定義的端口拗引,服務(wù)越多借宵,發(fā)生沖突的可能性越大,畢竟矾削,不可能有兩個服務(wù)監(jiān)聽同一個端口壤玫。管理一個擁擠的比方說被幾百個服務(wù)所使用的所有端口的列表豁护,本身就是一個挑戰(zhàn),添加到該列表后欲间,這些服務(wù)需要的數(shù)據(jù)庫和數(shù)量會日益增多楚里。因此我們應(yīng)該部署無需指定端口的服務(wù),并且讓Docker為我們分配一個隨機的端口猎贴。唯一的問題是我們需要發(fā)現(xiàn)端口號班缎,并且讓別人知道。


當(dāng)我們開始在一個分布式系統(tǒng)上部署服務(wù)到其中一臺服務(wù)器上時嘱能,事情會變得更加復(fù)雜吝梅,我們可以選擇預(yù)先定義哪臺服務(wù)器運行哪個服務(wù)的方式虱疏,但這會導(dǎo)致很多問題惹骂。我們應(yīng)該盡我們所能盡量利用服務(wù)器資源,但是如果預(yù)先定義每個服務(wù)的部署位置做瞪,那么要實現(xiàn)盡量利用服務(wù)器資源是幾乎不可能的对粪。另一個問題是服務(wù)的自動伸縮將會非常困難,更不用說自動恢復(fù)了装蓬,比方說服務(wù)器故障著拭。另一方面,如果我們將服務(wù)部署到某臺只有最少數(shù)量的容器在運行的服務(wù)器上牍帚,我們需要添加IP地址到數(shù)據(jù)列表中儡遮,這些數(shù)據(jù)需要可以被發(fā)現(xiàn)并存儲在某處。
multi-node-docker.png

當(dāng)我們需要存儲和發(fā)現(xiàn)一些與正在工作的服務(wù)相關(guān)的信息時暗赶,還有很多其他的例子鄙币。為了能夠定位服務(wù),我們需要至少接下來的兩個有用的步驟蹂随。服務(wù)注冊——該步驟存儲的信息至少包括正在運行的服務(wù)的主機和端口信息
服務(wù)發(fā)現(xiàn)——該步驟允許其他用戶可以發(fā)現(xiàn)在服務(wù)注冊階段存儲的信息十嘿。

除了上述的步驟,我們還需要考慮其他方面岳锁。如果一個服務(wù)停止工作并部署/注冊了一個新的服務(wù)實例绩衷,那么該服務(wù)是否應(yīng)該注銷呢?當(dāng)有相同服務(wù)的多個副本時咋辦激率?我們該如何做負(fù)載均衡呢咳燕?如果一個服務(wù)器宕機了咋辦?所有這些問題都與注冊和發(fā)現(xiàn)階段緊密關(guān)聯(lián)∑固桑現(xiàn)在招盲,我們限定只在服務(wù)發(fā)現(xiàn)的范圍里(常見的名字,圍繞上述步驟)以及用于服務(wù)發(fā)現(xiàn)任務(wù)的工具聪蘸,它們中的大多數(shù)采用了高可用的分布式鍵/值存儲宪肖。服務(wù)發(fā)現(xiàn)工具
服務(wù)發(fā)現(xiàn)工具的主要目標(biāo)是用來服務(wù)查找和相互對話表制,為此該工具需要知道每個服務(wù),這不是一個新概念控乾,在Docker之前就已經(jīng)存在很多類似的工具了么介,然而,容器帶給了這些工具一個全新水平的需求蜕衡。服務(wù)發(fā)現(xiàn)背后的基本思想是對于服務(wù)的每一個新實例(或應(yīng)用程序)壤短,能夠識別當(dāng)前環(huán)境和存儲相關(guān)信息。存儲的注冊表信息本身通常采用鍵/值對的格式慨仿,由于服務(wù)發(fā)現(xiàn)經(jīng)常用于分布式系統(tǒng)久脯,所以要求這些信息可伸縮、支持容錯和分布式集群中的所有節(jié)點镰吆。這種存儲的主要用途是給所有感興趣的各方提供最起碼諸如服務(wù)IP地址和端口這樣的信息帘撰,用于它們之間的相互通訊,這些數(shù)據(jù)還經(jīng)常擴展到其它類型的信息服務(wù)發(fā)現(xiàn)工具傾向于提供某種形式的API万皿,用于服務(wù)自身的注冊以及服務(wù)信息的查找摧找。比方說我們有兩個服務(wù),一個是提供方牢硅,另一個是第一個服務(wù)的消費者蹬耘,一旦部署了服務(wù)提供方,就需要在服務(wù)發(fā)現(xiàn)注冊表中存儲其信息减余。接著综苔,當(dāng)消費者試圖訪問服務(wù)提供者時,它首先查詢服務(wù)注冊表位岔,使用獲取到的IP地址和端口來調(diào)用服務(wù)提供者如筛。為了與注冊表中的服務(wù)提供方的具體實現(xiàn)解耦,我們常常采用某種代理服務(wù)赃承。這樣消費者總是向固定IP地址的代理請求信息妙黍,代理再依次使用服務(wù)發(fā)現(xiàn)來查找服務(wù)提供方信息并重定向請求,在本文中我們稍后通過反向代理來實現(xiàn)∏破剩現(xiàn)在重要的是要理解基于三種角色(服務(wù)消費者拭嫁、提供者和代理)的服務(wù)發(fā)現(xiàn)流程。服務(wù)發(fā)現(xiàn)工具要查找的是數(shù)據(jù)抓于,至少我們應(yīng)該能夠找出服務(wù)在哪里做粤?服務(wù)是否健康和可用?配置是什么樣的捉撮?既然我們正在多臺服務(wù)器上構(gòu)建一個分布式系統(tǒng)怕品,那么該工具需要足夠健壯,保證其中一個節(jié)點的宕機不會危及數(shù)據(jù)巾遭,同時肉康,每個節(jié)點應(yīng)該有完全相同的數(shù)據(jù)副本闯估,進(jìn)一步地,我們希望能夠以任何順序啟動服務(wù)吼和、殺死服務(wù)或者替換服務(wù)的新版本涨薪,我們還應(yīng)該能夠重新配置服務(wù)并且查看到數(shù)據(jù)相應(yīng)的變化。讓我們看一下一些常用的選項來完成我們上面設(shè)定的目標(biāo)炫乓。手動配置
大多數(shù)服務(wù)仍然是需要手動管理的刚夺,我們預(yù)先決定在何處部署服務(wù)、如何配置和希望不管什么原因末捣,服務(wù)都將繼續(xù)正常工作侠姑,直到天荒地老。這樣的目標(biāo)不是可以輕易達(dá)到的箩做。部署第二個服務(wù)實例意味著我們需要啟動全程的手動處理莽红,我們需要引入一臺新的服務(wù)器,或者找出哪一臺服務(wù)器資源利用率較低卒茬,然后創(chuàng)建一個新的配置集并啟動服務(wù)船老。情況或許會變得越來越復(fù)雜咖熟,比方說圃酵,硬件故障導(dǎo)致的手動管理下的反應(yīng)時間變得很慢♀晒埽可見性是另外一個痛點郭赐,我們知道什么是靜態(tài)配置,畢竟是我們預(yù)先準(zhǔn)備好的确沸,然而捌锭,大多數(shù)的服務(wù)有很多動態(tài)生成的信息,這些信息不是輕易可見的罗捎,也沒有一個單獨的地方供我們在需要時參考這些數(shù)據(jù)观谦。反應(yīng)時間會不可避免的變慢,鑒于存在許多需要手動處理的移動組件桨菜,故障恢復(fù)和監(jiān)控也會變得非常難以管理豁状。盡管在過去或者當(dāng)服務(wù)/服務(wù)器數(shù)量很少的時候有借口不做這項工作,隨著服務(wù)發(fā)現(xiàn)工具的出現(xiàn)倒得,這個借口已經(jīng)不存在了泻红。Zookeeper
Zookeeper是這種類型的項目中歷史最悠久的之一,它起源于Hadoop霞掺,幫助在Hadoop集群中維護(hù)各種組件谊路。它非常成熟、可靠菩彬,被許多大公司(YouTube缠劝、eBay潮梯、雅虎等)使用。其數(shù)據(jù)存儲的格式類似于文件系統(tǒng)惨恭,如果運行在一個服務(wù)器集群中酷麦,Zookeper將跨所有節(jié)點共享配置狀態(tài),每個集群選舉一個領(lǐng)袖喉恋,客戶端可以連接到任何一臺服務(wù)器獲取數(shù)據(jù)沃饶。Zookeeper的主要優(yōu)勢是其成熟、健壯以及豐富的特性轻黑,然而糊肤,它也有自己的缺點,其中采用Java開發(fā)以及復(fù)雜性是罪魁禍?zhǔn)酌ケ伞1M管Java在許多方面非常偉大馆揉,然后對于這種類型的工作還是太沉重了,Zookeeper使用Java以及相當(dāng)數(shù)量的依賴使其對于資源競爭非常饑渴抖拦。因為上述的這些問題升酣,Zookeeper變得非常復(fù)雜,維護(hù)它需要比我們期望從這種類型的應(yīng)用程序中獲得的收益更多的知識态罪。這部分地是由于豐富的特性反而將其從優(yōu)勢轉(zhuǎn)變?yōu)槔圪権选?yīng)用程序的特性功能越多,就會有越大的可能性不需要這些特性复颈,因此绩聘,我們最終將會為這些不需要的特性付出復(fù)雜度方面的代價。Zookeeper為其他項目相當(dāng)大的改進(jìn)鋪平了道路耗啦,“大數(shù)據(jù)玩家“在使用它凿菩,因為沒有更好的選擇。今天帜讲,Zookeeper已經(jīng)老態(tài)龍鐘了衅谷,我們有了更好的選擇。etcd
etcd是一個采用HTTP協(xié)議的健/值對存儲系統(tǒng)似将,它是一個分布式和功能層次配置系統(tǒng)获黔,可用于構(gòu)建服務(wù)發(fā)現(xiàn)系統(tǒng)。其很容易部署玩郊、安裝和使用肢执,提供了可靠的數(shù)據(jù)持久化特性。它是安全的并且文檔也十分齊全译红。etcd比Zookeeper是比更好的選擇预茄,因為它很簡單,然而,它需要搭配一些第三方工具才可以提供服務(wù)發(fā)現(xiàn)功能耻陕。


現(xiàn)在拙徽,我們有一個地方來存儲服務(wù)相關(guān)信息,我們還需要一個工具可以自動發(fā)送信息給etcd诗宣。但在這之后膘怕,為什么我們還需要手動把數(shù)據(jù)發(fā)送給etcd呢?即使我們希望手動將信息發(fā)送給etcd召庞,我們通常情況下也不會知道是什么信息岛心。記住這一點,服務(wù)可能會被部署到一臺運行最少數(shù)量容器的服務(wù)器上篮灼,并且隨機分配一個端口忘古。理想情況下,這個工具應(yīng)該監(jiān)視所有節(jié)點上的Docker容器诅诱,并且每當(dāng)有新容器運行或者現(xiàn)有的一個容器停止的時候更新etcd髓堪,其中的一個可以幫助我們達(dá)成目標(biāo)的工具就是Registrator。Registrator
Registrator通過檢查容器在線或者停止運行狀態(tài)自動注冊和去注冊服務(wù)娘荡,它目前支持etcd干旁、Consul和SkyDNS 2。Registrator與etcd是一個簡單但是功能強大的組合炮沐,可以運行很多先進(jìn)的技術(shù)争群。每當(dāng)我們打開一個容器,所有數(shù)據(jù)將被存儲在etcd并傳播到集群中的所有節(jié)點央拖。我們將決定什么信息是我們的祭阀。
etcd-registrator.png

上述的拼圖游戲還缺少一塊,我們需要一種方法來創(chuàng)建配置文件鲜戒,與數(shù)據(jù)都存儲在etcd,通過運行一些命令來創(chuàng)建這些配置文件抹凳。Confd
Confd是一個輕量級的配置管理工具遏餐,常見的用法是通過使用存儲在etcd、consul和其他一些數(shù)據(jù)登記處的數(shù)據(jù)保持配置文件的最新狀態(tài)赢底,它也可以用來在配置文件改變時重新加載應(yīng)用程序失都。換句話說,我們可以用存儲在etcd(或者其他注冊中心)的信息來重新配置所有服務(wù)幸冻。
etcd-registrator-confd.png

對于etcd粹庞、Registrator和Confd組合的最后的思考
當(dāng)etcd、Registrator和Confd結(jié)合時洽损,可以獲得一個簡單而強大的方法來自動化操作我們所有的服務(wù)發(fā)現(xiàn)和需要的配置庞溜。這個組合還展示了“小”工具正確組合的有效性,這三個小東西可以如我們所愿正好完成我們需要達(dá)到的目標(biāo)碑定,若范圍稍微小一些流码,我們將無法完成我們面前的目標(biāo)又官,而另一方面如果他們設(shè)計時考慮到更大的范圍,我們將引入不必要的復(fù)雜性和服務(wù)器資源開銷漫试。在我們做出最后的判決之前六敬,讓我們看看另一個有相同目標(biāo)的工具組合,畢竟驾荣,我們不應(yīng)該滿足于一些沒有可替代方案的選擇外构。Consul
Consul是強一致性的數(shù)據(jù)存儲,使用gossip形成動態(tài)集群播掷。它提供分級鍵/值存儲方式典勇,不僅可以存儲數(shù)據(jù),而且可以用于注冊器件事各種任務(wù)叮趴,從發(fā)送數(shù)據(jù)改變通知到運行健康檢查和自定義命令割笙,具體如何取決于它們的輸出。與Zookeeper和etcd不一樣眯亦,Consul內(nèi)嵌實現(xiàn)了服務(wù)發(fā)現(xiàn)系統(tǒng)伤溉,所以這樣就不需要構(gòu)建自己的系統(tǒng)或使用第三方系統(tǒng)。這一發(fā)現(xiàn)系統(tǒng)除了上述提到的特性之外妻率,還包括節(jié)點健康檢查和運行在其上的服務(wù)乱顾。Zookeeper和etcd只提供原始的鍵/值隊存儲,要求應(yīng)用程序開發(fā)人員構(gòu)建他們自己的系統(tǒng)提供服務(wù)發(fā)現(xiàn)功能宫静。而Consul提供了一個內(nèi)置的服務(wù)發(fā)現(xiàn)的框架走净。客戶只需要注冊服務(wù)并通過DNS或HTTP接口執(zhí)行服務(wù)發(fā)現(xiàn)孤里。其他兩個工具需要一個親手制作的解決方案或借助于第三方工具伏伯。Consul為多種數(shù)據(jù)中心提供了開箱即用的原生支持,其中的gossip系統(tǒng)不僅可以工作在同一集群內(nèi)部的各個節(jié)點捌袜,而且還可以跨數(shù)據(jù)中心工作说搅。
consul1.png

Consul還有另一個不錯的區(qū)別于其他工具的功能,它不僅可以用來發(fā)現(xiàn)已部署的服務(wù)以及其駐留的節(jié)點信息虏等,還通過HTTP請求弄唧、TTLs(time-to-live)和自定義命令提供了易于擴展的健康檢查特性。Registrator
Registrator有兩個Consul協(xié)議霍衫,其中consulkv協(xié)議產(chǎn)生類似于etcd協(xié)議的結(jié)果候引。除了通常的IP和端口存儲在etcd或consulkv協(xié)議中之外,Registrator consul協(xié)議存儲了更多的信息敦跌,我們可以得到服務(wù)運行節(jié)點的信息澄干,以及服務(wù)ID和名稱。我們也可以借助于一些額外的環(huán)境變量按照一定的標(biāo)記存儲額外的信息。
consul-registrator1.png

Consul-template
confd可以像和etce搭配一樣用于Consul傻寂,不過Consul有自己的模板服務(wù)息尺,其更適配Consul。通過從Consul獲得的信息疾掰,Consul-template是一個非常方便的創(chuàng)建文件的途徑搂誉,還有一個額外的好處就是在文件更新后可以運行任意命令,正如confd静檬,Consul-template也可以使用Go模板格式炭懊。
consul-registrator-consul-template1.png

Consul健康檢查、Web界面和數(shù)據(jù)中心
監(jiān)控集群節(jié)點和服務(wù)的健康狀態(tài)與測試和部署它們一樣的重要拂檩。雖然我們應(yīng)該向著擁有從來沒有故障的穩(wěn)定的環(huán)境努力侮腹,但我們也應(yīng)該承認(rèn),隨時會有意想不到的故障發(fā)生稻励,時刻準(zhǔn)備著采取相應(yīng)的措施父阻。例如我們可以監(jiān)控內(nèi)存使用情況,如果達(dá)到一定的閾值望抽,那么遷移一些服務(wù)到集群中的另外一個節(jié)點加矛,這將是在發(fā)生“災(zāi)難”前執(zhí)行的一個預(yù)防措施。另一方面煤篙,并不是所有潛在的故障都可以被及時檢測到并采取措施斟览。單個服務(wù)可能會齒白,一個完整的節(jié)點也可能由于硬件故障而停止工作辑奈。在這種情況下我們應(yīng)該準(zhǔn)備盡快行動苛茂,例如一個節(jié)點替換為一個新的并遷移失敗的服務(wù)。Consul有一個簡單的鸠窗、優(yōu)雅的但功能強大的方式進(jìn)行健康檢查妓羊,當(dāng)健康閥值達(dá)到一定數(shù)目時,幫助用戶定義應(yīng)該執(zhí)行的操作塌鸯。如果用戶Google搜索“etcd ui”或者“etec dashboard”時侍瑟,用戶可能看到只有幾個可用的解決方案,可能會問為什么我們還沒有介紹給用戶丙猬,這個原因很簡單,etcd只是鍵/值對存儲费韭,僅此而已茧球。通過一個UI呈現(xiàn)數(shù)據(jù)沒有太多的用處,因為我們可以很容易地通過etcdctl獲得這些數(shù)據(jù)星持。這并不意味著etcd UI是無用的抢埋,但鑒于其有限的使用范圍,它不會產(chǎn)生多大影響。Consu不僅僅是一個簡單的鍵/值對存儲揪垄,正如我們已經(jīng)看到的穷吮,除了存儲簡單的鍵/值對,它還有一個服務(wù)的概念以及所屬的數(shù)據(jù)饥努。它還可以執(zhí)行健康檢查捡鱼,因此成為一個好的候選dashboard,在上面可以看到我們的節(jié)點的狀態(tài)和運行的服務(wù)酷愧。最后驾诈,它支持了多數(shù)據(jù)中心的概念。所有這些特性的結(jié)合讓我們從不同的角度看到引入dashboard的必要性溶浴。通過Consul Web界面乍迄,用戶可以查看所有的服務(wù)和節(jié)點、監(jiān)控健康檢查狀態(tài)以及通過切換數(shù)據(jù)中心讀取設(shè)置鍵/值對數(shù)據(jù)士败。
consul-nodes.png

對于Consul闯两、Registrator、Template谅将、健康檢查和Web UI的最終思考
Consul以及上述我們一起探討的工具在很多情況下提供了比etcd更好的解決方案漾狼。這是從內(nèi)心深處為了服務(wù)架構(gòu)和發(fā)現(xiàn)而設(shè)計的方案,簡單而強大戏自。它提供了一個完整的同時不失簡潔的解決方案邦投,在許多情況下,這是最佳的服務(wù)發(fā)現(xiàn)以及滿足健康檢查需求的工具擅笔。結(jié)論
所有這些工具都是基于相似的原則和架構(gòu)志衣,它們在節(jié)點上運行,需要仲裁來運行猛们,并且都是強一致性的念脯,都提供某種形式的鍵/值對存儲。Zookeeper是其中最老態(tài)龍鐘的一個弯淘,使用年限顯示出了其復(fù)雜性绿店、資源利用和盡力達(dá)成的目標(biāo),它是為了與我們評估的其他工具所處的不同時代而設(shè)計的(即使它不是老得太多)庐橙。etcd假勿、Registrator和Confd是一個非常簡單但非常強大的組合,可以解決大部分問題态鳖,如果不是全部滿足服務(wù)發(fā)現(xiàn)需要的話转培。它還展示了我們可以通過組合非常簡單和特定的工具來獲得強大的服務(wù)發(fā)現(xiàn)能力,它們中的每一個都執(zhí)行一個非常具體的任務(wù)浆竭,通過精心設(shè)計的API進(jìn)行通訊浸须,具備相對自治工作的能力惨寿,從架構(gòu)和功能途徑方面都是微服務(wù)方式。Consul的不同之處在于無需第三方工具就可以原生支持多數(shù)據(jù)中心和健康檢查删窒,這并不意味著使用第三方工具不好裂垦。實際上,在這篇博客里我們通過選擇那些表現(xiàn)更佳同時不會引入不必要的功能的的工具肌索,盡力組合不同的工具蕉拢。使用正確的工具可以獲得最好的結(jié)果。如果工具引入了工作不需要的特性驶社,那么工作效率反而會下降企量,另一方面,如果工具沒有提供工作所需要的特性也是沒有用的亡电。Consul很好地權(quán)衡了權(quán)重届巩,用盡量少的東西很好的達(dá)成了目標(biāo)。Consul使用gossip來傳播集群信息的方式份乒,使其比etcd更易于搭建恕汇,特別是對于大的數(shù)據(jù)中心。將存儲數(shù)據(jù)作為服務(wù)的能力使其比etcd僅僅只有健/值對存儲的特性更加完整或辖、更有用(即使Consul也有該選項)瘾英。雖然我們可以在etcd中通過插入多個鍵來達(dá)成相同的目標(biāo)疏唾,Consul的服務(wù)實現(xiàn)了一個更緊湊的結(jié)果寥枝,通常只需要一次查詢就可以獲得與服務(wù)相關(guān)的所有數(shù)據(jù)奖唯。除此之外阔加,Registrator很好地實現(xiàn)了Consul的兩個協(xié)議,使其合二為一榨乎,特別是添加Consul-template到了拼圖中棋嘲。Consul的Web UI更是錦上添花般地提供了服務(wù)和健康檢查的可視化途徑抵知。我不能說Consul是一個明確的贏家县爬,而是與etcd相比其有一個輕微的優(yōu)勢阳啥。服務(wù)發(fā)現(xiàn)作為一個概念,以及作為工具都很新财喳,我們可以期待在這一領(lǐng)域會有許多的變化察迟。秉承開放的心態(tài),大家可以對本文的建議持保留態(tài)度耳高,嘗試不同的工具然后做出自己的結(jié)論扎瓶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市泌枪,隨后出現(xiàn)的幾起案子栗弟,更是在濱河造成了極大的恐慌,老刑警劉巖工闺,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乍赫,死亡現(xiàn)場離奇詭異,居然都是意外死亡陆蟆,警方通過查閱死者的電腦和手機雷厂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叠殷,“玉大人改鲫,你說我怎么就攤上這事×质” “怎么了像棘?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長壶冒。 經(jīng)常有香客問我缕题,道長,這世上最難降的妖魔是什么胖腾? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任烟零,我火速辦了婚禮,結(jié)果婚禮上咸作,老公的妹妹穿的比我還像新娘锨阿。我一直安慰自己,他們只是感情好记罚,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布墅诡。 她就那樣靜靜地躺著,像睡著了一般桐智。 火紅的嫁衣襯著肌膚如雪末早。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天酵使,我揣著相機與錄音荐吉,去河邊找鬼。 笑死口渔,一個胖子當(dāng)著我的面吹牛样屠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缺脉,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼痪欲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了攻礼?” 一聲冷哼從身側(cè)響起业踢,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎礁扮,沒想到半個月后知举,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞬沦,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年雇锡,在試婚紗的時候發(fā)現(xiàn)自己被綠了逛钻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡锰提,死狀恐怖曙痘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情立肘,我是刑警寧澤边坤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站谅年,受9級特大地震影響茧痒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜踢故,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一文黎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧殿较,春花似錦耸峭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至洽瞬,卻和暖如春本涕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伙窃。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工菩颖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人为障。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓晦闰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鳍怨。 傳聞我的和親對象是個殘疾皇子呻右,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)鞋喇,斷路器声滥,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • from http://www.infoq.com/cn/articles/etcd-interpretation...
    小樹苗苗閱讀 13,941評論 3 38
  • 在互聯(lián)網(wǎng)應(yīng)用領(lǐng)域,服務(wù)的動態(tài)性需求十分常見侦香,這就對服務(wù)的自動發(fā)現(xiàn)和可動態(tài)擴展提出了很高的要求落塑。 微服務(wù)系統(tǒng)動輒上萬...
    Liberalman閱讀 8,053評論 23 80
  • 由于文章太長纽疟,簡書放不下,完整文檔見Consul文檔芜赌。 一仰挣、安裝 Consul Consul 的安裝很簡單,安裝 ...
    FlySheep_ly閱讀 10,129評論 1 13
  • 今天我又有了一次小小的創(chuàng)舉缠沈,就是徒步行走的記錄超過了12公里,這個數(shù)字真的大大超過了我的預(yù)期错蝴,突然覺得自己也好能干...
    尚巾林閱讀 761評論 0 0