軟件架構(gòu)IV: 定義的架構(gòu)特征

公司決定使用軟件解決特定問題奈梳,因此它收集了該系統(tǒng)的需求列表雇毫。 存在多種用于執(zhí)行需求收集的技術(shù)眠砾,這些技術(shù)通常由團隊使用的軟件開發(fā)過程定義商模。 但是至会,架構(gòu)師在設(shè)計軟件解決方案時必須考慮許多其他因素蜀肘,如圖所示吗蚌。

image.png

架構(gòu)師可以在定義域或業(yè)務(wù)需求方面進行協(xié)作科吭,但是一項主要職責(zé)是定義煞烫、發(fā)現(xiàn)和分析軟件必須執(zhí)行的與領(lǐng)域或業(yè)務(wù)不直接相關(guān)的所有事情:架構(gòu)特征损晤。

軟件架構(gòu)與編碼和設(shè)計的區(qū)別是什么?許多事情红竭,包括架構(gòu)師在定義架構(gòu)特征方面的角色尤勋,是獨立于問題域的系統(tǒng)方面的重要問題。許多組織使用各種術(shù)語(包括非功能性需求)來描述軟件的這些功能茵宪,但是我們不喜歡該術(shù)語最冰,因為它是貶義的。架構(gòu)師創(chuàng)建該術(shù)語是為了將架構(gòu)特征與功能需求區(qū)分開來稀火,但是從語言的角度來看暖哨,命名非功能性的東西會帶來負面影響:如何說服團隊充分注意“非功能性”的東西?另一個流行的術(shù)語是質(zhì)量屬性凰狞,我們不喜歡它篇裁,因為它暗示事后質(zhì)量評估而不是設(shè)計。我們更喜歡架構(gòu)特征赡若,因為它描述了對架構(gòu)以及整個系統(tǒng)的成功至關(guān)重要的關(guān)注點达布,同時又不影響其重要性。

架構(gòu)特征滿足三個條件:

  • 指定非領(lǐng)域設(shè)計注意事項
  • 影響設(shè)計結(jié)構(gòu)的某些方面
  • 對應(yīng)用程序的成功至關(guān)重要

我們定義的這些相互聯(lián)系的部分如圖所示逾冬。

image.png

圖中所示的定義除了列出的三個修飾符外黍聂,還列出了三個組件:

  • 指定非領(lǐng)域設(shè)計注意事項
    在設(shè)計應(yīng)用程序時,要求指定了應(yīng)用程序應(yīng)執(zhí)行的操作身腻;架構(gòu)特征指定了成功的運維和設(shè)計標準产还,涉及如何實施的要求以及為何做出某些選擇。例如嘀趟,一個常見的重要架構(gòu)特征為應(yīng)用程序指定了一定的性能水平脐区,而這通常不會出現(xiàn)在需求文檔中。更相關(guān)的示例是:沒有需求文檔指出“技術(shù)債務(wù)”她按,但這是架構(gòu)師和開發(fā)人員的常見設(shè)計考慮因素炕柔。我們在“從領(lǐng)域問題中提取架構(gòu)特征”中深入討論了顯性和隱性特征之間的區(qū)別。

  • 影響設(shè)計結(jié)構(gòu)的某些方面
    架構(gòu)師試圖在項目上描述架構(gòu)特征的主要原因與設(shè)計注意事項有關(guān):此架構(gòu)特征是否需要特殊的結(jié)構(gòu)考慮才能成功汗唱?例如丈攒,安全實際上是每個項目的關(guān)注點授霸,并且所有系統(tǒng)都必須在設(shè)計和編碼過程中采取預(yù)防措施基準。但是碘耳,當架構(gòu)師需要設(shè)計一些特殊的東西時,它會上升到架構(gòu)特征的水平辛辨。在示例系統(tǒng)中,考慮兩種圍繞付款的情況:

    • 第三方付款處理器
      如果在集成點處理付款明細指攒,則該架構(gòu)不需要特殊的結(jié)構(gòu)考慮。該設(shè)計應(yīng)包含標準的安全措施允悦,例如加密和散列虑啤,但不需要特殊的結(jié)構(gòu)。

    • 應(yīng)用程序內(nèi)付款處理
      如果正在設(shè)計的應(yīng)用程序必須處理付款狞山,則架構(gòu)師可以為此目的設(shè)計特定的模塊、組件或服務(wù)室埋,以從結(jié)構(gòu)上隔離關(guān)鍵的安全問題。現(xiàn)在姚淆,架構(gòu)特征對架構(gòu)和設(shè)計都有影響屡律。

當然,在很多情況下超埋,即使是這兩個標準也不足以做出此決定:在此決策過程中佳鳖,可能會出現(xiàn)過去的安全事件系吩,與第三方集成的性質(zhì)以及許多其他標準。它仍然顯示了架構(gòu)師在確定如何為某些功能進行設(shè)計時必須考慮的一些注意事項穿挨。

  • 對應(yīng)用程序成功至關(guān)重要
    應(yīng)用程序可以支持大量的架構(gòu)特征肴盏,但是不應(yīng)該如此。對每個架構(gòu)特征的支持增加了設(shè)計的復(fù)雜性菜皂。因此,對于架構(gòu)師來說榨崩,一項關(guān)鍵工作在于選擇最少的架構(gòu)特征,而不是選擇最大的可能性母蛛。

我們進一步將架構(gòu)特征細分為隱式和顯式架構(gòu)特征胳施。隱性需求很少出現(xiàn)在需求中,但它們對于項目成功是必不可少的舞肆。例如,可用性筷登、可靠性和安全性實際上是所有應(yīng)用程序的基礎(chǔ)哩盲,但很少在設(shè)計文檔中指定它們。架構(gòu)師必須在分析階段使用他們對問題領(lǐng)域的了解來發(fā)現(xiàn)這些架構(gòu)特征廉油。例如,高頻交易公司可能不必在每個系統(tǒng)中都指定低延遲班巩,但是該問題領(lǐng)域的架構(gòu)師知道這有多重要嘶炭。明確的架構(gòu)特征出現(xiàn)在需求文檔或其他特定說明中逊桦。

在圖中抑进,故意選擇三角形:每個定義元素都支持其他元素,而后者又支持系統(tǒng)的整體設(shè)計匿情。三角形創(chuàng)建的支點說明了以下事實户秤,即這些架構(gòu)特征經(jīng)常相互交互逮矛,從而導(dǎo)致架構(gòu)師在折衷一詞中普遍使用。

已列出架構(gòu)特征(部分)

架構(gòu)特征存在于整個軟件系統(tǒng)中须鼎,范圍從低級代碼特征(例如模塊化)到復(fù)雜的操作問題(例如可伸縮性和彈性)。盡管過去曾嘗試編成標準汞窗,但沒有真正的通用標準存在。相反仲吏,每個組織都會對這些術(shù)語創(chuàng)建自己的解釋蝌焚。此外,由于軟件生態(tài)系統(tǒng)變化如此之快许帐,因此不斷出現(xiàn)新的概念、術(shù)語成畦、度量和驗證涝开,從而為架構(gòu)特征定義提供了新的機會。

盡管數(shù)量眾多舀武、規(guī)模龐大,但架構(gòu)師通常將架構(gòu)特征分為幾大類衷旅。以下各節(jié)描述了一些示例。

運維架構(gòu)特征

運維架構(gòu)的特性涵蓋了性能柿顶、可伸縮性、彈性嘁锯、可用性和可靠性等功能。下表列出了一些運維i架構(gòu)特征蝗羊。

表——一般運維架構(gòu)特征

名詞 定義
可用性 系統(tǒng)將需要可用的時間(如果是24/7仁锯,則需要采取一些措施以使系統(tǒng)在發(fā)生任何故障時能夠快速啟動并運行)。
連續(xù)性 災(zāi)難恢復(fù)能力业崖。
性能 包括壓力測試、峰值分析狞悲、所使用功能的頻率妇斤、所需容量和響應(yīng)時間的分析。性能測試有時需要自己進行站超,需要幾個月的時間才能完成。
可恢復(fù)性 業(yè)務(wù)連續(xù)性要求(例如戚炫,在發(fā)生災(zāi)難的情況下媳纬,要求系統(tǒng)多長時間重新上線?)钮惠。這將影響備份策略和對冗余硬件的需求。
可靠性/安全性 評估系統(tǒng)是否需要是故障安全的蔑赘,或者是否以影響生命的方式對任務(wù)至關(guān)重要。如果失敗缩赛,是否會花費公司大量資金?
堅固性 如果互聯(lián)網(wǎng)連接中斷辩昆,斷電或硬件故障旨袒,則可以在運行時處理錯誤和邊界條件。
可擴展性 系統(tǒng)隨著用戶或請求數(shù)量的增加而執(zhí)行和運行的能力砚尽。

運維架構(gòu)特征與運維和DevOps關(guān)注點嚴重重疊,在許多軟件項目中形成了這些關(guān)注點的交集必孤。

結(jié)構(gòu)架構(gòu)特征
架構(gòu)師必須關(guān)注代碼結(jié)構(gòu)。 在許多情況下卓练,架構(gòu)師對代碼質(zhì)量問題負全責(zé)或共同承擔(dān)責(zé)任隘蝎,例如良好的模塊化,組件之間的受控耦合狮含,可讀代碼以及許多其他內(nèi)部質(zhì)量評估。 下表列出了一些結(jié)構(gòu)架構(gòu)特征几迄。

表——結(jié)構(gòu)架構(gòu)特征

名詞 定義
可配置性 最終用戶能夠輕松地(通過可用的界面)更改軟件配置的各個方面冰评。
可擴展性 插入新功能的重要特性。
可安裝性 易于在所有必要平臺上安裝系統(tǒng)甲雅。
杠桿/重用 能夠跨多個產(chǎn)品利用通用組件的能力。
本土化 在數(shù)據(jù)字段的輸入/查詢屏幕上支持多種語言抛人;報告,多字節(jié)字符要求以及度量單位或貨幣廷臼。
可維護性 應(yīng)用更改并增強系統(tǒng)有多容易?
可移植性 系統(tǒng)是否需要在多個平臺上運行荠商? (例如,前端是否需要針對Oracle和SAP DB運行掠剑?
可支持性 該應(yīng)用程序需要什么級別的技術(shù)支持郊愧?調(diào)試系統(tǒng)中的錯誤需要什么級別的日志記錄和其他功能?
可升級性 能夠輕松/快速地從該應(yīng)用程序/解決方案的先前版本升級到服務(wù)器和客戶端上的較新版本属铁。

橫切架構(gòu)特征

盡管許多架構(gòu)特征屬于易于識別的類別,但許多特征屬于不合理的分類焦蘑,但卻構(gòu)成了重要的設(shè)計約束和考慮因素。 下表說明了其中一些狡逢。

表——橫切架構(gòu)特征

名詞 定義
輔助功能 訪問您的所有用戶拼卵,包括諸如色盲或聽力障礙等殘障人士奢浑。
可歸檔性 一段時間后是否需要存檔或刪除數(shù)據(jù)? (例如即寡,客戶帳戶將在三個月后刪除或標記為已過時并存檔到輔助數(shù)據(jù)庫中以備將來訪問。)
認證方式 安全要求莺丑,以確保用戶是他們所說的墩蔓。
授權(quán)書 確保用戶只能訪問應(yīng)用程序中某些功能的安全性要求(按用例钢拧、子系統(tǒng)葡粒、網(wǎng)頁、業(yè)務(wù)規(guī)則卿嘲、字段級別等)夫壁。
法律 系統(tǒng)運行在哪些立法約束下(數(shù)據(jù)保護、Sarbanes Oxley盒让、GDPR等)?公司需要什么保留權(quán)邑茄?關(guān)于構(gòu)建或部署應(yīng)用程序方式的任何規(guī)定?
隱私 能夠向公司內(nèi)部員工隱藏事務(wù)(加密的事務(wù)左医,因此同木,即使DBA和網(wǎng)絡(luò)架構(gòu)師也看不到它們)。
安全 數(shù)據(jù)需要在數(shù)據(jù)庫中加密嗎秕硝?加密用于內(nèi)部系統(tǒng)之間的網(wǎng)絡(luò)通信斩萌?遠程用戶訪問需要使用哪種身份驗證?
可支持性 該應(yīng)用程序需要什么級別的技術(shù)支持颊郎?調(diào)試系統(tǒng)中的錯誤需要什么級別的日志記錄和其他功能姆吭?
可用性/可實現(xiàn)性 用戶通過應(yīng)用程序/解決方案實現(xiàn)其目標所需的培訓(xùn)水平唁盏。可用性要求與任何其他架構(gòu)問題一樣厘擂,都必須得到認真對待。

任何架構(gòu)特征列表都必然是不完整的列表刽严。 任何軟件都可以基于獨特因素來發(fā)明重要的架構(gòu)特征。

此外眨补,許多先前的術(shù)語不精確且含糊不清,有時是由于細微的差別或缺乏客觀的定義撑螺。例如,互操作性和兼容性可能看起來是等效的甘晤,這在某些系統(tǒng)中是正確的。但是调鬓,它們之間存在差異,因為互操作性意味著易于與其他系統(tǒng)集成腾窝,而后者又意味著已發(fā)布的居砖,已記錄的API。另一方面循集,兼容性更關(guān)注行業(yè)和領(lǐng)域標準蔗草。另一個例子是學(xué)習(xí)能力。一個定義是用戶學(xué)習(xí)使用軟件的難易程度咒精,另一個定義是系統(tǒng)可以自動了解其環(huán)境以使用機器學(xué)習(xí)算法進行自我配置或自我優(yōu)化的級別。

許多定義重疊歇拆。例如范咨,考慮可用性和可靠性,它們幾乎在所有情況下都重疊渠啊。但是請考慮基于TCP的互聯(lián)網(wǎng)協(xié)議UDP。 UDP通過IP可用贯溅,但不可靠:數(shù)據(jù)包可能會亂序到達,接收方可能不得不再次要求丟失數(shù)據(jù)包盗迟。

沒有完整的標準列表罚缕。國際標準組織(ISO)發(fā)布了按功能組織的列表,與我們列出的許多功能重疊邮弹,但主要是建立了不完整的類別列表。以下是一些ISO定義:

  • 性能效率
    相對于已知條件下使用的資源量的性能度量盟劫。這包括時間行為(響應(yīng)的度量与纽、處理時間和/或吞吐率的度量),資源利用率(使用的資源的數(shù)量和類型)和容量(超出最大已建立限制的程度)影所。

  • 兼容性
    產(chǎn)品僚碎、系統(tǒng)或組件可以在共享相同硬件或軟件環(huán)境的同時與其他產(chǎn)品、系統(tǒng)或組件交換信息和/或執(zhí)行其所需功能的程度勺阐。它包括共存(可以在與其他產(chǎn)品共享公共環(huán)境和資源的同時有效地執(zhí)行其所需的功能)和互操作性(兩個或多個系統(tǒng)可以交換和利用信息的程度)渊抽。

  • 易用性
    用戶可以針對其預(yù)期目的有效、高效且令人滿意地使用該系統(tǒng)腰吟。它包括適當性可識別性(用戶可以識別軟件是否適合他們的需求)、可學(xué)習(xí)性(用戶可以輕松學(xué)習(xí)如何使用軟件)、用戶錯誤保護(防止用戶犯錯誤)和可訪問性(使軟件可用)給具有最廣泛特征和能力的人)侦镇。

  • 可靠性
    系統(tǒng)在指定條件下指定時間段內(nèi)運行的程度。此特征包括以下子類別:成熟度(軟件是否滿足正常運行下的可靠性需求)壳繁、可用性(軟件可運行且可訪問)震捣、容錯(軟件是否在硬件或軟件故障的情況下仍按預(yù)期運行)和可恢復(fù)性(通過恢復(fù)任何受影響的數(shù)據(jù)并重新建立系統(tǒng)的所需狀態(tài),軟件可以從故障中恢復(fù))润樱。

  • 安全
    該軟件可以保護信息和數(shù)據(jù)的程度羡棵,從而使人員或其他產(chǎn)品或系統(tǒng)擁有與其權(quán)限類型和授權(quán)級別相適應(yīng)的數(shù)據(jù)訪問程度。這一系列特征包括機密性(只有授權(quán)訪問的人才能訪問數(shù)據(jù))皂冰、完整性(軟件可防止未經(jīng)授權(quán)訪問或修改軟件或數(shù)據(jù))店展、不可否認性(可以證明已采取行動或事件)、問責(zé)制(是否可以跟蹤用戶的用戶操作)和真實性(證明用戶身份)秃流。

  • 可維護性
    表示開發(fā)人員可以修改軟件以對其進行改進赂蕴,糾正或使其適應(yīng)環(huán)境和/或要求的變化的有效性和效率舶胀。此特性包括模塊化(軟件由離散組件組成的程度),可重用性(開發(fā)人員可以在多個系統(tǒng)中使用資產(chǎn)或用于構(gòu)建其他資產(chǎn)的程度)糖赔,可分析性(開發(fā)人員如何輕松地收集有關(guān)組件的具體指標)軟件),可修改性(開發(fā)人員可以在不引入缺陷或不降低現(xiàn)有產(chǎn)品質(zhì)量的情況下修改軟件的程度)和可測試性(開發(fā)人員及其他人員測試軟件的容易程度)纤控。

  • 可移植性
    開發(fā)人員可以將系統(tǒng)挂捻,產(chǎn)品或組件從一種硬件船万,軟件或其他操作或使用環(huán)境轉(zhuǎn)移到另一種環(huán)境的程度。此特征包括適應(yīng)性的子特性(開發(fā)人員可以有效地并有效地使軟件適應(yīng)不同或不斷發(fā)展的硬件耿导、軟件或其他操作或使用環(huán)境)声怔、可安裝性(可以在指定的環(huán)境中安裝和/或卸載軟件)和可替換性(開發(fā)人員以其他軟件輕松替換功能)。

ISO列表中的最后一項針對軟件的功能方面舱呻,我們認為它不屬于該列表:

  • 功能適用性
    此特性表示在特定條件下使用時,產(chǎn)品或系統(tǒng)提供滿足規(guī)定和隱含需求的功能的程度芥驳。此特征由以下子特征組成:
    • 功能完整性
      功能集涵蓋所有指定任務(wù)和用戶目標的程度茬高。
    • 功能正確性
      產(chǎn)品或系統(tǒng)以所需的精度提供正確結(jié)果的程度丽猬。
    • 功能適當性
      功能在多大程度上促進了特定任務(wù)和目標的完成。這些不是架構(gòu)特征由桌,而是構(gòu)建軟件的動機要求邑雅。這說明了如何思考架構(gòu)特征和問題域之間的關(guān)系淮野。

權(quán)衡與最差的架構(gòu)

由于多種原因,應(yīng)用程序只能支持我們列出的部分架構(gòu)特征队贱。首先锋恬,每個受支持的特征都需要進行設(shè)計工作嘉抓,也許還需要結(jié)構(gòu)上的支持蕾盯。其次,更大的問題在于以下事實:每個架構(gòu)特征通常會對其他特征產(chǎn)生影響鸥跟。例如枫匾,如果架構(gòu)師想要提高安全性很泊,那么幾乎可以肯定會對性能產(chǎn)生負面影響:應(yīng)用程序必須進行更多的動態(tài)加密,隱藏私密信息的間接操作以及可能降低性能的其他活動。

隱喻將有助于說明這種相互聯(lián)系。顯然燃异,飛行員經(jīng)常難以學(xué)習(xí)如何駕駛直升機仅颇,因為這需要對每只手和每只腳進行控制引颈,而改變一只手會影響另一只手粱年。因此,駕駛直升機是一項平衡的工作,它很好地描述了選擇架構(gòu)特征時的權(quán)衡過程粱快。架構(gòu)師設(shè)計支持的每種架構(gòu)特征都可能使總體設(shè)計復(fù)雜化币励。

因此仅胞,架構(gòu)師很少遇到能夠設(shè)計系統(tǒng)并使每個架構(gòu)特征最大化的情況。通常,決策歸結(jié)為幾個相互競爭的問題之間的權(quán)衡舔稀。

提示
永遠不要追求最佳架構(gòu),而要追求最差的架構(gòu)拂酣。

太多的架構(gòu)特征導(dǎo)致通用解決方案試圖解決每個業(yè)務(wù)問題,并且這些架構(gòu)很少起作用暂刘,因為設(shè)計變得笨拙。

這表明架構(gòu)師應(yīng)該努力設(shè)計架構(gòu)贵涵,使其盡可能地迭代。如果您可以更輕松地對架構(gòu)進行更改,則可以減少在第一次嘗試中發(fā)現(xiàn)確切正確內(nèi)容的壓力怀骤。敏捷軟件開發(fā)最重要的教訓(xùn)之一就是迭代的價值。這在軟件開發(fā)的各個級別(包括架構(gòu))都適用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末果复,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子索绪,更是在濱河造成了極大的恐慌晰筛,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逻杖,“玉大人,你說我怎么就攤上這事诞帐」交危” “怎么了拴孤?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵化漆,是天一觀的道長。 經(jīng)常有香客問我璧帝,道長页徐,這世上最難降的妖魔是什么窖贤? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上油吭,老公的妹妹穿的比我還像新娘。我一直安慰自己心包,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般波附。 火紅的嫁衣襯著肌膚如雪抖锥。 梳的紋絲不亂的頭發(fā)上谜喊,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天诵次,我揣著相機與錄音枚碗,去河邊找鬼。 笑死遵堵,一個胖子當著我的面吹牛怨规,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播壳坪,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼掰烟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蝎亚?” 一聲冷哼從身側(cè)響起惧磺,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤磨隘,失蹤者是張志新(化名)和其女友劉穎顾患,沒想到半個月后个唧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡犁河,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年桨螺,在試婚紗的時候發(fā)現(xiàn)自己被綠了酿秸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡肝箱,死狀恐怖煌张,靈堂內(nèi)的尸體忽然破棺而出退客,到底是詐尸還是另有隱情,我是刑警寧澤绎谦,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布粥脚,位于F島的核電站包个,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏树灶。R本人自食惡果不足惜糯而,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一熄驼、第九天 我趴在偏房一處隱蔽的房頂上張望烘豹。 院中可真熱鬧诺祸,春花似錦、人聲如沸憔鬼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽照雁。三九已至悼瘾,卻和暖如春亥宿,著一層夾襖步出監(jiān)牢的瞬間烫扼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工悟狱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留堰氓,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓浴麻,卻偏偏與公主長得像囤攀,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子膏萧,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

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