服務(wù)注冊(cè)與發(fā)現(xiàn)

隨著業(yè)務(wù)的發(fā)展蒂秘,用戶量日益上升泽本,單一的系統(tǒng)越來越復(fù)雜,越來越龐大姻僧,單純的提升服務(wù)器性能始終有頂天的一天规丽,我們可以通過分布式技術(shù),例如:服務(wù)器集群段化,水平業(yè)務(wù)劃分嘁捷,應(yīng)用分解,系統(tǒng)分流显熏,微服務(wù)架構(gòu)等方式來解決系統(tǒng)性能問題和復(fù)雜業(yè)務(wù)問題雄嚣。

第一篇:架構(gòu)演進(jìn)

在分布式體系下服務(wù)注冊(cè)與發(fā)現(xiàn)將會(huì)以核心組件而存在,也將是接下來討論的話題。

Lazy服務(wù)注冊(cè)與發(fā)現(xiàn)(一)

由于應(yīng)用的分解缓升,微服務(wù)的引入鼓鲁,服務(wù)越來越多,業(yè)務(wù)系統(tǒng)與服務(wù)系統(tǒng)之間的調(diào)用港谊,都需要有效管理骇吭。

在服務(wù)化的早期,服務(wù)不是很多歧寺,服務(wù)的注冊(cè)與發(fā)現(xiàn)并不是什么新鮮的名詞燥狰,Nginx+內(nèi)部域名服務(wù)器方式,甚至Nginx+host文件配置方式也能完成服務(wù)的注冊(cè)與發(fā)現(xiàn)斜筐。

架構(gòu)圖如下:

(架構(gòu)一)


各組件角色如下:

Nginx通過多域名配置實(shí)現(xiàn)生產(chǎn)者服務(wù)路由龙致,通過upstream對(duì)生產(chǎn)者提供負(fù)載均衡,通過checkhealth對(duì)生產(chǎn)者提供健康檢查顷链。

在內(nèi)部域名服務(wù)器/本地host文件配置服務(wù)域名的方式目代,實(shí)現(xiàn)域名與服務(wù)的綁定。

生產(chǎn)者提供服務(wù)給消費(fèi)者訪問嗤练,并通過Nginx來進(jìn)行請(qǐng)求分發(fā)榛了。在服務(wù)化的早期,服務(wù)較少煞抬,訪問量較小霜大,解決了服務(wù)的注冊(cè)與發(fā)現(xiàn)與負(fù)載均衡等問題。隨著業(yè)務(wù)的發(fā)展此疹,用戶量日益上升僧诚,服務(wù)也越來越多遮婶,該架構(gòu)的問題暴露出來:

1)最明顯的問題是所有的請(qǐng)求都需要nginx來轉(zhuǎn)發(fā)蝗碎,同時(shí)隨著訪問量的提升,會(huì)成為一個(gè)性能瓶頸旗扑。

2)隨著內(nèi)部服務(wù)的越來越多蹦骑,服務(wù)上線nginx的配置,內(nèi)部域名的配置也越來越多臀防,不利于快速部署眠菇。

3)一旦內(nèi)部網(wǎng)絡(luò)調(diào)整,nginx upstream也需要做對(duì)應(yīng)的配置調(diào)整袱衷。

Lazy服務(wù)注冊(cè)與發(fā)現(xiàn)(二)

由于所有的請(qǐng)求都需要nginx來轉(zhuǎn)發(fā)捎废,同時(shí)隨著訪問量的提升,會(huì)成為一個(gè)性能瓶頸致燥,為了解決這個(gè)瓶頸登疗,引入下面這個(gè)架構(gòu)。

(架構(gòu)二)


這個(gè)架構(gòu)在nginx的上層加入了LVS,LVS基于第四層的IP轉(zhuǎn)發(fā)辐益,一定限度提高了并發(fā)能力,但是所有請(qǐng)求都通過LVS來轉(zhuǎn)發(fā)断傲。

同時(shí)nginx分組,服務(wù)分組智政,雖然nginx不再是瓶頸的所在认罩,但是這樣帶來的代價(jià)太高,配置越來越多续捂,工作量越來越大垦垂,對(duì)系統(tǒng)壓力需要有預(yù)見性,有效nginx分組牙瓢,服務(wù)分組部署乔外。

Lazy服務(wù)注冊(cè)與發(fā)現(xiàn)(三)

由于所有的請(qǐng)求都需要LVS來轉(zhuǎn)發(fā),同時(shí)隨著訪問量的提升一罩,會(huì)成為一個(gè)性能瓶頸杨幼,為了解決這個(gè)瓶頸,引入下面這個(gè)架構(gòu)聂渊。

(架構(gòu)三)


在這個(gè)架構(gòu)基礎(chǔ)上需要做兩件事情:

對(duì)系統(tǒng)壓力需要有預(yù)見性差购,有效nginx分組,服務(wù)分組部署汉嗽。

消費(fèi)端需要編程實(shí)現(xiàn)分組選擇欲逃,可以是輪訓(xùn),random等實(shí)現(xiàn)饼暑,我們每一個(gè)消費(fèi)者同時(shí)承擔(dān)了的負(fù)載均衡的職責(zé)稳析。

ZK服務(wù)注冊(cè)與發(fā)現(xiàn) (一)

通過架構(gòu)三解決了nginx的瓶緊,但是服務(wù)上下線需要在nginx弓叛,域名服務(wù)器做相應(yīng)的配置彰居,一旦服務(wù)的IP端口發(fā)生變化,都需要在nginx上做相應(yīng)的配置撰筷,為了解決這個(gè)問題引入下面這個(gè)架構(gòu)陈惰。

(架構(gòu)四)


服務(wù)在啟動(dòng)的時(shí)候就將endpoint注冊(cè)到Zookeeper對(duì)服務(wù)進(jìn)行統(tǒng)一管理。

服務(wù)節(jié)點(diǎn)增加Endpoint不需要做任何配置毕籽,ZK將以Watch機(jī)制通知消費(fèi)者抬闯。

消費(fèi)者本地緩存了提供者服務(wù)列表,不需要轉(zhuǎn)發(fā)关筒,直接發(fā)起服務(wù)調(diào)用溶握。

缺點(diǎn):

需要通過zookeeper API來實(shí)現(xiàn)服務(wù)注冊(cè)與發(fā)現(xiàn),負(fù)載均衡蒸播,以及容錯(cuò)睡榆,為了解決nginx的瓶緊架構(gòu)三也是需要通過編程的方式實(shí)現(xiàn)負(fù)載均衡。

ZK服務(wù)注冊(cè)與發(fā)現(xiàn) (二)

Zookeeper數(shù)據(jù)模型結(jié)構(gòu)是一個(gè)樹狀層次結(jié)構(gòu)。每個(gè)節(jié)點(diǎn)叫做Znode肉微,節(jié)點(diǎn)可以擁有子節(jié)點(diǎn)匾鸥,同時(shí)允許將少量數(shù)據(jù)存儲(chǔ)在該節(jié)點(diǎn)下,客戶端可以通過NodeCacheListener監(jiān)聽節(jié)點(diǎn)的數(shù)據(jù)變更碉纳,PathChildrenCacheListener監(jiān)聽子節(jié)點(diǎn)變更來實(shí)時(shí)獲取Znode的變更(Wather機(jī)制)滴须。

以下是點(diǎn)融成都服務(wù)注冊(cè)結(jié)構(gòu)怎茫,見下圖四濒,接下來的講解也將以這個(gè)結(jié)構(gòu)為基礎(chǔ):

ZK服務(wù)注冊(cè)與發(fā)現(xiàn) (三)

1./com/dianrong/cfg/1.0.0/rpcservice: 命名空間蔬螟,用來跟其他用途區(qū)分。

2./com/dianrong/cfg/1.0.0/rpcservice下的所有子目錄由兩部分組成铁孵,

“應(yīng)用名稱” + “-” + ?“分組名稱”例如:ProductService-SG1,ProductService-SG2, 對(duì)應(yīng)Nginx注冊(cè)中心Nginx-SG1, Nginx-SG2

3. 服務(wù)分組下的所有子節(jié)點(diǎn)為臨時(shí)節(jié)點(diǎn)锭硼,key為“PROVIDER”+ IP(去符號(hào).) ?+ “-” + 端口,Value為endpoint信息。

例如:PROVIDER1921681010-8080 ? = http://192.168.10.10:8080

第二篇:代碼分析

項(xiàng)目說明

有了上面的理論我們接下來針對(duì)基于ZK的服務(wù)與發(fā)現(xiàn)的代碼分析蜕劝,代碼已經(jīng)提交到git

GIT地址:

https://code.dianrong.com/projects/PLAT/repos/platform/compare/commits?sourceBranch=refs%2Fheads%2FEVER-81-zk&targetBranch=refs%2Fheads%2Fmaster

說明:

1. 該組件建立在Curator基礎(chǔ)之上檀头,Curator是Netflix開源的一套ZooKeeper客戶端框架封裝ZooKeeper client與ZooKeeper server之間的連接處理。

2. Curator提供如下機(jī)制岖沛,保證我們不需要關(guān)注網(wǎng)絡(luò)通信暑始,而把主要精力放在業(yè)務(wù)邏輯的處理。

重試機(jī)制:提供可插拔的重試機(jī)制, 它將給捕獲所有可恢復(fù)的異常配置一個(gè)重試策略, 并且內(nèi)部也提供了幾種標(biāo)準(zhǔn)的重試策略

連接狀態(tài)監(jiān)控: Curator初始化之后會(huì)一直的對(duì)zk連接進(jìn)行監(jiān)聽, 一旦發(fā)現(xiàn)連接狀態(tài)發(fā)生變化, 將作出相應(yīng)的處理

ZK客戶端實(shí)例管理:Curator對(duì)zk客戶端到server集群連接進(jìn)行管理. 并在需要的情況, 透明重建zk實(shí)例, 保證與zk集群的可靠連接

基于ZK的服務(wù)與發(fā)現(xiàn)UML類圖:


目標(biāo)

1. 統(tǒng)一配置中心

數(shù)據(jù)實(shí)時(shí)性婴削,一旦zk節(jié)點(diǎn)發(fā)生變化廊镜,實(shí)時(shí)通知本地hash同步刷新。

2. 服務(wù)注冊(cè)

服務(wù)啟動(dòng)完成唉俗,服務(wù)IP,端口以臨時(shí)節(jié)點(diǎn)的形式注冊(cè)到zk嗤朴,在網(wǎng)絡(luò)正常的情況下,一直存在虫溜。

3. 服務(wù)發(fā)現(xiàn)

服務(wù)啟動(dòng)完成雹姊,將服務(wù)注冊(cè)信息刷新到本地hash。

4. 服務(wù)上下線

服務(wù)注冊(cè)到zk將實(shí)時(shí)通知服務(wù)發(fā)現(xiàn)方吼渡,更新本地hash容为,服務(wù)下線也將實(shí)時(shí)通知服務(wù)發(fā)現(xiàn)方乓序,更新本地hash寺酪。

5. 負(fù)載均衡

服務(wù)發(fā)現(xiàn)方獲取服務(wù)緩存在本地hash,通過random,robin等負(fù)載均衡算法完成服務(wù)選擇性調(diào)用替劈。

6. 網(wǎng)絡(luò)中斷容災(zāi)

針對(duì)注冊(cè)方網(wǎng)絡(luò)中斷寄雀,服務(wù)下線,網(wǎng)絡(luò)恢復(fù)陨献,服務(wù)上線盒犹,并通知服務(wù)發(fā)現(xiàn)方更新本地Hash;

針對(duì)發(fā)現(xiàn)方網(wǎng)絡(luò)中斷,通過本地hash負(fù)載均衡急膀,網(wǎng)絡(luò)恢復(fù)重刷hash沮协,負(fù)載均衡重新分配。

7. Zookeeper宕機(jī)容災(zāi)

針對(duì)注冊(cè)方Zookeeper宕機(jī)卓嫂,服務(wù)下線慷暂,嘗試重連, Zookeeper 啟動(dòng)重連成功晨雳,服務(wù)上線行瑞,并通知服務(wù)發(fā)現(xiàn)方更新本地hash,針對(duì)發(fā)現(xiàn)方Zookeeper宕機(jī)餐禁,通過本地hash負(fù)載均衡血久,嘗試重連, ?Zookeeper 啟動(dòng)重連成功帮非,重刷hash氧吐,負(fù)載均衡重新分配。

基本配置

PathConfig.java

包含服務(wù)注冊(cè)的命名空間和統(tǒng)一配置的命名空間的配置末盔。

SgConfig.java

包含服務(wù)名和分組名的配置

ZookeeperConfig.java

包含zookeeper地址副砍,會(huì)話超時(shí)時(shí)間,連接超時(shí)時(shí)間庄岖,命名空間以及認(rèn)證信息的配置

ZK操作框架

IzookeeperManager.java

定義了一套zookeeper操作規(guī)范(類似JDBC操作數(shù)據(jù)數(shù)據(jù)庫(kù)規(guī)范)豁翎,有待繼續(xù)完善。

ZookeeperManager.java

針對(duì)IzookeeperManager接口規(guī)范的實(shí)現(xiàn)(類似Mysql驅(qū)動(dòng)對(duì)Mysql操作的實(shí)現(xiàn))

ZookeeperManagerPool.java

針對(duì)ZookeeperManager實(shí)例的緩存隅忿,不同配置緩存不同ZookeeperManager實(shí)例心剥,避免zookeeper連接創(chuàng)建的開銷,同時(shí)可以根據(jù)zookeeper水平分組擴(kuò)展zookeeper

實(shí)例背桐。

統(tǒng)一配置优烧,服務(wù)注冊(cè)與發(fā)現(xiàn)

AbstractZookeeperFeature.java

內(nèi)部?jī)蓚€(gè)接口定義:

IConfigService 提供針對(duì)統(tǒng)一配置接口的定義, IManagementService提供服務(wù)注冊(cè)與發(fā)現(xiàn)接口的定義链峭。

ConfigService.java

統(tǒng)一配置的實(shí)現(xiàn)畦娄。

ManagementService.java

服務(wù)注冊(cè)與發(fā)現(xiàn)的實(shí)現(xiàn)。

負(fù)載均衡

LbStrategy.java

負(fù)載均衡策略接口定義弊仪,目前實(shí)現(xiàn)了兩種負(fù)載均衡算法熙卡,Random負(fù)載均衡和Robin負(fù)載均衡。

RandomStrategy.java

基于隨機(jī)負(fù)載均衡的實(shí)現(xiàn)励饵。

RobinStrategy.java

基于輪循負(fù)載均衡的實(shí)現(xiàn)驳癌。

統(tǒng)一配置Listener

ConfigPathChildrenCacheListener.java

統(tǒng)一配置結(jié)點(diǎn)監(jiān)聽, 針對(duì)CHILD_REMOVED役听,CHILD_ADDED颓鲜,CHILD_UPDATED事件對(duì)本地hash實(shí)時(shí)更新表窘。

服務(wù)注冊(cè)與發(fā)現(xiàn)Listener

ZookeeperStateListener.java

Zookeeper狀態(tài)監(jiān)聽接口定義,定義需要關(guān)心的三種事件:

LOST-斷開連接達(dá)到一定時(shí)間

CONNECTED-第一次連接成功

RECONNECTED-重連成功觸發(fā)事件甜滨。

ServiceRegistStateListener.java

服務(wù)注冊(cè)狀態(tài)監(jiān)聽實(shí)現(xiàn):

1.一旦網(wǎng)絡(luò)丟包嚴(yán)重/ zk宕機(jī)/ zk重啟,客戶端將會(huì)與zk斷開乐严,服務(wù)下線,網(wǎng)絡(luò)恢復(fù)將觸發(fā)reconnected連接衣摩,服務(wù)重新注冊(cè)麦备。

2.一旦zk斷開服務(wù)下線,長(zhǎng)時(shí)間連接不上觸發(fā)Lost事件昭娩,ServiceRegistStateListener將會(huì)嘗試不斷連接直到連上為止凛篙,服務(wù)重新注冊(cè)。

ServiceDiscoverStateListener.java

服務(wù)發(fā)現(xiàn)狀態(tài)監(jiān)聽實(shí)現(xiàn):

1.一旦網(wǎng)絡(luò)丟包嚴(yán)重/ zk宕機(jī)/ zk重啟,客戶端將會(huì)與zk斷開栏渺,網(wǎng)絡(luò)恢復(fù)將觸發(fā)reconnected連接呛梆,重新獲取服務(wù)列表,刷新本地hash磕诊。

2.一旦zk斷開服務(wù)下線填物,長(zhǎng)時(shí)間連接不上觸發(fā)Lost事件,ServiceDiscoverStateListener將會(huì)嘗試不斷連接直到連上為止,以便刷新本地hash霎终。

ServicePathChildrenCacheListener.java

服務(wù)發(fā)現(xiàn)結(jié)點(diǎn)監(jiān)聽滞磺, 針對(duì)CHILD_REMOVED,CHILD_ADDED莱褒,CHILD_UPDATED事件消費(fèi)者對(duì)本地hash實(shí)時(shí)更新击困,以便及時(shí)刷新服務(wù)上下線。

第三篇:?jiǎn)卧獪y(cè)試

環(huán)境準(zhǔn)備

1. 在zookeeper中準(zhǔn)備結(jié)點(diǎn) com/dianrong/cfg/1.0.0/rpcservice

create /com/dianrong/cfg/1.0.0/rpcservice ?“”

2. 模擬docker/JVM啟動(dòng)參數(shù)設(shè)置

由于點(diǎn)融網(wǎng)是通過物理機(jī)IP加端口映射到docker實(shí)例IP加端口的方式對(duì)外提供服務(wù)广凸,因此需要通過java -D配置宿主機(jī)的IP加端口以便應(yīng)用程序獲取服務(wù)IP加端口用來進(jìn)行服務(wù)注冊(cè)阅茶。

服務(wù)注冊(cè)

1. 在服務(wù)注冊(cè)之前通過zookeeper控制臺(tái)查看,期望的注冊(cè)節(jié)點(diǎn)目前為空谅海。

2. 啟動(dòng)服務(wù)注冊(cè)單元測(cè)試脸哀,sleep 10s。

3. 觀察zookeeper中注冊(cè)結(jié)點(diǎn)扭吁,期望的臨時(shí)節(jié)點(diǎn)已經(jīng)存在撞蜂。

服務(wù)發(fā)現(xiàn)

通過服務(wù)注冊(cè)以后然后服務(wù)發(fā)現(xiàn),發(fā)現(xiàn)節(jié)點(diǎn)與預(yù)期注冊(cè)結(jié)點(diǎn)一致侥袜。

負(fù)載均衡

通過服務(wù)注冊(cè)以后然后負(fù)載均衡蝌诡,負(fù)載均衡獲取節(jié)點(diǎn)與預(yù)期節(jié)點(diǎn)一致。

服務(wù)上下線

1. 準(zhǔn)備兩套單元測(cè)試并模擬docker/JVM啟動(dòng)參數(shù)設(shè)置系馆。

2.啟動(dòng)服務(wù)注冊(cè)送漠,服務(wù)發(fā)現(xiàn),負(fù)載均衡集成單元測(cè)試由蘑,測(cè)試控制臺(tái)按照預(yù)期打印出服務(wù)注冊(cè)信息,注冊(cè)了兩個(gè)服務(wù)節(jié)點(diǎn)通過負(fù)載均衡交叉出現(xiàn)闽寡。

3. 通過zookeeper控制臺(tái)查看成功注冊(cè)兩個(gè)節(jié)點(diǎn)。

4.關(guān)閉機(jī)器1單元測(cè)試尼酿,結(jié)點(diǎn)1在zookeeper離線爷狈,結(jié)點(diǎn)2在zookeeper在線。

負(fù)載均衡只有一個(gè)節(jié)點(diǎn)存在達(dá)到預(yù)期目的

網(wǎng)絡(luò)中斷

1. 啟動(dòng)服務(wù)注冊(cè)裳擎,服務(wù)發(fā)現(xiàn)涎永,負(fù)載均衡集成單元測(cè)試,測(cè)試控制臺(tái)按照預(yù)期打印出服務(wù)注冊(cè)信息鹿响。

2. 通過Linux iptables開啟防火墻羡微,模擬網(wǎng)絡(luò)中斷。

服務(wù)掉線惶我,通過zookeeper控制臺(tái)查看注冊(cè)節(jié)點(diǎn)消失妈倔。

服務(wù)發(fā)現(xiàn)方任然可以從本地Hash中獲取服務(wù)節(jié)點(diǎn)。

3. 關(guān)閉Iptables绸贡,服務(wù)上線盯蝴。

服務(wù)上線,通過zookeeper控制臺(tái)查看注冊(cè)節(jié)點(diǎn)出現(xiàn)听怕。

服務(wù)發(fā)現(xiàn)方獲取服務(wù)節(jié)點(diǎn)重刷本地Hash中捧挺。

Zookeeper宕機(jī)

1. 啟動(dòng)服務(wù)注冊(cè),服務(wù)發(fā)現(xiàn)尿瞭,負(fù)載均衡集成單元測(cè)試闽烙,測(cè)試控制臺(tái)按照預(yù)期打印出服務(wù)注冊(cè)信息。

2.關(guān)閉zookeeper声搁,單元測(cè)試出現(xiàn)連接拒絕錯(cuò)誤鸣峭,但是任然能按照預(yù)期獲取本地hash中的服務(wù)注冊(cè)信息。

3. 啟動(dòng)zookeeper酥艳,單元測(cè)試打印出重連信息摊溶,并重刷本地服務(wù)hash。

本文作者:秦瑜 Chris.Qin(點(diǎn)融黑幫)充石,來自點(diǎn)融BE Team, 2015年10月加入點(diǎn)融莫换,多年大并發(fā)分布式互聯(lián)網(wǎng)架構(gòu)經(jīng)驗(yàn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末骤铃,一起剝皮案震驚了整個(gè)濱河市拉岁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惰爬,老刑警劉巖喊暖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異撕瞧,居然都是意外死亡陵叽,警方通過查閱死者的電腦和手機(jī)狞尔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巩掺,“玉大人偏序,你說我怎么就攤上這事∨痔妫” “怎么了研儒?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)独令。 經(jīng)常有香客問我端朵,道長(zhǎng),這世上最難降的妖魔是什么燃箭? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任冲呢,我火速辦了婚禮,結(jié)果婚禮上遍膜,老公的妹妹穿的比我還像新娘碗硬。我一直安慰自己,他們只是感情好瓢颅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布恩尾。 她就那樣靜靜地躺著,像睡著了一般挽懦。 火紅的嫁衣襯著肌膚如雪翰意。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天信柿,我揣著相機(jī)與錄音冀偶,去河邊找鬼。 笑死渔嚷,一個(gè)胖子當(dāng)著我的面吹牛进鸠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播形病,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼客年,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了漠吻?” 一聲冷哼從身側(cè)響起量瓜,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎途乃,沒想到半個(gè)月后绍傲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耍共,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年烫饼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了猎塞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡枫弟,死狀恐怖邢享,靈堂內(nèi)的尸體忽然破棺而出鹏往,到底是詐尸還是另有隱情淡诗,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布伊履,位于F島的核電站韩容,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏唐瀑。R本人自食惡果不足惜群凶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哄辣。 院中可真熱鬧请梢,春花似錦、人聲如沸力穗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)当窗。三九已至够坐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間崖面,已是汗流浹背元咙。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留巫员,地道東北人庶香。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像简识,于是被迫代替她去往敵國(guó)和親赶掖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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