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

原文鏈接:Service Discovery in a Microservices Architecture

  1. 微服務(wù)介紹
  2. 構(gòu)建微服務(wù)之使用API網(wǎng)關(guān)
  3. 構(gòu)建微服務(wù)之:微服務(wù)架構(gòu)中的進(jìn)程間通信
  4. 微服務(wù)中的服務(wù)發(fā)現(xiàn)(本文)
  5. 微服務(wù)之事件驅(qū)動(dòng)的數(shù)據(jù)管理
  6. 選擇一種微服務(wù)部署策略
  7. 重構(gòu)單體應(yīng)用到微服務(wù)

這是使用微服務(wù)構(gòu)建應(yīng)用的第四篇文章箩绍。第一篇文章介紹了微服務(wù)架構(gòu)模式并討論了使用微服務(wù)的優(yōu)勢(shì)和劣勢(shì)坷衍,該系列的第二和第三篇文章 描述了微服務(wù)架構(gòu)中通信的不同方面絮供,本篇文章我們將密切討論下服務(wù)發(fā)現(xiàn)的問(wèn)題平斩。

為什么使用服務(wù)發(fā)現(xiàn)

設(shè)想下,我們寫了一些通過(guò)REST API或者Thrift API調(diào)用某個(gè)服務(wù)的代碼伶跷,為了發(fā)起這個(gè)請(qǐng)求,你的代碼需要知道服務(wù)實(shí)例的網(wǎng)絡(luò)地址(IP 地址和端口號(hào))。在傳統(tǒng)運(yùn)行在物理機(jī)器上的應(yīng)用中盾沫,某個(gè)服務(wù)實(shí)例的網(wǎng)絡(luò)地址一般是靜態(tài)的,比如殿漠,代碼可以從只會(huì)偶爾更新的配置文件中讀取網(wǎng)絡(luò)地址制肮。
然而在現(xiàn)在流行的基于云平臺(tái)的微服務(wù)應(yīng)用中, 有更多如下圖所示的困難問(wèn)題需要去解決:

Paste_Image.png

服務(wù)實(shí)例需要?jiǎng)討B(tài)分配網(wǎng)絡(luò)地址携兵,而且则披,一組服務(wù)實(shí)例可能會(huì)因?yàn)樽詣?dòng)擴(kuò)展、失敗或者升級(jí)發(fā)生動(dòng)態(tài)變化莲蜘,因此 你的客戶端代碼應(yīng)該使用更加精細(xì)的服務(wù)發(fā)現(xiàn)機(jī)制谭确。
有兩種主要的服務(wù)發(fā)現(xiàn)機(jī)制:客戶端發(fā)現(xiàn)服務(wù)端發(fā)現(xiàn)。讓我們先看客戶端發(fā)現(xiàn)機(jī)制票渠。

客戶端發(fā)現(xiàn)模式

當(dāng)我們使用 客戶端發(fā)現(xiàn)的時(shí)候逐哈,客戶端負(fù)責(zé)決定可用服務(wù)實(shí)例的網(wǎng)絡(luò)地址并且在集群中對(duì)請(qǐng)求負(fù)載均衡, 客戶端訪問(wèn)服務(wù)登記表,也就是一個(gè)可用服務(wù)的數(shù)據(jù)庫(kù)问顷,然后客戶端使用一種負(fù)載均衡算法選擇一個(gè)可用的服務(wù)實(shí)例然后發(fā)起請(qǐng)求昂秃。
下圖展示了該結(jié)構(gòu)模式:

Paste_Image.png

服務(wù)實(shí)例的網(wǎng)絡(luò)地址在服務(wù)啟動(dòng)的時(shí)候被登記到服務(wù)注冊(cè)表中 ,當(dāng)實(shí)例終止服務(wù)時(shí)從服務(wù)注冊(cè)表中移除杜窄。服務(wù)實(shí)例的注冊(cè)一般是通過(guò)心跳機(jī)制階段性的進(jìn)行刷新肠骆。

Netflix OSS 為客戶端發(fā)現(xiàn)機(jī)制提供了很多優(yōu)秀的例子。Netflix Eureka 實(shí)現(xiàn)了服務(wù)注冊(cè)表塞耕,它通過(guò)提供REST API來(lái)管理服務(wù)實(shí)例注冊(cè)以及可用實(shí)例的查詢蚀腿。Netflix Ribbon 是一個(gè)與Eureka一起使用并在多個(gè)可用實(shí)例間對(duì)請(qǐng)求負(fù)載均衡的IPC客戶端。我們將在下面文章深入討論Eureka荷科。

客戶端發(fā)現(xiàn)機(jī)制有諸多優(yōu)勢(shì)和劣勢(shì):該模式除了服務(wù)注冊(cè)表之外沒(méi)有其他的活動(dòng)部分了唯咬,相對(duì)來(lái)說(shuō)還是簡(jiǎn)單直接的,而且畏浆,由于客戶端知道相關(guān)的可用服務(wù)實(shí)例胆胰,那么就可以使用更加智能的,特定于應(yīng)用的負(fù)載均衡機(jī)制刻获,比如一致性哈希蜀涨。一個(gè)明顯的缺點(diǎn)是它把客戶端與服務(wù)注冊(cè)表緊耦合了,你必須為每一種消費(fèi)服務(wù)的客戶端對(duì)應(yīng)的編程語(yǔ)言和框架實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)邏輯。

現(xiàn)在看完了客戶端發(fā)現(xiàn)厚柳,再讓我們看下服務(wù)端發(fā)現(xiàn)吧氧枣。

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

服務(wù)發(fā)現(xiàn)的另一種模式就是服務(wù)端發(fā)現(xiàn)模式。下圖展示了該模式的結(jié)構(gòu):

Paste_Image.png

客戶端通過(guò)一個(gè)負(fù)載均衡器向服務(wù)發(fā)送請(qǐng)求别垮,負(fù)載均衡器查詢服務(wù)注冊(cè)表并把請(qǐng)求路由到一臺(tái)可用的服務(wù)實(shí)例上便监。和客戶端發(fā)現(xiàn)一樣,服務(wù)實(shí)例通過(guò)服務(wù)注冊(cè)表進(jìn)行服務(wù)的注冊(cè)和注銷碳想。

AWS Elastic Load Balancer (ELB) 是服務(wù)端發(fā)現(xiàn)路由的一個(gè)示例烧董。一個(gè)ELB通常對(duì)來(lái)自外部互聯(lián)網(wǎng)的請(qǐng)求進(jìn)行負(fù)載均衡,當(dāng)然胧奔,你也可以使用ELB對(duì)虛擬私有云(VPC)的內(nèi)部請(qǐng)求進(jìn)行負(fù)載均衡逊移。客戶端通過(guò)DNS域名向ELB發(fā)起HTTP或者TCP請(qǐng)求龙填,ELB將請(qǐng)求負(fù)載均衡到一系列注冊(cè)的Elastic Compute Cloud (EC2) 實(shí)例 或者EC2 Container Service (ECS) 的容器中胳泉,兩者并沒(méi)有分割的服務(wù)注冊(cè)表,EC2 實(shí)例和ECS容器都是通過(guò)ELB進(jìn)行注冊(cè)的岩遗。

類似NGINX PLUG和NGINX這些HTTP服務(wù)器和負(fù)載均衡器可以作為服務(wù)端發(fā)現(xiàn)負(fù)載均衡來(lái)使用扇商。比如 這篇博客 就描述了使用Consul Template 動(dòng)態(tài)重配置NGINX反向代理,Consul Template是一種根據(jù)存儲(chǔ)在Consul 服務(wù)注冊(cè)表的配置數(shù)據(jù)階段性重新生成任意配置文件的工具 宿礁,每當(dāng)文件發(fā)生變化時(shí)钳吟,它將運(yùn)行任意的Shell 命令。在博客描述的例子中窘拯,Consul Template 生成用于配置反向代理的nginx.conf文件,然后運(yùn)行一個(gè)命令行告知NGINX重載配置坝茎。更復(fù)雜的實(shí)現(xiàn)可能使用 HTTP API or DNS動(dòng)態(tài)重配置NGINX Plus涤姊。

一些部署環(huán)境使用諸如KubernetesMarathon在集群中的每個(gè)主機(jī)上運(yùn)行一個(gè)代理,這些代理扮演了服務(wù)端發(fā)現(xiàn)負(fù)載均衡的角色嗤放,代理可以根據(jù)主機(jī)IP地址和服務(wù)分配的端口號(hào)來(lái)路由客戶端請(qǐng)求思喊,代理因此可以透明的把客戶端請(qǐng)求轉(zhuǎn)發(fā)到集群中某臺(tái)可用的服務(wù)實(shí)例上去。

服務(wù)端發(fā)現(xiàn)模式有一些優(yōu)勢(shì)也有一些劣勢(shì):一個(gè)巨大的優(yōu)勢(shì)是次酌,服務(wù)發(fā)現(xiàn)的細(xì)節(jié)對(duì)客戶端來(lái)說(shuō)是抽象的恨课,客戶端僅需向負(fù)載均衡器發(fā)送請(qǐng)求即可。這種方式減少了為消費(fèi)服務(wù)的不同編程語(yǔ)言與框架實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)邏輯的麻煩岳服。當(dāng)然剂公,正如前面所述,一些部署環(huán)境已經(jīng)提供了該功能吊宋。這種模式也有一些劣勢(shì): 除非部署環(huán)境已經(jīng)提供了負(fù)載均衡器纲辽,否則這又是一個(gè)需要額外設(shè)置和管理的可高可用的系統(tǒng)組件。

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

服務(wù)注冊(cè)表 是服務(wù)發(fā)現(xiàn)的關(guān)鍵部分,它是一個(gè)包含服務(wù)實(shí)例網(wǎng)絡(luò)地址的的數(shù)據(jù)庫(kù)拖吼。一個(gè)服務(wù)注冊(cè)表需要高可用和實(shí)時(shí)更新鳞上,客戶端可以緩存從服務(wù)注冊(cè)表獲取的網(wǎng)絡(luò)地址。然而吊档,這樣的話緩存的信息最終會(huì)過(guò)期篙议,客戶端不能再根據(jù)該信息發(fā)現(xiàn)服務(wù)實(shí)例。因此怠硼,服務(wù)注冊(cè)表對(duì)集群中的服務(wù)實(shí)例使用復(fù)制協(xié)議來(lái)維護(hù)一致性鬼贱。

之前也提到 Netflix Eureka 是服務(wù)注冊(cè)表的好例子,它為服務(wù)實(shí)例的注冊(cè)與查詢提供了REST API:一個(gè)服務(wù)實(shí)例可以使用POST來(lái)注冊(cè)自己的網(wǎng)絡(luò)地址拒名,它必須每30秒通過(guò)PUT去刷新吩愧,服務(wù)實(shí)例可以直接或者在服務(wù)實(shí)例注冊(cè)超時(shí)的時(shí)候使用DELETE刪除注冊(cè)表中的信息,正如你所料增显,客戶端可以使用HTTP GET獲取注冊(cè)實(shí)例的信息雁佳。

Netflix通過(guò)在每一個(gè)Amazon EC2 availability zone運(yùn)行一到多個(gè)Eureka服務(wù) 實(shí)現(xiàn)高可用 。每一個(gè)Eureka服務(wù)器運(yùn)行在一個(gè)關(guān)聯(lián) Elastic IP地址的 EC2 實(shí)例上同云。DNS TEXT記錄了Eureka集群的配置文件糖权,配置文件映射availability zones到一組Eureka服務(wù)器可用的網(wǎng)絡(luò)地址。 Eureka 服務(wù)器啟動(dòng)的時(shí)候?qū)?huì)查詢DNS獲取Eureka集群的配置炸站、查詢同等節(jié)點(diǎn)并為自己分配一個(gè)未被使用的Elastic IP地址星澳。

Eureka clients – services和service clients,通過(guò)查詢DNS發(fā)現(xiàn)Eureka服務(wù)器的網(wǎng)絡(luò)地址旱易〗耍客戶端更傾向使用在同一availability zone中的Eureka服務(wù)器,當(dāng)然阀坏,如果該zone中沒(méi)有可用的網(wǎng)絡(luò)地址如暖,它將使用另一zone中的。

其他的服務(wù)注冊(cè)表例子包括:

  • etcd 忌堂,一個(gè)高可用盒至、分布式、一致性士修、key-value 方式的存儲(chǔ)枷遂,被用在分享配置和服務(wù)發(fā)現(xiàn)中。兩個(gè)著名的項(xiàng)目使用了它:Kubernetes 和 Cloud Foundry.
  • consul 棋嘲,一個(gè)發(fā)現(xiàn)和配置服務(wù)的工具酒唉,為客戶端注冊(cè)和發(fā)現(xiàn)服務(wù)提供了API,Consul還可以通過(guò)執(zhí)行健康檢查決定服務(wù)的可用性封字。
  • Apache Zookeeper 黔州,是一個(gè)廣泛使用耍鬓、高性能的針對(duì)分布式應(yīng)用的協(xié)調(diào)服務(wù)。 Apache Zookeeper本來(lái)是Hadoop的子工程流妻,現(xiàn)在已經(jīng)是頂級(jí)工程了牲蜀。

正如前面所述,一些諸如Kubernetes绅这、Marathon和AWS之類的應(yīng)用并沒(méi)有顯示的服務(wù)注冊(cè)表涣达,相反,服務(wù)注冊(cè)表是架構(gòu)內(nèi)置的一部分证薇。

我們已經(jīng)看過(guò)了服務(wù)注冊(cè)表的概念度苔,現(xiàn)在我們看下服務(wù)實(shí)例是如何使用注冊(cè)表注冊(cè)的:

服務(wù)注冊(cè)選項(xiàng)

正如前面提到的那樣,服務(wù)實(shí)例必須使用服務(wù)注冊(cè)表來(lái)進(jìn)行服務(wù)的注冊(cè)和注銷浑度,我們有幾種方式來(lái)處理服務(wù)的注冊(cè)和注銷寇窑,其中之一是服務(wù)實(shí)例自己注冊(cè)自己也就是self-registration 模式,另一種是系統(tǒng)的其他組件管理服務(wù)實(shí)例的注冊(cè)箩张,也就是 third-party registration 模式.甩骏。我們先看下self-registration模式:

Self-Registration模式

當(dāng)使用self-registration 模式,時(shí),服務(wù)實(shí)例自己負(fù)責(zé)通過(guò)服務(wù)注冊(cè)表對(duì)自己進(jìn)行注冊(cè)和注銷先慷,另外如果有必要的話饮笛,服務(wù)實(shí)例可以通過(guò)發(fā)送心跳請(qǐng)求防止注冊(cè)過(guò)期,下圖展示了該模式的結(jié)構(gòu):

Paste_Image.png

Netflix OSS Eureka client就是這種模式的一個(gè)例子论熙,Eureka客戶端處理服務(wù)實(shí)例注冊(cè)和注銷的各個(gè)方面福青。Spring Cloud project實(shí)現(xiàn)了包括服務(wù)發(fā)現(xiàn)在內(nèi)的不同模式,使得自動(dòng)注冊(cè)服務(wù)實(shí)例到Eureka變的簡(jiǎn)單脓诡。你可以簡(jiǎn)單的在你的java配置類上添加@EnableEurekaClient注解即可无午。

self-registration模式有一些優(yōu)勢(shì)也有一些劣勢(shì):優(yōu)勢(shì)之一是它相對(duì)簡(jiǎn)單,而且不強(qiáng)制使用其他的系統(tǒng)組件祝谚。然而指厌,一個(gè)很大的劣勢(shì)是 它使得服務(wù)實(shí)例和服務(wù)注冊(cè)表強(qiáng)耦合 ,你必須在每一個(gè)使用服務(wù)的客戶端編程語(yǔ)言和架構(gòu)代碼中實(shí)現(xiàn)注冊(cè)邏輯踊跟。

解綁服務(wù)和服務(wù)注冊(cè)表的另一替換方案是,使用third-party registration 模式鸥诽。

Third-Party Registration模式

當(dāng)使用third-party registration 模式的時(shí)候商玫,服務(wù)實(shí)例本身并不負(fù)責(zé)通過(guò)服務(wù)注冊(cè)表注冊(cè)自己,相反的牡借,通過(guò)另一個(gè)被稱作 service registrar系統(tǒng)組件來(lái)處理注冊(cè)拳昌。 service registrar通過(guò)輪詢或者訂閱事件來(lái)檢測(cè)一些運(yùn)行實(shí)例的變化,當(dāng)它檢測(cè)到一個(gè)新的可用服務(wù)實(shí)例時(shí)就把該實(shí)例注冊(cè)到服務(wù)注冊(cè)表中去钠龙,service registrar還負(fù)責(zé)注銷已經(jīng)被終止的服務(wù)實(shí)例炬藤,下圖展示了該模式的架構(gòu):

Paste_Image.png

service registrar其中一個(gè)例子是開(kāi)源的Registrator 項(xiàng)目御铃,它自動(dòng)的對(duì)部署到Docker 容器中的服務(wù)實(shí)例進(jìn)行注冊(cè)和注銷。 Registrator支持不同的服務(wù)注冊(cè)表沈矿,包括etcd和Consul上真。

service registrar的另一個(gè)例子是 NetflixOSS Prana,原本是為非JVM語(yǔ)言的服務(wù)所設(shè)計(jì)羹膳,它像服務(wù)實(shí)例的跨斗一樣和服務(wù)實(shí)例一起運(yùn)行睡互,Prana使用Netflix Eureka對(duì)服務(wù)進(jìn)行注冊(cè)和注銷。

service registrar是部署環(huán)境的內(nèi)置組件陵像,EC2實(shí)例可以自動(dòng)擴(kuò)展組 并可使用ELB進(jìn)行服務(wù)注冊(cè)就珠。Kubernetes 服務(wù)是自動(dòng)注冊(cè)的并能使其可以被發(fā)現(xiàn)。

third-party registration模式有一些優(yōu)勢(shì)也有一些劣勢(shì):主要優(yōu)勢(shì)是使得服務(wù)從服務(wù)注冊(cè)表中被解耦醒颖,你不必為開(kāi)發(fā)者使用的每種開(kāi)發(fā)語(yǔ)言和框架實(shí)現(xiàn)服務(wù)注冊(cè)的邏輯妻怎,相反,服務(wù)實(shí)例的注冊(cè)被一個(gè)專有服務(wù)以集中式的方式處理泞歉。

該模式的劣勢(shì)是逼侦,除非它被內(nèi)置在部署環(huán)境中,不然這又是一個(gè)需要被設(shè)置和管理的高可用系統(tǒng)組件疏日。

總結(jié)

在一個(gè)微服務(wù)應(yīng)用中偿洁,一組運(yùn)行的服務(wù)實(shí)例是動(dòng)態(tài)變化的,實(shí)例有動(dòng)態(tài)分配的網(wǎng)絡(luò)地址沟优,因此涕滋,為了使得客戶端能夠向服務(wù)發(fā)起請(qǐng)求,必須要要有服務(wù)發(fā)現(xiàn)機(jī)制挠阁。

服務(wù)發(fā)現(xiàn)的關(guān)鍵是服務(wù)注冊(cè)表宾肺,服務(wù)注冊(cè)表是可用服務(wù)實(shí)例的數(shù)據(jù)庫(kù),它提供了管理和查詢使用的API侵俗。服務(wù)實(shí)例使用這些管理API進(jìn)行服務(wù)的注冊(cè)和注銷锨用,系統(tǒng)組件使用查詢API來(lái)發(fā)現(xiàn)可用的服務(wù)實(shí)例。

有兩種服務(wù)發(fā)現(xiàn)的模式:客戶端發(fā)現(xiàn)和服務(wù)端發(fā)現(xiàn)隘谣。在使用客戶端發(fā)現(xiàn)模式的系統(tǒng)中增拥,客戶端直接查詢服務(wù)注冊(cè)表,選擇一個(gè)可用的實(shí)例并發(fā)起請(qǐng)求寻歧,在一個(gè)使用服務(wù)端發(fā)現(xiàn)模式的系統(tǒng)中掌栅,客戶端通過(guò)路由發(fā)起請(qǐng)求,路由會(huì)查詢服務(wù)注冊(cè)表并把請(qǐng)求轉(zhuǎn)發(fā)到可用的服務(wù)實(shí)例上码泛。

對(duì)服務(wù)實(shí)例來(lái)講有兩種方式可以對(duì)服務(wù)注冊(cè)表進(jìn)行注冊(cè)和注銷猾封,一種是服務(wù)實(shí)例本身通過(guò)服務(wù)注冊(cè)表來(lái)注冊(cè)自己,也就是self-registration模式噪珊,另一種則是第三方系統(tǒng)組件代表實(shí)例來(lái)處理服務(wù)的注冊(cè)和注銷晌缘,也就是third-party registration模式齐莲。

在一些部署環(huán)境中,你需要使用諸如Netflix Eureka磷箕、etcd, 或者Apache Zookeeper這樣的服務(wù)注冊(cè)表來(lái)設(shè)置你自己的服務(wù)發(fā)現(xiàn)架構(gòu)选酗。在另一些部署環(huán)境中,服務(wù)發(fā)現(xiàn)則是內(nèi)置組件搀捷,比如KubernetesMarathon用來(lái)處理服務(wù)注冊(cè)和注銷星掰,他們同樣也在集群的每一個(gè)主機(jī)上運(yùn)行一個(gè)代理來(lái)扮演服務(wù)端發(fā)現(xiàn)路由的角色。

一些諸如NGINX的HTTP反向代理和負(fù)載均衡器 可以用作服務(wù)端發(fā)現(xiàn)負(fù)載均衡器使用嫩舟,服務(wù)注冊(cè)表可以向NGINX推送路由信息并調(diào)用優(yōu)雅的配置更新氢烘,比如,你可以使用Consul Template家厌。 NGINX Plus 支持額外的動(dòng)態(tài)重配置機(jī)制 :它可以使用DNS從服務(wù)注冊(cè)表 拉取服務(wù)實(shí)例的信息播玖,并且為遠(yuǎn)程重配置提供API。

在該系列之后的文章中我們將繼續(xù)挖掘微服務(wù)的各個(gè)方面饭于。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蜀踏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子掰吕,更是在濱河造成了極大的恐慌果覆,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件殖熟,死亡現(xiàn)場(chǎng)離奇詭異局待,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)菱属,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門钳榨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人纽门,你說(shuō)我怎么就攤上這事薛耻。” “怎么了赏陵?”我有些...
    開(kāi)封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵饼齿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蝙搔,道長(zhǎng)候醒,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任杂瘸,我火速辦了婚禮,結(jié)果婚禮上伙菊,老公的妹妹穿的比我還像新娘败玉。我一直安慰自己敌土,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布运翼。 她就那樣靜靜地躺著返干,像睡著了一般。 火紅的嫁衣襯著肌膚如雪血淌。 梳的紋絲不亂的頭發(fā)上矩欠,一...
    開(kāi)封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音悠夯,去河邊找鬼癌淮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛沦补,可吹牛的內(nèi)容都是我干的乳蓄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼夕膀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼虚倒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起产舞,我...
    開(kāi)封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤魂奥,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后易猫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耻煤,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年擦囊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了违霞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瞬场,死狀恐怖买鸽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贯被,我是刑警寧澤眼五,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站彤灶,受9級(jí)特大地震影響看幼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜幌陕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一诵姜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧搏熄,春花似錦棚唆、人聲如沸暇赤。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鞋囊。三九已至,卻和暖如春瞎惫,著一層夾襖步出監(jiān)牢的瞬間溜腐,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工瓜喇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挺益,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓欠橘,卻偏偏與公主長(zhǎng)得像矩肩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肃续,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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