用JAVA從零開(kāi)始寫(xiě)一個(gè)分布式文件存儲(chǔ)系統(tǒng)

2011年做過(guò)一個(gè)人物挖掘搜索的系統(tǒng)俏橘,當(dāng)時(shí)用C#寫(xiě)過(guò)一個(gè)爬蟲(chóng)框架,當(dāng)時(shí)對(duì)150多個(gè)學(xué)術(shù)網(wǎng)站采集了約3億網(wǎng)頁(yè)文件靴寂,零散的文件一開(kāi)始分散放置在不同的主機(jī)和移動(dòng)硬盤(pán)上百炬,后來(lái)管理與使用越來(lái)越難,索性自己基于MySQL + Solr寫(xiě)了一個(gè)分布式文件存儲(chǔ)系統(tǒng)庶弃。

2020年疫情期間賦閑在家無(wú)事可干德澈,多年技術(shù)管理已經(jīng)讓我忘記很多編程基礎(chǔ),正好用這個(gè)練手JAVA編程缴守,用當(dāng)下流行的Springboot + MyBatis + Redis + ElasticSearch + MySql + Vue + ElementUI 重新實(shí)現(xiàn)一個(gè)分布式文件存儲(chǔ)系統(tǒng)的前后端镇辉,項(xiàng)目暫且命名BlobGenius

1. 設(shè)計(jì)思想與概念

數(shù)據(jù)存儲(chǔ):支持數(shù)據(jù)庫(kù)文件系統(tǒng)兩種方式鸡捐。數(shù)據(jù)庫(kù)采用MySQL或PostgreSQL等開(kāi)源數(shù)據(jù)庫(kù)麻裁,表獨(dú)立存儲(chǔ)(每個(gè)表一個(gè)存儲(chǔ)目錄煎源,每個(gè)表最大可存儲(chǔ)64TB),InnoDB等支持事物的存儲(chǔ)引擎歇僧;文件系統(tǒng)采用最原始的文件塊機(jī)制锋拖。

數(shù)據(jù)切塊:支持對(duì)大文件對(duì)象或小數(shù)據(jù)對(duì)象分塊存儲(chǔ),大文件采用256KB兽埃、512KB侥钳、1024KB或2048KB四種分塊尺寸,小數(shù)據(jù)對(duì)象采用256B柄错、1KB舷夺、2KB與4KB四種分塊尺寸苦酱,數(shù)據(jù)塊默認(rèn)采用SHA-256哈希算法計(jì)算數(shù)據(jù)校驗(yàn)碼。

數(shù)據(jù)引用:一個(gè)數(shù)據(jù)對(duì)象DataObject由多個(gè)數(shù)據(jù)塊DataBlob組成给猾,一個(gè)數(shù)據(jù)塊也可以是多個(gè)數(shù)據(jù)對(duì)象的組成部分疫萤,兩者是M:N關(guān)系敢伸,采用引用計(jì)數(shù)實(shí)現(xiàn)扯饶。

數(shù)據(jù)主鍵:數(shù)據(jù)塊DataBlob主鍵由SHA-256哈希算法結(jié)合短碼算法生成,由12個(gè)字符組成(可表達(dá)62^12個(gè)對(duì)象)详拙,基本可保證不同數(shù)據(jù)的哈希碰撞問(wèn)題帝际,同時(shí),解決相同數(shù)據(jù)重復(fù)存儲(chǔ)問(wèn)題饶辙。

數(shù)據(jù)處理:數(shù)據(jù)塊支持編碼蹲诀、加密與壓縮技術(shù),保障數(shù)據(jù)安全與存儲(chǔ)效率弃揽,加密默認(rèn)采用AES對(duì)稱(chēng)加密引擎脯爪,壓縮采用GZIP算法。

數(shù)據(jù)備份:支持主從(master-slave)復(fù)制對(duì)等復(fù)制兩種機(jī)制矿微,默認(rèn)采用對(duì)等復(fù)制痕慢。

數(shù)據(jù)要素:數(shù)據(jù)三要素,數(shù)據(jù)對(duì)象-DataObject涌矢、數(shù)據(jù)塊-DataBlob掖举、數(shù)據(jù)引用-DataBlobRef。DataObject表達(dá)數(shù)據(jù)描述信息娜庇,包含對(duì)象名稱(chēng)塔次、路徑、大小名秀、擁有者励负、校驗(yàn)碼、創(chuàng)建/訪(fǎng)問(wèn)時(shí)間等信息匕得。

數(shù)據(jù)節(jié)點(diǎn)DataNode負(fù)責(zé)存儲(chǔ)DataObject继榆、DataBlobIds或DataBlob,塊數(shù)據(jù)可以采用數(shù)據(jù)庫(kù)或文件系統(tǒng)存儲(chǔ)汁掠,描述信息統(tǒng)一存儲(chǔ)在MySQL數(shù)據(jù)庫(kù)略吨。每個(gè)節(jié)點(diǎn)DataNode與一個(gè)MySQL實(shí)例對(duì)應(yīng),一個(gè)物理主機(jī)可配置多個(gè)MySQL實(shí)例考阱。

數(shù)據(jù)資源DataResource資源對(duì)象表示一種邏輯資源晋南,如圖片、視頻等羔砾,每種資源都有自己的數(shù)據(jù)三要素负间,一個(gè)數(shù)據(jù)要素由多個(gè)數(shù)據(jù)節(jié)點(diǎn)DataNode負(fù)責(zé)數(shù)據(jù)存儲(chǔ)

數(shù)據(jù)路由:數(shù)據(jù)三要素DataObject姜凄、DataBlob政溃、DataBlobRef都有主鍵,系統(tǒng)根據(jù)配置的路由規(guī)則將不同主鍵的記錄分發(fā)到不同的數(shù)據(jù)節(jié)點(diǎn)與數(shù)據(jù)表态秧,實(shí)現(xiàn)分服務(wù)器與分表存儲(chǔ)機(jī)制董虱。

對(duì)象搜索:采用ElasticSearch支持DataObject的實(shí)時(shí)索引與全文搜索,解決分服務(wù)器與分表后的統(tǒng)一搜索問(wèn)題申鱼,實(shí)現(xiàn)存儲(chǔ)服務(wù)與搜索服務(wù)分離愤诱。

版本管理:版本管理采用GIT機(jī)制,采用master捐友、brunch與tag支持分支與版本管理淫半,不同分支采用不同目錄存儲(chǔ),同一個(gè)文件的多次提交保存歷史數(shù)據(jù)匣砖。

2. 系統(tǒng)架構(gòu)

2.1 數(shù)據(jù)邏輯

數(shù)據(jù)架構(gòu)包括數(shù)據(jù)資源-DataResource科吭、映射規(guī)則-DataRule,數(shù)據(jù)三要素?cái)?shù)據(jù)對(duì)象-DataObject猴鲫、數(shù)據(jù)塊-DataBlob对人、數(shù)據(jù)引用-DataBlobRef,數(shù)據(jù)節(jié)點(diǎn)-DataNode負(fù)責(zé)數(shù)據(jù)存儲(chǔ)拂共。關(guān)系結(jié)構(gòu)圖如下:

數(shù)據(jù)架構(gòu)3.png

架構(gòu)分析

  • 數(shù)據(jù)資源-DataResource牺弄。存儲(chǔ)一組數(shù)據(jù)需要定義一種數(shù)據(jù)資源,系統(tǒng)可以定義若干種數(shù)據(jù)資源宜狐。

  • 數(shù)據(jù)對(duì)象-DataObject势告。一種數(shù)據(jù)資源可以存儲(chǔ)若干個(gè)數(shù)據(jù)對(duì)象,數(shù)據(jù)對(duì)象可以存放到1個(gè)或若干個(gè)數(shù)據(jù)節(jié)點(diǎn)-DataNode肌厨,分服務(wù)器或分表的路由規(guī)則由映射規(guī)則-DataRule對(duì)象定義培慌。

  • 數(shù)據(jù)塊-DataBlob。數(shù)據(jù)對(duì)象被切分為若干個(gè)數(shù)據(jù)塊存儲(chǔ)柑爸,數(shù)據(jù)塊主鍵根據(jù)數(shù)據(jù)內(nèi)容的SHA-256哈希算法短碼算法生成吵护。

  • 數(shù)據(jù)塊引用-DataBlobRef。定義數(shù)據(jù)對(duì)象-DataObject與數(shù)據(jù)塊-DataBlob的引用關(guān)系表鳍。

  • 數(shù)據(jù)節(jié)點(diǎn)-DataNode馅而。一個(gè)數(shù)據(jù)節(jié)點(diǎn)對(duì)應(yīng)一個(gè)MySQL實(shí)例,一個(gè)物理主機(jī)可以部署多個(gè)MySQL實(shí)例譬圣。

  • 映射規(guī)則-DataRule瓮恭。映射規(guī)則根據(jù)對(duì)象主鍵映射存儲(chǔ)的節(jié)點(diǎn)與數(shù)據(jù)表,數(shù)據(jù)三要素均可獨(dú)立定義自己的映射規(guī)則厘熟。

2.2 存儲(chǔ)結(jié)構(gòu)

物理服務(wù)器與數(shù)據(jù)節(jié)點(diǎn)是一對(duì)多關(guān)系屯蹦,數(shù)據(jù)節(jié)點(diǎn)支持?jǐn)?shù)據(jù)庫(kù)與文件系統(tǒng)兩種方式维哈,描述數(shù)據(jù)統(tǒng)一存儲(chǔ)到數(shù)據(jù)庫(kù),塊數(shù)據(jù)內(nèi)容可存儲(chǔ)到數(shù)據(jù)庫(kù)或文件系統(tǒng)登澜。

2.2.1 服務(wù)器

服務(wù)器可以是物理主機(jī)或虛擬主機(jī)阔挠,一個(gè)主機(jī)可以部署多個(gè)數(shù)據(jù)節(jié)點(diǎn),節(jié)點(diǎn)類(lèi)型分為數(shù)據(jù)庫(kù)節(jié)點(diǎn)與文件系統(tǒng)節(jié)點(diǎn)脑蠕。邏輯關(guān)系如下圖:


服務(wù)器.png

注意:一個(gè)服務(wù)器可以多少數(shù)據(jù)節(jié)點(diǎn)购撼,需要有CPU、內(nèi)存谴仙、存儲(chǔ)容量迂求、網(wǎng)絡(luò)流量等資源多種綜合因素決定,具體根據(jù)實(shí)際情況定義晃跺。

2.2.2 存儲(chǔ)設(shè)計(jì)

數(shù)據(jù)三要素DataObject揩局、DataBlob或DataBlobRef的描述數(shù)據(jù)統(tǒng)一存儲(chǔ)到數(shù)據(jù)庫(kù),塊數(shù)據(jù)可以選擇數(shù)據(jù)庫(kù)存儲(chǔ)或文件存儲(chǔ)兩種方式哼审。邏輯關(guān)系如下圖:


存儲(chǔ)設(shè)計(jì).png

存儲(chǔ)分析

  • 數(shù)據(jù)對(duì)象谐腰。描述一個(gè)文件或自定義對(duì)象,記錄只能存儲(chǔ)到數(shù)據(jù)庫(kù)節(jié)點(diǎn)涩盾。
  • 數(shù)據(jù)塊引用十气。一個(gè)數(shù)據(jù)對(duì)象引用多個(gè)數(shù)據(jù)塊,記錄存儲(chǔ)到數(shù)據(jù)庫(kù)節(jié)點(diǎn)春霍。
  • 數(shù)據(jù)塊砸西。包括描述數(shù)據(jù)與數(shù)據(jù)二進(jìn)制內(nèi)容,兩者可以統(tǒng)一存儲(chǔ)址儒,數(shù)據(jù)內(nèi)容也可以分離存儲(chǔ)到文件系統(tǒng)芹枷。

2.3 服務(wù)部署

服務(wù)節(jié)點(diǎn)包括接口服務(wù)與存儲(chǔ)服務(wù)。接口服務(wù)支撐REST API訪(fǎng)問(wèn)莲趣,實(shí)現(xiàn)系統(tǒng)集成與二次開(kāi)發(fā)鸳慈,提供對(duì)象管理、數(shù)據(jù)上傳與下載服務(wù)喧伞。存儲(chǔ)服務(wù)提供數(shù)據(jù)庫(kù)節(jié)點(diǎn)與文件系統(tǒng)節(jié)點(diǎn)訪(fǎng)問(wèn)服務(wù)走芋,數(shù)據(jù)庫(kù)節(jié)點(diǎn)通過(guò)MyBatis訪(fǎng)問(wèn),文件系統(tǒng)節(jié)點(diǎn)通過(guò)TCP連接訪(fǎng)問(wèn)潘鲫。部署示意圖如下:

服務(wù)部署.png

2.3.1 對(duì)象管理

對(duì)象管理服務(wù)提供數(shù)據(jù)對(duì)象-DataObject增刪改查CRUD服務(wù)翁逞,以及對(duì)象搜索服務(wù),同時(shí)溉仑,數(shù)據(jù)對(duì)象引用若干數(shù)據(jù)塊挖函,服務(wù)提供數(shù)據(jù)塊引用DataBlobRef對(duì)象的增刪改查服務(wù),提供REST API接口服務(wù)浊竟。

2.3.2 上傳服務(wù)

數(shù)據(jù)上傳服務(wù)支持Multipart/form-data格式的文件數(shù)據(jù)塊兩種數(shù)據(jù)上傳方式怨喘。注意:完整文件的上傳受到系統(tǒng)限制津畸。數(shù)據(jù)塊上傳最大塊大小為2MB,多個(gè)數(shù)據(jù)塊構(gòu)成一個(gè)完整的數(shù)據(jù)對(duì)象必怜,塊數(shù)據(jù)上傳方式數(shù)據(jù)對(duì)象大小沒(méi)有限制洼畅,支持上傳超大文件,支持?jǐn)帱c(diǎn)續(xù)傳棚赔。

2.3.3 下載服務(wù)

數(shù)據(jù)下載服務(wù)支持application/octet-stream格式的文件數(shù)據(jù)塊兩種數(shù)據(jù)下載方式,兩種方式均支持?jǐn)帱c(diǎn)續(xù)傳徘郭。

2.3.4 搜索服務(wù)

對(duì)象搜索服務(wù)采用ElasticSearch實(shí)現(xiàn)對(duì)象實(shí)時(shí)索引與搜索服務(wù)靠益,輔助實(shí)現(xiàn)對(duì)象管理。

2.3.5 消息服務(wù)

消息服務(wù)采用Redis的發(fā)布-訂閱功能残揉,數(shù)據(jù)服務(wù)器存儲(chǔ)數(shù)據(jù)對(duì)象時(shí)胧后,發(fā)布消息通知索引服務(wù)提交ES索引。

2.3.6 文件服務(wù)

文件服務(wù)采用TCP Server抱环,實(shí)現(xiàn)內(nèi)網(wǎng)數(shù)據(jù)塊快速傳輸壳快,提供文件系統(tǒng)數(shù)據(jù)塊存取與管理服務(wù),支持文件塊的CRUD操作镇草。

2.3.7 數(shù)據(jù)庫(kù)服務(wù)

部署MySQL數(shù)據(jù)庫(kù)節(jié)點(diǎn)眶痰,存儲(chǔ)DataObject、DataBlob或DataBlobRef數(shù)據(jù)梯啤,根據(jù)映射規(guī)則-DataRule實(shí)現(xiàn)分服務(wù)器與分表路由規(guī)則竖伯。

2.4 系統(tǒng)設(shè)計(jì)

系統(tǒng)設(shè)計(jì)包括用戶(hù)層、接口層因宇、服務(wù)層七婴、中間層與存儲(chǔ)層。整體設(shè)計(jì)如下圖:


系統(tǒng)設(shè)計(jì).png

2.4.1 用戶(hù)層

用戶(hù)層包括分布式文件數(shù)據(jù)存儲(chǔ)系統(tǒng)后臺(tái)管理網(wǎng)站與JAVA Client API.

2.4.2 接口層

接口層提供節(jié)點(diǎn)服務(wù)察滑、對(duì)象服務(wù)打厘、上傳服務(wù)、下載服務(wù)與版本控制服務(wù)贺辰。

  • 節(jié)點(diǎn)服務(wù)户盯。提供節(jié)點(diǎn)注冊(cè)、性能監(jiān)控魂爪、心跳監(jiān)測(cè)先舷、服務(wù)調(diào)度功能。
  • 對(duì)象服務(wù)滓侍。提供數(shù)據(jù)對(duì)象創(chuàng)建蒋川、搜索、刪除與修改功能撩笆。
  • 上傳服務(wù)捺球。提供文件與數(shù)據(jù)塊上傳功能缸浦,支持超大文件上傳與斷點(diǎn)續(xù)傳。
  • 下載服務(wù)氮兵。提供文件與數(shù)據(jù)塊下載功能裂逐,支持客戶(hù)端數(shù)據(jù)塊錯(cuò)誤報(bào)告與檢查功能,支持大文件下載與斷點(diǎn)續(xù)傳泣栈。
  • 版本控制卜高。提供項(xiàng)目創(chuàng)建、分支南片、刪除掺涛、提交、鎖定與解鎖疼进、遷出等功能薪缆。

2.4.3 服務(wù)層

服務(wù)層包括對(duì)象管理、對(duì)象存儲(chǔ)伞广、版本管理拣帽、節(jié)點(diǎn)管理、資源管理嚼锄、用戶(hù)管理减拭、權(quán)限管理與系統(tǒng)監(jiān)控等模塊。

2.4.4 中間層

中間層包括搜索服務(wù)灾票、緩存服務(wù)峡谊、路由服務(wù)、數(shù)據(jù)編碼刊苍、數(shù)據(jù)同步與數(shù)據(jù)備份等服務(wù)既们。

  • 搜索服務(wù)。集成Elastic Search正什,提供分散在各服務(wù)器與數(shù)據(jù)表中的數(shù)據(jù)對(duì)象的統(tǒng)一搜索服務(wù)啥纸。
  • 緩存服務(wù)。集成Redis婴氮,提供用戶(hù)對(duì)象斯棒、機(jī)構(gòu)對(duì)象、數(shù)據(jù)資源主经、系統(tǒng)配置等常用信息緩存荣暮,利用發(fā)布-訂閱功能實(shí)現(xiàn)數(shù)據(jù)實(shí)施索引,實(shí)現(xiàn)分布式鎖支持版本控制的訪(fǎng)問(wèn)沖突問(wèn)題解決罩驻。
  • 路由服務(wù)穗酥。根據(jù)數(shù)據(jù)映射規(guī)則,將不同數(shù)據(jù)資源、記錄類(lèi)型與對(duì)象主鍵分發(fā)到不同數(shù)據(jù)節(jié)點(diǎn)砾跃,存儲(chǔ)到不同數(shù)據(jù)表或文件目錄骏啰。
  • 數(shù)據(jù)編碼。數(shù)據(jù)存取時(shí)抽高,提供數(shù)據(jù)編碼判耕、加密、壓縮等數(shù)據(jù)處理功能翘骂,有效保障數(shù)據(jù)安全性與節(jié)省存儲(chǔ)空間壁熄。
  • 數(shù)據(jù)同步。利用線(xiàn)程池-ThreadPool實(shí)現(xiàn)數(shù)據(jù)對(duì)象-DataObject碳竟、數(shù)據(jù)塊-DataBlob请毛、塊引用-DataBlobRef在不同數(shù)據(jù)節(jié)點(diǎn)同步。
  • 數(shù)據(jù)備份瞭亮。支持?jǐn)?shù)據(jù)庫(kù)-數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)-文件系統(tǒng)的備份-backup恢復(fù)-Restore固棚。

2.4.5 存儲(chǔ)層

數(shù)據(jù)存儲(chǔ)支持?jǐn)?shù)據(jù)庫(kù)節(jié)點(diǎn)與文件系統(tǒng)節(jié)點(diǎn)统翩,數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)使用MyBatis接口,文件系統(tǒng)采用自實(shí)現(xiàn)TCP鏈接訪(fǎng)問(wèn)此洲。

3 發(fā)布計(jì)劃

發(fā)布計(jì)劃.png

發(fā)布地址:BlobGenius

4 后記

這個(gè)項(xiàng)目只是一個(gè)簡(jiǎn)單的文件存儲(chǔ)系統(tǒng)厂汗,用于JAVA編程練手,幫助找到以前的編程感覺(jué)呜师,同時(shí)也適合新手學(xué)習(xí)娶桦,后續(xù)有空會(huì)逐步整理部署文檔與API接口文檔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末汁汗,一起剝皮案震驚了整個(gè)濱河市衷畦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌知牌,老刑警劉巖祈争,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異角寸,居然都是意外死亡菩混,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)扁藕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)沮峡,“玉大人,你說(shuō)我怎么就攤上這事亿柑⌒细恚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)秘症。 經(jīng)常有香客問(wèn)我照卦,道長(zhǎng),這世上最難降的妖魔是什么乡摹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任役耕,我火速辦了婚禮,結(jié)果婚禮上聪廉,老公的妹妹穿的比我還像新娘瞬痘。我一直安慰自己,他們只是感情好板熊,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布框全。 她就那樣靜靜地躺著,像睡著了一般干签。 火紅的嫁衣襯著肌膚如雪津辩。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天容劳,我揣著相機(jī)與錄音喘沿,去河邊找鬼。 笑死竭贩,一個(gè)胖子當(dāng)著我的面吹牛蚜印,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播留量,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼窄赋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了楼熄?” 一聲冷哼從身側(cè)響起忆绰,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎可岂,沒(méi)想到半個(gè)月后较木,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡青柄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年伐债,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片致开。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡峰锁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出双戳,到底是詐尸還是另有隱情虹蒋,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站魄衅,受9級(jí)特大地震影響峭竣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晃虫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一皆撩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哲银,春花似錦扛吞、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至做院,卻和暖如春盲泛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背键耕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工查乒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人郁竟。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像由境,于是被迫代替她去往敵國(guó)和親棚亩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344