幾種架構(gòu)設(shè)計(jì)模式導(dǎo)論(中)

在上篇文章中,主要說(shuō)了架構(gòu)設(shè)計(jì)模式中的兩種昼汗,既:?jiǎn)螏?kù)單應(yīng)用模式肴熏、內(nèi)容分發(fā)模式,接下來(lái)介紹另外三種架構(gòu)模式顷窒,分別為:查詢(xún)分離蛙吏、微服務(wù)、多級(jí)緩存鞋吉。

1. 查詢(xún)分離

這種主要解決的痛點(diǎn)是單機(jī)數(shù)據(jù)庫(kù)壓力過(guò)大鸦做,從而導(dǎo)致業(yè)務(wù)緩慢甚至超時(shí),查詢(xún)的響應(yīng)時(shí)間變長(zhǎng)的問(wèn)題谓着,也包括需要大量數(shù)據(jù)庫(kù)計(jì)算資源的業(yè)務(wù)查詢(xún)請(qǐng)求泼诱。這個(gè)您可以認(rèn)為是單庫(kù)單應(yīng)用模式的升級(jí)版本,也是絕大多數(shù)公司技術(shù)架構(gòu)迭代演進(jìn)過(guò)程中的必由之路赊锚。 這種模式的一般設(shè)計(jì)見(jiàn)下圖:

Paste_Image.png

如上圖所示治筒,這種模式較單庫(kù)單應(yīng)用與內(nèi)容分發(fā)多了幾個(gè)部分屉栓,一個(gè)是業(yè)務(wù)數(shù)據(jù)庫(kù)進(jìn)行了主從分離,另一個(gè)是引入了ES耸袜,為什么要這樣友多?都解決了哪些問(wèn)題,下面具體結(jié)合業(yè)務(wù)需求場(chǎng)景進(jìn)行敘述堤框。

場(chǎng)景一:全文檢索

我想這個(gè)業(yè)務(wù)域滥,大多數(shù)應(yīng)用都會(huì)有,如果您使用傳統(tǒng)的數(shù)據(jù)庫(kù)查詢(xún)技術(shù)胰锌,大部分可能都會(huì)使用像like這種的SQL語(yǔ)句骗绕,高級(jí)一一些可能是先分詞藐窄,后通過(guò)分詞index相關(guān)的記錄资昧,弊端是SQL語(yǔ)句的性能與全表掃描機(jī)制導(dǎo)致了非常嚴(yán)重的性能問(wèn)題,現(xiàn)在基本上很少見(jiàn)到荆忍。

這里的ES(ElasticSearch)格带,是一種查詢(xún)引擎,類(lèi)似的還有Solr等刹枉,ES較Solr配置簡(jiǎn)單叽唱、使用起來(lái)更方便,所以這里選用了它微宝。另外棺亭,ES這種引擎支持橫向擴(kuò)展,理論上沒(méi)有性能的瓶頸蟋软。同時(shí)镶摘,它還支持各種插件、自定義分詞器等岳守,可擴(kuò)展性非常強(qiáng)凄敢。在這里,使用ES不僅可以完全替代數(shù)據(jù)庫(kù)完成全文檢索功能湿痢,還可以實(shí)現(xiàn)分頁(yè)涝缝、排序、分組譬重、分面等功能拒逮。具體的,請(qǐng)同學(xué)們自行學(xué)習(xí)臀规。那怎么用呢滩援?一般的流程是這樣的:

  1. 服務(wù)端把一條業(yè)務(wù)數(shù)據(jù)落庫(kù)落表
  2. 服務(wù)端異步把該條數(shù)據(jù)發(fā)送到ES
  3. ES把該條記錄按照事先寫(xiě)入的規(guī)則、配置放入自己的索引庫(kù)中
  4. 客戶(hù)端查詢(xún)的時(shí)候以现,由服務(wù)端把這個(gè)請(qǐng)求先發(fā)送到ES狠怨,得到數(shù)據(jù)后约啊,根據(jù)需求進(jìn)行拼裝、組合數(shù)據(jù)佣赖,返回給客戶(hù)端

實(shí)際中具體怎么用恰矩,還請(qǐng)同學(xué)們根據(jù)實(shí)際情況酌情做組合、取舍憎蛤。

場(chǎng)景二:海量的普通查詢(xún)

普通查詢(xún)是指我們的業(yè)務(wù)邏輯中的大部分輔助性的查詢(xún)外傅,如:取錢(qián)的時(shí)候必先查詢(xún)一下余額,根據(jù)用戶(hù)的ID查詢(xún)用戶(hù)的相關(guān)記錄俩檬,取得該用戶(hù)最新的一條取錢(qián)記錄等萎胰。我們肯定是要天天要用的,而且用的還非常多棚辽。同時(shí)呢技竟,我們的寫(xiě)入請(qǐng)求也是巨多的,導(dǎo)致大量的寫(xiě)入屈藐、查詢(xún)操作壓向同一數(shù)據(jù)庫(kù)榔组,然后,數(shù)據(jù)庫(kù)掛了联逻,系統(tǒng)也掛了搓扯,領(lǐng)導(dǎo)必然生氣了,你被開(kāi)除了包归,還不起房貸了锨推,露宿街頭了,你的老婆跟別人跑了公壤,......

不敢想换可,所以這個(gè)就要求我們必須分散數(shù)據(jù)庫(kù)的壓力,一個(gè)業(yè)界較成熟的方案就是數(shù)據(jù)庫(kù)的讀寫(xiě)分離境钟,寫(xiě)的時(shí)候入主庫(kù)锦担,讀的時(shí)候從從庫(kù)讀。這樣就把壓力分散到不同的數(shù)據(jù)庫(kù)中了慨削,如果一個(gè)讀庫(kù)性能不行洞渔,扛不住壓力的話(huà),可以一主多從缚态,橫向擴(kuò)展磁椒。可謂是一劑良藥懊德浆熔!那怎么使用呢?一個(gè)一般的流程是這樣的:

  1. 服務(wù)端把一條業(yè)務(wù)數(shù)據(jù)落庫(kù)
  2. 數(shù)據(jù)庫(kù)同步或異步或半同步把該條數(shù)據(jù)復(fù)制到從庫(kù)
  3. 服務(wù)端讀數(shù)據(jù)的時(shí)候直接去從庫(kù)讀相應(yīng)的數(shù)據(jù)

看起來(lái)比較簡(jiǎn)單吧桥帆,一些聰明的医增、愛(ài)思考的慎皱、上進(jìn)的、有老婆的同學(xué)可能發(fā)現(xiàn)問(wèn)題了叶骨,也包括上面介紹的場(chǎng)景一茫多,就是延遲的問(wèn)題,如:數(shù)據(jù)還沒(méi)有到從庫(kù)忽刽,我就馬上讀天揖,那么是讀不到的,會(huì)發(fā)生問(wèn)題的跪帝。

對(duì)于這個(gè)問(wèn)題今膊,各家公司解決的思路不一樣,方法不盡相同伞剑。一個(gè)普遍的解決方案是:讀不到就讀主庫(kù)斑唬,當(dāng)然這么說(shuō)也是有前提條件的,但具體的方案這里就不一一展開(kāi)了纸泄,我可能會(huì)在接下來(lái)的分享中詳解各種方案赖钞。

另外,關(guān)于數(shù)據(jù)庫(kù)的復(fù)制模式聘裁,還請(qǐng)同學(xué)們自行進(jìn)行學(xué)習(xí),太多了太多了弓千,這里說(shuō)不清衡便。該總結(jié)一下這種模式的優(yōu)缺點(diǎn)的了,如下:

優(yōu)點(diǎn):減少數(shù)據(jù)庫(kù)的壓力洋访,理論上可以提供無(wú)限高的讀性能镣陕,間接提高業(yè)務(wù)(寫(xiě))的性能,專(zhuān)用的查詢(xún)姻政、索引呆抑、全文(分詞)解決方案。
缺點(diǎn):數(shù)據(jù)的延遲汁展,數(shù)據(jù)一致性的保證較難鹊碍。

2. 微服務(wù)

上面的模式看似不錯(cuò),解決了性能問(wèn)題食绿,我終于可以不用露宿街頭了侈咕、老婆還是我的,哈哈器紧。但是

軟件系統(tǒng)天生的復(fù)雜性決定了耀销,除了性能,還有其他例如高可用铲汪、健壯性等大量問(wèn)題等待我們解決熊尉,再加上各個(gè)部門(mén)間的撕逼罐柳、扯皮,更讓我們碼農(nóng)雪上加霜狰住,所以

繼續(xù)吧......

微服務(wù)可以說(shuō)是最近的熱點(diǎn)硝清,花花綠綠、大大小小转晰、國(guó)內(nèi)國(guó)外的公司都在鼓吹芦拿,實(shí)踐這個(gè)模式,可是大部分都沒(méi)有弄清楚為什么要這么做查邢,也并不知道這么做有什么好處蔗崎、壞處,在這里扰藕,我將以我自己的親身實(shí)踐說(shuō)一下我對(duì)這個(gè)模式的看法缓苛。隨著業(yè)務(wù)與人員的增加,遇到了如下的問(wèn)題:

  1. 單機(jī)數(shù)據(jù)庫(kù)寫(xiě)請(qǐng)求量大量增加邓深,導(dǎo)致數(shù)據(jù)庫(kù)壓力變大
  • 數(shù)據(jù)庫(kù)一旦掛了未桥,那么整個(gè)業(yè)務(wù)都掛了
  • 業(yè)務(wù)代碼越來(lái)越多,都在一個(gè)GIT里芥备,越來(lái)越難以維護(hù)
  • 代碼腐化嚴(yán)重冬耿、臭味越來(lái)越濃
  • 上線(xiàn)越來(lái)越頻繁,經(jīng)常是一個(gè)小功能的修改萌壳,就要整個(gè)大項(xiàng)目要重新編譯
  • 部門(mén)越來(lái)越多亦镶,該哪個(gè)部門(mén)改動(dòng)大項(xiàng)目中的哪個(gè)東西,撕逼的厲害
  • 其他一些外圍系統(tǒng)直接連接數(shù)據(jù)庫(kù)袱瓮,導(dǎo)致一旦數(shù)據(jù)庫(kù)結(jié)構(gòu)發(fā)生變化缤骨,所有的相關(guān)系統(tǒng)都要通知,甚至對(duì)修改不敏感的系統(tǒng)也要通知
  • 每個(gè)應(yīng)用服務(wù)器需要開(kāi)通所有的權(quán)限尺借、網(wǎng)絡(luò)绊起、FTP、各種各樣的燎斩,因?yàn)槊總€(gè)服務(wù)器部署的應(yīng)用都是一樣的
  • 作為架構(gòu)師虱歪,我已經(jīng)失去了對(duì)這個(gè)系統(tǒng)的把控......

為了解決上述問(wèn)題,我司使用了微服務(wù)模式瘫里,這種模式的一般設(shè)計(jì)見(jiàn)下圖:

Paste_Image.png

如上圖所示实蔽,我把業(yè)務(wù)進(jìn)行分塊,做了垂直切分谨读,切成一個(gè)個(gè)獨(dú)立的系統(tǒng)局装,每個(gè)系統(tǒng)各自衍化,有自己的數(shù)據(jù)庫(kù)、緩存铐尚、ES等輔助系統(tǒng)拨脉,系統(tǒng)之間的實(shí)時(shí)交互通過(guò)RPC,異步交互通過(guò)MQ宣增,通過(guò)這種組合玫膀,共同完成整個(gè)系統(tǒng)功能。

那么爹脾,這么做是否真的解決上述問(wèn)題了呢帖旨?不玩虛的,一個(gè)個(gè)來(lái)說(shuō)灵妨。對(duì)于問(wèn)題一解阅,由于拆分成了多個(gè)子系統(tǒng),系統(tǒng)上的壓力被分散了泌霍,而各個(gè)子系統(tǒng)都有自己的數(shù)據(jù)庫(kù)實(shí)例货抄,所以數(shù)據(jù)庫(kù)的壓力變小。

對(duì)于問(wèn)題二朱转,一個(gè)子系統(tǒng)A的數(shù)據(jù)庫(kù)掛了蟹地,只是影響到系統(tǒng)A和使用系統(tǒng)A的那些功能,不會(huì)所有的功能不可用藤为,從而解決一個(gè)數(shù)據(jù)庫(kù)掛了怪与,導(dǎo)致所有功能不可用的問(wèn)題。

問(wèn)題三凉蜂、四琼梆,也因?yàn)椴鸱值玫搅私鉀Q,各個(gè)子系統(tǒng)有自己獨(dú)立的GIT代碼庫(kù)窿吩,不會(huì)相互影響。通用的模塊可通過(guò)庫(kù)错览、服務(wù)纫雁、平臺(tái)的形式解決。

問(wèn)題五倾哺,子系統(tǒng)A發(fā)生改變轧邪,需要上線(xiàn),那么我只需要編譯A羞海,然后上線(xiàn)就可以了忌愚,不需要其他系統(tǒng)做同樣的事情。

問(wèn)題六却邓,順應(yīng)了康威定律硕糊,我部門(mén)該干什么事、輸出什么,也通過(guò)服務(wù)的形式暴露出來(lái)简十,我部只管把我部的職責(zé)檬某、軟件功能做好就可以。

問(wèn)題七螟蝙,所有需要我部數(shù)據(jù)的需求恢恼,都通過(guò)接口的形式發(fā)布出去,客戶(hù)通過(guò)接口獲取數(shù)據(jù)胰默,從而屏蔽了底層數(shù)據(jù)庫(kù)結(jié)構(gòu)场斑,甚至數(shù)據(jù)來(lái)源,我部只需保證我部的接口契約沒(méi)有發(fā)生變化即可牵署,新的需求增加新的接口漏隐,不會(huì)影響老的接口。

問(wèn)題八碟刺,不同的子系統(tǒng)需要不同的權(quán)限锁保,這個(gè)問(wèn)題也優(yōu)雅的解決了。

問(wèn)題九半沽,暫時(shí)控制住了復(fù)雜性爽柒,我只需控制好大的方面,定義好系統(tǒng)邊界者填、接口浩村、大的流程,然后再分而治之占哟、逐個(gè)擊破心墅、合縱連橫。

目前來(lái)說(shuō)榨乎,所有問(wèn)題得到解決怎燥!bingo!

但是,這么做還會(huì)有許多其他的副作用會(huì)隨之產(chǎn)生蜜暑,如RPC铐姚、MQ的超高穩(wěn)定性、超高性能肛捍,網(wǎng)絡(luò)間的延遲隐绵,數(shù)據(jù)一致性等問(wèn)題,這里就不展開(kāi)來(lái)講了拙毫,太多了依许,一本書(shū)(厚)都講不完。

另外缀蹄,對(duì)于這個(gè)模式來(lái)說(shuō)峭跳,最難把握的應(yīng)該是度膘婶,切記不要切分過(guò)細(xì),我見(jiàn)過(guò)一個(gè)功能一個(gè)子系統(tǒng)坦康,上百個(gè)方法分成上百個(gè)子系統(tǒng)的竣付,真的是太過(guò)度了。實(shí)踐中滞欠,一個(gè)目前較為可行的方法是:能不分就不分古胆,除非有非常必要的理由!筛璧。

優(yōu)點(diǎn):相對(duì)高性能逸绎,可擴(kuò)展性強(qiáng),高可用夭谤,適合于中等以上規(guī)模公司架構(gòu)棺牧。
缺點(diǎn):復(fù)雜、度不好把握朗儒。指不僅需要一個(gè)能在高層把控大方向颊乘、大流程、總體技術(shù)的人醉锄,還需要針對(duì)各個(gè)子系統(tǒng)有針對(duì)性的開(kāi)發(fā)乏悄。把握不好度或者濫用的話(huà),這個(gè)模式適得其反恳不!

3.多級(jí)緩存

這個(gè)模式可以說(shuō)是應(yīng)對(duì)超高查詢(xún)壓力的一種普遍采用的策略檩小,基本的思想就是在所有鏈路的地方,盡能加緩存就加緩存烟勋,如下圖所示:

Paste_Image.png

如上圖所示规求,一般在三個(gè)地方加入,一個(gè)是客戶(hù)端處卵惦,一個(gè)是API網(wǎng)關(guān)處阻肿,一個(gè)是具體的后端業(yè)務(wù)處,下面分別介紹沮尿。

客戶(hù)端處:這個(gè)地方加緩存可以說(shuō)是效果最好的---無(wú)延遲冕茅。因?yàn)椴挥媒?jīng)過(guò)長(zhǎng)長(zhǎng)的網(wǎng)絡(luò)鏈條去后端業(yè)務(wù)處獲取數(shù)據(jù),從而導(dǎo)致加載時(shí)間過(guò)長(zhǎng)蛹找,客戶(hù)流失等損失。雖然有CDN的支持哨坪,但是從客戶(hù)端到CDN還是有網(wǎng)絡(luò)延遲的庸疾,雖然不大。具體的技術(shù)依據(jù)不同的客戶(hù)端而定当编,對(duì)于WEB來(lái)講届慈,有瀏覽器本地緩存、Cookie、Storage金顿、緩存策略等技術(shù)臊泌;對(duì)于A(yíng)PP來(lái)講,有本地?cái)?shù)據(jù)庫(kù)揍拆、本地文件渠概、本地內(nèi)存、進(jìn)程內(nèi)緩存支持嫂拴。以上提到的各種技術(shù)有興趣的同學(xué)可以繼續(xù)展開(kāi)來(lái)學(xué)習(xí)播揪。如果客戶(hù)端緩存沒(méi)有命中,那么就會(huì)去后端業(yè)務(wù)拿數(shù)據(jù)筒狠,一般來(lái)講猪狈,都會(huì)有個(gè)API網(wǎng)關(guān)芋簿,在這里加緩存也是非常有必要的购公。

API網(wǎng)關(guān)處:這個(gè)地方加緩存的好處是不用把請(qǐng)求發(fā)送到后方欺栗,直接在這里就處理了扇售,然后返回給請(qǐng)求者雾狈。常見(jiàn)的技術(shù)援制,如http請(qǐng)求蚓哩,API網(wǎng)關(guān)用的基本都是nginx尘应,可以使用nginx本身的緩存模塊谁帕,也可以使用Lua+Redis技術(shù)定制化峡继。其他的也都大同小異。

后端業(yè)務(wù)處:這個(gè)我想就不用多說(shuō)了匈挖,大家應(yīng)該差不多都知道碾牌,什么Redis,Memcache,Jvm內(nèi)等等,不熬述了儡循。

實(shí)踐中舶吗,要結(jié)合具體的實(shí)際情況,綜合利用各級(jí)緩存技術(shù)择膝,使得各種請(qǐng)求最大程度的在到達(dá)后端業(yè)務(wù)之前就被解決掉誓琼,從而減少后端服務(wù)壓力、減少占用帶寬肴捉、增強(qiáng)用戶(hù)體驗(yàn)腹侣。至于是否只有這三個(gè)地方加緩存,我覺(jué)得要活學(xué)活用齿穗,心法比劍法重要傲隶!總結(jié)一下這個(gè)模式的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):抗住大量讀請(qǐng)求,減少后端壓力窃页。
缺點(diǎn):數(shù)據(jù)一致性問(wèn)題較突出跺株,容易發(fā)生雪崩复濒,即:如果客戶(hù)端緩存失效、API網(wǎng)關(guān)緩存失效乒省,那么所有的大量請(qǐng)求瞬間壓向后端業(yè)務(wù)系統(tǒng)巧颈,后果可想而知。

本次分享的中篇到此結(jié)束袖扛,接下來(lái)的下篇將介紹最后三種模式:分庫(kù)分表模式砸泛、彈性伸縮模式、多機(jī)房模式攻锰,相對(duì)來(lái)講技術(shù)含量更高晾嘶,敬請(qǐng)期待!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末娶吞,一起剝皮案震驚了整個(gè)濱河市垒迂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌妒蛇,老刑警劉巖机断,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異绣夺,居然都是意外死亡吏奸,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)陶耍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)奋蔚,“玉大人,你說(shuō)我怎么就攤上這事烈钞〔幢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵毯欣,是天一觀(guān)的道長(zhǎng)馒过。 經(jīng)常有香客問(wèn)我,道長(zhǎng)酗钞,這世上最難降的妖魔是什么腹忽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮砚作,結(jié)果婚禮上窘奏,老公的妹妹穿的比我還像新娘。我一直安慰自己葫录,他們只是感情好蔼夜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著压昼,像睡著了一般求冷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窍霞,一...
    開(kāi)封第一講書(shū)人閱讀 51,245評(píng)論 1 299
  • 那天匠题,我揣著相機(jī)與錄音,去河邊找鬼但金。 笑死韭山,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的冷溃。 我是一名探鬼主播钱磅,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼似枕!你這毒婦竟也來(lái)了盖淡?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凿歼,失蹤者是張志新(化名)和其女友劉穎褪迟,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體答憔,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡味赃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了虐拓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片心俗。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蓉驹,靈堂內(nèi)的尸體忽然破棺而出城榛,到底是詐尸還是另有隱情,我是刑警寧澤戒幔,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布吠谢,位于F島的核電站,受9級(jí)特大地震影響诗茎,放射性物質(zhì)發(fā)生泄漏工坊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一敢订、第九天 我趴在偏房一處隱蔽的房頂上張望王污。 院中可真熱鬧,春花似錦楚午、人聲如沸昭齐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)阱驾。三九已至就谜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間里覆,已是汗流浹背丧荐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喧枷,地道東北人虹统。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像隧甚,于是被迫代替她去往敵國(guó)和親车荔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

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