終于有人把服務(wù)調(diào)用說清楚了

導(dǎo)讀:RPC代赁,微服務(wù)掩宜,Service Mesh這些服務(wù)之間的調(diào)用是什么原理戚扳?
本文專注于演化過程中每一步的為什么(Why)和是什么(What)上面旦事,盡量不在技術(shù)細(xì)節(jié)(How)上面做太多深入空入。

服務(wù)的三要素

一般而言,一個網(wǎng)絡(luò)服務(wù)包括以下的三個要素:

  1. 地址:調(diào)用方根據(jù)地址訪問到網(wǎng)絡(luò)接口族檬。地址包括以下要素:IP地址、服務(wù)端口化戳、服務(wù)協(xié)議(TCP单料、UDP埋凯,etc)。
  2. 協(xié)議格式:協(xié)議格式指的是該協(xié)議都有哪些字段扫尖,由接口提供者與協(xié)議調(diào)用者協(xié)商之后確定下來白对。
  3. 協(xié)議名稱:或者叫協(xié)議類型,因?yàn)樵谕粋€服務(wù)監(jiān)聽端口上面换怖,可能同時提供多種接口服務(wù)于調(diào)用方甩恼,這時候需要協(xié)議類型(名稱)來區(qū)分不同的網(wǎng)絡(luò)接口。

需要說明在服務(wù)地址中:

  1. IP地址提供了在互聯(lián)網(wǎng)上找到這臺機(jī)器的憑證沉颂。
  2. 協(xié)議以及服務(wù)端口提供了在這臺機(jī)器上找到提供服務(wù)的進(jìn)程的憑證条摸。
image.png

這都屬于TCPIP協(xié)議棧的知識點(diǎn),不在這里深入詳述铸屉。
這里還需要對涉及到服務(wù)相關(guān)的一些名詞做解釋钉蒲。

  1. 服務(wù)實(shí)例:服務(wù)對應(yīng)的IP地址加端口的簡稱。需要訪問服務(wù)的時候彻坛,需要先尋址知道該服務(wù)每個運(yùn)行實(shí)例的地址加端口顷啼,然后才能建立連接進(jìn)行訪問。
  2. 服務(wù)注冊:某個服務(wù)實(shí)例宣稱自己提供了哪些服務(wù)昌屉,即某個IP地址+端口都提供了哪些服務(wù)接口钙蒙。
  3. 服務(wù)發(fā)現(xiàn):調(diào)用方通過某種方式找到服務(wù)提供方,即知道服務(wù)運(yùn)行的IP地址加端口间驮。

基于IP地址的調(diào)用

最初的網(wǎng)絡(luò)服務(wù)躬厌,通過原始的IP地址暴露給調(diào)用者。這種方式有以下的問題:

  1. IP地址是難于記憶并且無意義的蜻牢。

  2. 另外烤咧,從上面的服務(wù)三要素可以看到,IP地址其實(shí)是一個很底層的概念抢呆,直接對應(yīng)了一臺機(jī)器上的一個網(wǎng)絡(luò)接口煮嫌,如果直接使用IP地址進(jìn)行尋址,更換機(jī)器就變的很麻煩抱虐。

    “盡量不使用過于底層的概念來提供服務(wù)”昌阿,是這個演化流程中的重要原則,好比在今天已經(jīng)很少能夠看到直接用匯編語言編寫代碼的場景了恳邀,取而代之的懦冰,就是越來越多的抽象,本文中就展現(xiàn)了服務(wù)調(diào)用這一領(lǐng)域在這個過程中的演進(jìn)流程谣沸。
    在現(xiàn)在除非是測試階段刷钢,否則已經(jīng)不能直接以IP地址的形式將服務(wù)提供出去了。

域名系統(tǒng)

前面的IP地址是給主機(jī)做為路由器尋址的數(shù)字型標(biāo)識乳附,并不好記憶内地。此時產(chǎn)生了域名系統(tǒng)伴澄,與單純提供IP地址相比,域名系統(tǒng)由于使用有意義的域名來標(biāo)識服務(wù)阱缓,所以更容易記憶非凌。另外,還可以更改域名所對應(yīng)的IP地址荆针,這為變換機(jī)器提供了便利敞嗡。有了域名之后,調(diào)用方需要訪問某個網(wǎng)絡(luò)服務(wù)時航背,首先到域名地址服務(wù)中喉悴,根據(jù)DNS協(xié)議將域名解析為相應(yīng)的IP地址,再根據(jù)返回的IP地址來訪問服務(wù)沃粗。
從這里可以看到粥惧,由于多了一步到域名地址服務(wù)查詢映射IP地址的流程,所以多了一步解析最盅,為了減少這一步帶來的影響突雪,調(diào)用方會緩存解析之后的結(jié)果,在一段時間內(nèi)不過期涡贱,這樣就省去了這一步查詢的代價咏删。

協(xié)議的接收與解析

以上通過域名系統(tǒng),已經(jīng)解決了服務(wù)IP地址難以記憶的問題问词,下面來看協(xié)議格式解析方面的演進(jìn)督函。

一般而言,一個網(wǎng)絡(luò)協(xié)議包括兩部分:

  1. 協(xié)議包頭:這里存儲協(xié)議的元信息(meta infomation)激挪,其中可能會包括協(xié)議類型辰狡、報(bào)體長度、協(xié)議格式等垄分。需要說明的是宛篇,包頭一般為固定大小,或者有明確的邊界(如HTTP協(xié)議中的\r\n結(jié)束符)薄湿,否則無法知道包頭何時結(jié)束叫倍。
  2. 協(xié)議包體:具體的協(xié)議內(nèi)容。

無論是HTTP協(xié)議豺瘤,又或者是自定義的二進(jìn)制網(wǎng)絡(luò)協(xié)議吆倦,大體都由這兩部分組成。


image.png

由于很多時候不能一口氣接收完畢客戶端的協(xié)議數(shù)據(jù)坐求,因此在接收協(xié)議數(shù)據(jù)時蚕泽,一般采用狀態(tài)機(jī)來做協(xié)議數(shù)據(jù)的接收:


image.png
接收完畢了網(wǎng)絡(luò)數(shù)據(jù),在協(xié)議解析方面卻長期停滯不前桥嗤。一個協(xié)議赛糟,有多個字段(field)派任,而這些不同的字段有不同的類型,簡單的raw類型(如整型璧南、字符串)還好說,但是遇到復(fù)雜的類型如字典师逸、數(shù)組等就比較麻煩司倚。

當(dāng)時常見的手段有以下幾種:

  1. 使用json或者xml這樣的數(shù)據(jù)格式。好處是可視性強(qiáng)动知,表達(dá)起上面的復(fù)雜類型也方便员辩,缺陷是容易被破解,傳輸過去的數(shù)據(jù)較大奠滑。

  2. 自定義二進(jìn)制協(xié)議丹皱。每個公司做大了宋税,在這一塊難免有幾個類似的輪子。筆者見過比較典型的是所謂的TLV格式(Type-Length-Value)杰赛,自定義二進(jìn)制格式最大的問題出現(xiàn)在協(xié)議聯(lián)調(diào)與協(xié)商的時候呢簸,由于可視性比較弱,有可能這邊少了一個字段那邊多了一個字段根时,給聯(lián)調(diào)流程帶來麻煩辰晕。

    上面的問題一直到Google的Protocol Buffer(以下簡稱PB)出現(xiàn)之后才得到很大的改善。PB出現(xiàn)之后忘苛,也有很多類似的技術(shù)出現(xiàn)唱较,如Thrift南缓、MsgPack等,不在這里闡述纸镊,將這一類技術(shù)都以PB來描述。

與前面的兩種手段相比峰搪,PB具有以下的優(yōu)點(diǎn):

  1. 使用proto格式文件來定義協(xié)議格式概耻,proto文件是一個典型的DSL(domain-specific language)文件罐呼,文件中描述了協(xié)議的具體格式嫉柴,每個字段都是什么類型,哪些是可選字段哪些是必選字段夯尽。有了proto文件之后危尿,C\S兩端是通過這個文件來進(jìn)行協(xié)議的溝通交流的,而不是具體的技術(shù)細(xì)節(jié)。
  2. PB能通過proto文件生成各種語言對應(yīng)的序列化反序列化代碼注暗,給跨語言調(diào)用提供了方便。
  3. PB自己能夠?qū)μ囟愋瓦M(jìn)行數(shù)據(jù)壓縮茫叭,減少數(shù)據(jù)大小半等。
image.png

服務(wù)網(wǎng)關(guān)

有了前面的演化之后杀饵,寫一個簡單的單機(jī)服務(wù)器已經(jīng)不難切距。然而,當(dāng)隨著訪問量的增大话肖,一臺機(jī)器已經(jīng)不足以支撐所有的請求,此時就需要橫向擴(kuò)展多加一些業(yè)務(wù)服務(wù)器贺氓。
而前面通過域名訪問服務(wù)的架構(gòu)就遇到了問題:如果有多個服務(wù)實(shí)例可以提供相同的服務(wù)掠归,那么勢必需要在DNS的域名解析中將域名與多個地址進(jìn)行綁定悄泥。這樣的方案就有如下的問題:
  1. 如何檢查這些實(shí)例的健康情況弹囚,同時在發(fā)現(xiàn)出現(xiàn)問題的時候增刪服務(wù)實(shí)例地址领曼?即所謂的服務(wù)高可用問題庶骄。
  2. 把這些服務(wù)實(shí)例地址都暴露到外網(wǎng),會不會涉及到安全問題灸异?即使可以解決安全問題羔飞,那么也需要每臺機(jī)器都做安全策略逻淌。
  3. 由于DNS協(xié)議的特點(diǎn)卡儒,增刪服務(wù)實(shí)例并不是實(shí)時的,有時候會影響到業(yè)務(wù)硬爆。

為了解決這些問題锦募,就引入了反向代理網(wǎng)關(guān)這一組件。它提供如下的功能:

  1. 負(fù)載均衡功能:根據(jù)某些算法將請求分派到服務(wù)實(shí)例上准验。
  2. 提供管理功能廷没,可以給運(yùn)維管理員增減服務(wù)實(shí)例颠黎。
  3. 由于它決定了服務(wù)請求流量的走向,因此還可以做更多的其他功能:灰度引流夭坪、安全防攻擊(如訪問黑白名單室梅、卸載SSL證書)等疚宇。
image.png

有四層和七層負(fù)載均衡軟件敷待,其中四層負(fù)載均衡這里介紹LVS榜揖,七層負(fù)載均衡介紹Nginx。


image.png
上圖是簡易的TCPIP協(xié)議棧層次圖钳幅,其中LVS工作在四層敢艰,即請求來到LVS這里時是根據(jù)四層協(xié)議來決定請求最終走到哪個服務(wù)實(shí)例钠导;而Nginx工作在七層森瘪,主要用于HTTP協(xié)議扼睬,即根據(jù)HTTP協(xié)議本身來決定請求的走向悴势。需要說明的是特纤,Nginx也可以工作在四層侥加,但是這么用的地方不是很多担败,可以參考nginx的stream模塊提前。

做為四層負(fù)載均衡的LVS

(由于LVS有好幾種工作模式,并不是每一種我都很清楚卿操,以下表述僅針對Full NAT模式孙援,下面的表述或者有誤)
LVS有如下的組成部分:

  1. Direct Server(以下簡稱DS):前端暴露給客戶端進(jìn)行負(fù)載均衡的服務(wù)器拓售。
  2. Virtual Ip地址(以下簡稱VIP):DS暴露出去的IP地址础淤,做為客戶端請求的地址哨苛。
  3. Direct Ip地址(以下簡稱DIP):DS用于與Real Server交互的IP地址建峭。
  4. Real Server(以下簡稱RS):后端真正進(jìn)行工作的服務(wù)器,可以橫向擴(kuò)展凑兰。
  5. Real IP地址(以下簡稱RIP):RS的地址姑食。
  6. Client IP地址(以下簡稱CIP):Client的地址


    image.png

客戶端進(jìn)行請求時音半,流程如下:

  1. 使用VIP地址訪問DS曹鸠,此時的地址二元組為<src:CIP,dst:VIP>。
  2. DS根據(jù)自己的負(fù)載均衡算法宣旱,選擇一個RS將請求轉(zhuǎn)發(fā)過去浑吟,在轉(zhuǎn)發(fā)過去的時候耗溜,修改請求的源IP地址為DIP地址抖拴,讓RS看上去認(rèn)為是DS在訪問它阿宅,此時的地址二元組為<src:DIP,dst:RIP A>。
  3. RS處理并且應(yīng)答該請求蛉鹿,這個回報(bào)的源地址為RS的RIP地址妖异,目的地址為DIP地址领追,此時的地址二元組為<src:RIP A,dst:DIP>绒窑。
  4. DS在收到該應(yīng)答包之后些膨,將報(bào)文應(yīng)答客戶端,此時修改應(yīng)答報(bào)文的源地址為VIP地址欧漱,目的地址為CIP地址误甚,此時的地址二元組為<src:VIP,dst:CIP>。

做為七層負(fù)載均衡的Nginx

在開始展開討論之前擅威,需要簡單說一下正向代理和反向代理郊丛。
所謂的正向代理(proxy)厉熟,我的理解就是在客戶端處的代理较幌。如瀏覽器中的可以配置的訪問某些網(wǎng)站的代理乍炉,就屬于正向代理,但是一般而言不會說正向代理而是代理底循,即默認(rèn)代理都是正向的此叠。
而反向代理(reverse proxy)就是擋在服務(wù)器端前面的代理,比如前面LVS中的DS服務(wù)器就屬于一種反向代理猬错。為什么需要反向代理倦炒,大體的原因有以下的考量:
  1. 負(fù)載均衡:希望在這個反向代理的服務(wù)器中逢唤,將請求均衡的分發(fā)到后面的服務(wù)器中鳖藕。

  2. 安全:不想向客戶端暴露太多的服務(wù)器地址,統(tǒng)一接入到這個反向代理服務(wù)器中院尔,在這里做限流邀摆、安全控制等栋盹。

  3. 由于統(tǒng)一接入了客戶端的請求,所以在反向代理的接入層可以做更多的控制策略汉额,比如灰度流量發(fā)布闷愤、權(quán)重控制等等讥脐。

    反向代理與所謂的gateway啼器、網(wǎng)關(guān)等端壳,我認(rèn)為沒有太多的差異损谦,只是叫法不同而已,做的事情都是類似的颅湘。
    Nginx應(yīng)該是現(xiàn)在用的最多的HTTP 七層負(fù)載均衡軟件闯参,在Nginx中鹿寨,可以通過在配置的server塊中定義一個域名薪夕,然后將該域名的請求綁定到對應(yīng)的Upstream中原献,而實(shí)現(xiàn)轉(zhuǎn)發(fā)請求到這些Upstream的效果。

upstream hello {
       server A:11001;
       server B:11001;
}
location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://hello;
}
這是最簡單的Nginx反向代理配置同诫,實(shí)際線上一個接入層背后可能有多個域名误窖,如果配置變動的很大秩贰,每次域名以及對應(yīng)的Upstream的配置修改都需要人工干預(yù)毒费,效率會很慢觅玻。這時候就要提到一個叫DevOps的名詞了溪厘,我的理解就是開發(fā)各種便于自動化運(yùn)維工具的工程師畸悬。
有了上面的分析,此時一個提供七層HTTP訪問接口的服務(wù)架構(gòu)大體是這樣的:
image.png

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

前面已經(jīng)解決單機(jī)服務(wù)器對外提供服務(wù)的大部分問題,來簡單回顧:

  1. 域名系統(tǒng)解決了需要記住復(fù)雜的數(shù)字IP地址的問題守屉。

  2. PB類軟件庫的出現(xiàn)解決協(xié)議定義解析的痛點(diǎn)贾惦。

  3. 網(wǎng)關(guān)類組件解決客戶端接入以及服務(wù)器橫向擴(kuò)展等一系列問題须板。

    然而一個服務(wù)习瑰,通常并不見得只由本身提供服務(wù)就可以甜奄,服務(wù)過程中可能還涉及到查詢其他服務(wù)的流程课兄,常見的如數(shù)據(jù)類服務(wù)如Mysql、Redis等搬俊,這一類供服務(wù)內(nèi)調(diào)用查詢的服務(wù)被成為內(nèi)部的服務(wù)唉擂,通常并不直接暴露到外網(wǎng)去玩祟。
    面向公網(wǎng)的服務(wù)空扎,一般都是以域名的形式提供給外部調(diào)用者勺卢,然而對于服務(wù)內(nèi)部之間的互相調(diào)用黑忱,域名形式還不夠甫煞,其原因在于:

  4. DNS服務(wù)發(fā)現(xiàn)的粒度太粗冠绢,只能到IP地址級別弟胀,而服務(wù)的端口還需要用戶自己維護(hù)孵户。

  5. 對于服務(wù)的健康狀況的檢查夏哭,DNS的檢查還不夠竖配,需要運(yùn)維的參與。

  6. DNS對于服務(wù)狀態(tài)的收集很欠缺原押,而服務(wù)狀態(tài)最終應(yīng)該是反過來影響服務(wù)被調(diào)用情況的班眯。

  7. DNS的變更需要人工的參與烁巫,不夠智能以及自動化亚隙。

綜上阿弃,內(nèi)網(wǎng)間的服務(wù)調(diào)用渣淳,通常而言會自己實(shí)現(xiàn)一套“服務(wù)發(fā)現(xiàn)”類的系統(tǒng)入愧,其包括以下幾個組件:

  1. 服務(wù)發(fā)現(xiàn)系統(tǒng):用于提供服務(wù)的尋址棺蛛、注冊能力旁赊,以及對服務(wù)狀態(tài)進(jìn)行統(tǒng)計(jì)匯總桦踊,根據(jù)服務(wù)情況更改服務(wù)的調(diào)用情況。比如终畅,某個服務(wù)實(shí)例的響應(yīng)慢了籍胯,此時分配給該實(shí)例的流量響應(yīng)的就會少一些。而由于這個系統(tǒng)能提供服務(wù)的尋址能力离福,所以一些尋址策略就可以在這里做杖狼,比如灰度某些特定的流量只能到某些特定的實(shí)例上,比如可以配置每個實(shí)例的流量權(quán)重等术徊。
  2. 一套與該服務(wù)系統(tǒng)搭配使用的RPC庫本刽,其提供以下功能:
    2.1 服務(wù)提供方:使用RPC庫注冊自己的服務(wù)到服務(wù)發(fā)現(xiàn)系統(tǒng)赠涮,另外上報(bào)自己的服務(wù)情況子寓。
    2.2 服務(wù)調(diào)用方:使用RPC庫進(jìn)行服務(wù)尋址,實(shí)時從服務(wù)發(fā)現(xiàn)系統(tǒng)那邊獲取最新的服務(wù)調(diào)度策略笋除。
    2.3 提供協(xié)議的序列化斜友、反序列化功能,負(fù)載均衡的調(diào)用策略垃它、熔斷限流等安全訪問策略鲜屏,這部分對于服務(wù)的提供方以及調(diào)用方都適用。


    image.png

有了這套服務(wù)發(fā)現(xiàn)系統(tǒng)以及搭配使用的RPC庫之后国拇,來看看現(xiàn)在的服務(wù)調(diào)用是什么樣的洛史。

  1. 寫業(yè)務(wù)邏輯的,再也不用關(guān)注服務(wù)地址酱吝、協(xié)議解析也殖、服務(wù)調(diào)度、自身服務(wù)情況上報(bào)等等與業(yè)務(wù)邏輯本身并沒有太多關(guān)系的工作务热,專注于業(yè)務(wù)邏輯即可忆嗜。
  2. 服務(wù)發(fā)現(xiàn)系統(tǒng)一般還有與之搭配的管理后臺界面,可以通過這里對服務(wù)的策略進(jìn)行修改查看等操作崎岂。
  3. 對應(yīng)的還會有服務(wù)監(jiān)控系統(tǒng)捆毫,對應(yīng)的這是一臺實(shí)時采集服務(wù)數(shù)據(jù)進(jìn)行計(jì)算的系統(tǒng),有了這套系統(tǒng)服務(wù)質(zhì)量如何一目了然冲甘。
  4. 服務(wù)健康狀態(tài)的檢查完全自動化绩卤,在狀況不好的時候?qū)Ψ?wù)進(jìn)行降級處理,人工干預(yù)變少损合,更加智能以及自動化省艳。

現(xiàn)在服務(wù)的架構(gòu)又演進(jìn)成了這樣:


image.png

ServiceMesh

架構(gòu)發(fā)展到上面的程度,實(shí)際上已經(jīng)能夠解決大部分的問題了嫁审。這兩年又出現(xiàn)了一個很火的概念:ServiceMesh跋炕,中文翻譯為“服務(wù)網(wǎng)格”,來看看它又能解決什么問題律适。

前面的服務(wù)發(fā)現(xiàn)系統(tǒng)中辐烂,需要一個與之配套的RPC庫,然而這又會有如下的問題:

  1. 如果需要支持多語言捂贿,該怎么做纠修?每個語言實(shí)現(xiàn)一個對應(yīng)的RPC庫嗎?
  2. 庫的升級很麻煩厂僧,比如RPC庫本身出了安全漏洞扣草,比如需要升級版本,一般推動業(yè)務(wù)方去做這個升級是很難的,尤其是系統(tǒng)做大了之后辰妙。

可以看到鹰祸,由于RPC庫是嵌入到進(jìn)程之中的組件,所以以上問題很麻煩密浑,于是就想出了一個辦法:將原先的一個進(jìn)程拆分成兩個進(jìn)程蛙婴,如下圖所示。


image.png
在服務(wù)mesh化之前尔破,服務(wù)調(diào)用方實(shí)例通過自己內(nèi)部的RPC庫來與服務(wù)提供方實(shí)例進(jìn)行通信街图。
在服務(wù)mesh化之后,會與服務(wù)調(diào)用方同機(jī)部署一個local Proxy也就是ServiceMesh的proxy懒构,此時服務(wù)調(diào)用的流量會先走到這個proxy餐济,再由它完成原先RPC庫響應(yīng)的工作。至于如何實(shí)現(xiàn)這個流量的劫持胆剧,答案是采用iptables颤介,將特定端口的流量轉(zhuǎn)發(fā)到proxy上面即可。
有了這一層的分拆赞赖,將業(yè)務(wù)服務(wù)與負(fù)責(zé)RPC庫作用的Proxy分開來滚朵,上面的兩個痛點(diǎn)問題就變成了對每臺物理機(jī)上面的mesh 
 proxy的升級維護(hù)問題,多語言也不是問題了前域,因?yàn)槎际峭ㄟ^網(wǎng)絡(luò)調(diào)用完成的RPC通信辕近,而不是進(jìn)程內(nèi)使用RPC庫。

然而這個方案并不是什么問題都沒有的匿垄,最大的問題在于移宅,多了這一層的調(diào)用之后,勢必有影響原來的響應(yīng)時間椿疗。

截止目前(2019.6月)漏峰,ServiceMesh仍然還是一個概念大于實(shí)際的產(chǎn)品。

 從上面的演進(jìn)歷史可以看到届榄,所謂的“中間層理論”浅乔,即“Any problem in computer science can be solved by another layer of indirection(計(jì)算機(jī)科學(xué)領(lǐng)域的任何問題都可以通過增加一個間接的中間層來解決)”在這個過程中被廣泛使用,比如為了解決IP地址難于記憶的問題铝条,引入了域名系統(tǒng)靖苇,比如為了解決負(fù)載均衡問題引入了網(wǎng)關(guān),等等班缰。然而每引入一個中間層贤壁,勢必帶來另外的影響,比如ServiceMesh多一次到Proxy的調(diào)用埠忘,如何權(quán)衡又是另外的問題了脾拆。

另外馒索,回到最開始的服務(wù)三要素中,可以看到整個演化的歷史也是逐漸屏蔽了下層組件的流程名船,比如:

  1. 域名的出現(xiàn)屏蔽了IP地址双揪。

  2. 服務(wù)發(fā)現(xiàn)系統(tǒng)屏蔽協(xié)議及端口號。

  3. PB類序列化庫屏蔽了使用者自己對協(xié)議的解析包帚。

    可以看到,演進(jìn)流程讓業(yè)務(wù)開發(fā)者更加專注在業(yè)務(wù)邏輯上运吓,這類的演進(jìn)流程不只發(fā)生在今天渴邦,也不會僅僅發(fā)生在今天,未來類似的演進(jìn)也將再次發(fā)生拘哨。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谋梭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子倦青,更是在濱河造成了極大的恐慌瓮床,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件产镐,死亡現(xiàn)場離奇詭異隘庄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)癣亚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門丑掺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人述雾,你說我怎么就攤上這事街州。” “怎么了玻孟?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵唆缴,是天一觀的道長。 經(jīng)常有香客問我黍翎,道長面徽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任匣掸,我火速辦了婚禮斗忌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘旺聚。我一直安慰自己织阳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布砰粹。 她就那樣靜靜地躺著唧躲,像睡著了一般造挽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弄痹,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天饭入,我揣著相機(jī)與錄音,去河邊找鬼肛真。 笑死谐丢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蚓让。 我是一名探鬼主播乾忱,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼历极!你這毒婦竟也來了窄瘟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤趟卸,失蹤者是張志新(化名)和其女友劉穎蹄葱,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锄列,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡图云,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了邻邮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琼稻。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖饶囚,靈堂內(nèi)的尸體忽然破棺而出帕翻,到底是詐尸還是另有隱情,我是刑警寧澤萝风,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布嘀掸,位于F島的核電站,受9級特大地震影響规惰,放射性物質(zhì)發(fā)生泄漏睬塌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一歇万、第九天 我趴在偏房一處隱蔽的房頂上張望揩晴。 院中可真熱鬧,春花似錦贪磺、人聲如沸硫兰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劫映。三九已至违孝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泳赋,已是汗流浹背雌桑。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祖今,地道東北人校坑。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像千诬,于是被迫代替她去往敵國和親耍目。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

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