系統(tǒng)架構(gòu)設(shè)計筆記(46)—— 面向服務(wù)的架構(gòu)

迄今為止,對于面向服務(wù)的架構(gòu)( Service-Oriented Architecture 眯亦, SOA )還沒有一個公認的定義刊驴。許多組織從不同的角度和不同的側(cè)面對 SOA 進行了描述喧笔,較為典型的有以下三個:

(1)W3C 的定義

SOA 是一種應(yīng)用程序架構(gòu),在這種架構(gòu)中寸痢,所有功能都定義為獨立的服務(wù),這些服務(wù)帶有定義明確的可調(diào)用接口紊选,能夠以定義好的順序調(diào)用這些服務(wù)來形成業(yè)務(wù)流程啼止。

(2)Service-architecture.com 的定義

服務(wù)是精確定義 、 封裝完善 兵罢、 獨立于其他服務(wù)所處環(huán)境和狀態(tài)的函數(shù) 献烦。SOA 本質(zhì)上是服務(wù)的集合,服務(wù)之間彼此通信卖词,這種通信可能是簡單的數(shù)據(jù)傳送巩那,也可能是兩個或更多的服務(wù)協(xié)調(diào)進行某些活動。服務(wù)之間需要某些方法進行連接此蜈。

(3)Gartner 的定義

SOA 是一種 C/S 架構(gòu)的軟件設(shè)計方法即横,應(yīng)用由服務(wù)和服務(wù)使用者組成, SOA 與大多數(shù)通用的 C/S 架構(gòu)模型不同之處裆赵,在于它著重強調(diào)構(gòu)件的松散耦合令境,并使用獨立的標準接口。

1 SOA 概述

SOA 是一種在計算環(huán)境中設(shè)計 顾瞪、 開發(fā) 舔庶、 部署和管理離散邏輯單元(服務(wù))模型的方法抛蚁。 SOA 并不是一個新鮮事物,而只是面向?qū)ο竽P偷囊环N替代惕橙。雖然基于 SOA 的系統(tǒng)并不排除使用 OOD 來構(gòu)建單個服務(wù)瞧甩,但是其整體設(shè)計卻是面向服務(wù)的。由于 SOA 考慮到了系統(tǒng)內(nèi)的對象弥鹦,所以雖然 SOA 是基于對象的肚逸,但是作為一個整體,它卻不是面向?qū)ο蟮摹?/p>

SOA 系統(tǒng)原型的一個典型例子是 CORBA 彬坏,它已經(jīng)出現(xiàn)很長時間朦促,其定義的概念與 SOA 相似。 SOA 建立在 XML 等新技術(shù)的基礎(chǔ)上栓始,通過使用基于 XML 的語言來描述接口务冕,服務(wù)已經(jīng)轉(zhuǎn)到更動態(tài)且更靈活的接口系統(tǒng)中, CORBA 中的 IDL 無法與之相比幻赚。圖 1 描述了一個完整的 SOA 模型禀忆。

CORBA ( Common Object Request Broker Architecture 公共對象請求代理體系結(jié)構(gòu))是由 OMG 組織制訂的一種標準的面向?qū)ο髴?yīng)用程序體系規(guī)范÷淠眨或者說 CORBA 體系結(jié)構(gòu)是對象管理組織( OMG )為解決分布式處理環(huán)境 (DCE) 中箩退,硬件和軟件系統(tǒng)的互連而提出的一種解決方案; OMG 組織是一個國際性的非盈利組織佳谦,其職責是為應(yīng)用開發(fā)提供一個公共框架戴涝,制訂工業(yè)指南和對象管理規(guī)范,加快對象技術(shù)的發(fā)展钻蔑。

IDL 的全稱接口定義語言啥刻,是用來描述軟件組件接口的一種規(guī)范語言。用戶可以定義模塊矢棚、接口郑什、屬性、方法蒲肋、輸入輸出參數(shù)蘑拯,甚至異常等等。

在 SOA 模型中兜粘,所有的功能都定義成了獨立的服務(wù)申窘。服務(wù)之間通過交互和協(xié)調(diào)完成業(yè)務(wù)的整體邏輯。所有的服務(wù)通過服務(wù)總線或流程管理器來連接孔轴。這種松散耦合的架構(gòu)使得各服務(wù)在交互過程中無需考慮雙方的內(nèi)部實現(xiàn)細節(jié)剃法,以及部署在什么平臺上。

1.1 服務(wù)的基本結(jié)構(gòu)

一個獨立的服務(wù)基本結(jié)構(gòu)如圖 2 所示路鹰。

由圖 2 可以看出贷洲,服務(wù)模型的表示層從邏輯層分離出來收厨,中間增加了服務(wù)對外的接口層。通過服務(wù)接口的標準化描述优构,使得服務(wù)可以提供給在任何異構(gòu)平臺和任何用戶接口使用诵叁。這允許并支持基于服務(wù)的系統(tǒng)成為松散耦合 、 面向構(gòu)件和跨技術(shù)實現(xiàn)钦椭,服務(wù)請求者很可能根本不知道服務(wù)在哪里運行 拧额、 是由哪種語言編寫的,以及消息的傳輸路徑彪腔,而是只需要提出服務(wù)請求侥锦,然后就會得到答案。

1.2 SOA 設(shè)計原則

在 SOA 架構(gòu)中德挣,繼承了來自對象和構(gòu)件設(shè)計的各種原則恭垦,例如,封裝和自我包含等盲厌。那些保證服務(wù)的靈活性 署照、 松散耦合和復(fù)用能力的設(shè)計原則祸泪,對 SOA 架構(gòu)來說同樣是非常重要的吗浩。關(guān)于服務(wù),一些常見的設(shè)計原則如下:

(1)明確定義的接口

服務(wù)請求者依賴于服務(wù)規(guī)約來調(diào)用服務(wù)没隘,因此懂扼,服務(wù)定義必須長時間穩(wěn)定,一旦公布右蒲,不能隨意更改阀湿;服務(wù)的定義應(yīng)盡可能明確,減少請求者的不適當使用瑰妄;不要讓請求者看到服務(wù)內(nèi)部的私有數(shù)據(jù)陷嘴。

(2)自包含和模塊化

服務(wù)封裝了那些在業(yè)務(wù)上穩(wěn)定 、 重復(fù)出現(xiàn)的活動和構(gòu)件间坐,實現(xiàn)服務(wù)的功能實體是完全獨立自主的灾挨,獨立進行部署 、 版本控制 竹宋、 自我管理和恢復(fù)劳澄。

(3)粗粒度

服務(wù)數(shù)量不應(yīng)該太多,依靠消息交互而不是遠程過程調(diào)用蜈七,通常消息量比較大秒拔,但是服務(wù)之間的交互頻度較低。

(4)松耦合

服務(wù)請求者可見的是服務(wù)的接口飒硅,其位置 砂缩、 實現(xiàn)技術(shù) 作谚、 當前狀態(tài)和私有數(shù)據(jù)等,對服務(wù)請求者而言是不可見的庵芭。

(5)互操作性食磕、兼容和策略聲明

為了確保服務(wù)規(guī)約的全面和明確,策略成為一個越來越重要的方面喳挑。這可以是技術(shù)相關(guān)的內(nèi)容彬伦,例如,一個服務(wù)對安全性方面的要求伊诵;也可以是與業(yè)務(wù)有關(guān)的語義方面的內(nèi)容单绑,例如,需要滿足的費用或者服務(wù)級別方面的要求曹宴,這些策略對于服務(wù)在交互時是非常重要的搂橙。

1.3 服務(wù)構(gòu)件與傳統(tǒng)構(gòu)件

服務(wù)構(gòu)件架構(gòu)( Service Component Architecture , SCA )是基于 SOA 的思想描述服務(wù)之間組合和協(xié)作的規(guī)范笛坦,它描述用于使用 SOA 構(gòu)建應(yīng)用程序和系統(tǒng)的模型区转。它可簡化使用 SOA 進行的應(yīng)用程序開發(fā)和實現(xiàn)工作 。

SCA 提供了構(gòu)建粗粒度構(gòu)件的機制版扩,這些粗粒度構(gòu)件由細粒度構(gòu)件組裝而成 废离。SCA 將傳統(tǒng)中間件編程從業(yè)務(wù)邏輯分離出來,從而使程序員免受其復(fù)雜性的困擾礁芦。它允許開發(fā)人員集中精力編寫業(yè)務(wù)邏輯蜻韭,而不必將大量的時間花費在更為底層的技術(shù)實現(xiàn)上 。

SCA 服務(wù)構(gòu)件與傳統(tǒng)構(gòu)件的主要區(qū)別在于柿扣,服務(wù)構(gòu)件往往是粗粒度的肖方,而傳統(tǒng)構(gòu)件以細粒度居多;服務(wù)構(gòu)件的接口是標準的未状,主要是服務(wù)描述語言接口俯画,而傳統(tǒng)構(gòu)件常以具體 API 形式出現(xiàn);服務(wù)構(gòu)件的實現(xiàn)與語言是無關(guān)的司草,而傳統(tǒng)構(gòu)件常綁定某種特定的語言艰垂;服務(wù)構(gòu)件可以通過構(gòu)件容器提供 QoS 的服務(wù),而傳統(tǒng)構(gòu)件完全由程序代碼直接控制翻伺。

QoS ( Quality of Service 材泄,服務(wù)質(zhì)量)指一個網(wǎng)絡(luò)能夠利用各種基礎(chǔ)技術(shù),為指定的網(wǎng)絡(luò)通信提供更好的服務(wù)能力吨岭,是網(wǎng)絡(luò)的一種安全機制拉宗,是用來解決網(wǎng)絡(luò)延遲和阻塞等問題的一種技術(shù)。 QoS 的保證對于容量有限的網(wǎng)絡(luò)來說是十分重要的,特別是對于流多媒體應(yīng)用旦事,例如 VoIP 和 IPTV 等魁巩,因為這些應(yīng)用常常需要固定的傳輸率,對延時也比較敏感姐浮。

基于IP的語音傳輸(英語:Voice over Internet Protocol谷遂,縮寫為VoIP)是一種語音通話技術(shù),經(jīng)由網(wǎng)際協(xié)議(IP)來達成語音通話與多媒體會議卖鲤,也就是經(jīng)由互聯(lián)網(wǎng)來進行通信肾扰。其他非正式的名稱有IP電話(IP telephony)、互聯(lián)網(wǎng)電話(Internet telephony)蛋逾、寬帶電話(broadband telephony)以及寬帶電話服務(wù)(broadband phone service)集晚。
IPTV 即交互式網(wǎng)絡(luò)電視,是一種利用寬帶有線電視網(wǎng)区匣,集互聯(lián)網(wǎng) 偷拔、 多媒體 、 通訊等多種技術(shù)于一體亏钩,向家庭用戶提供包括數(shù)字電視在內(nèi)的多種交互式服務(wù)的嶄新技術(shù)莲绰。用戶在家中可以享受 IPTV 服務(wù)。 IPTV 既不同于傳統(tǒng)的模擬式有線電視姑丑,也不同于經(jīng)典的數(shù)字電視蛤签,因為傳統(tǒng)的模擬電視和經(jīng)典的數(shù)字電視都具有頻分制 、 定時 彻坛、 單向廣播等特點顷啼。盡管經(jīng)典的數(shù)字電視相對于模擬電視有許多技術(shù)革新踏枣,但只是信號形式的改變昌屉,而沒有觸及媒體內(nèi)容的傳播方式。

2 SOA 的關(guān)鍵技術(shù)

SOA 伴隨著無處不在的標準茵瀑,為企業(yè)的現(xiàn)有資產(chǎn)或投資帶來了更好的復(fù)用性间驮。 SOA 能夠在最新的和現(xiàn)有的系統(tǒng)之上創(chuàng)建應(yīng)用,借助現(xiàn)有的應(yīng)用產(chǎn)生新的服務(wù)马昨,為企業(yè)提供更好的靈活性來構(gòu)建系統(tǒng)和業(yè)務(wù)流程竞帽。 SOA 是一種全新的架構(gòu),為了支持其各種特性鸿捧,相關(guān)的技術(shù)規(guī)范不斷推出屹篓。與 SOA 緊密相關(guān)的技術(shù)主要有UDDI、WSDL匙奴、 SOAP和 REST 等堆巧,而這些技術(shù)都是以 XML 為基礎(chǔ)而發(fā)展起來的。

2.1 UDDI

UDDI ( Universal Description Discovery and Integration ,統(tǒng)一描述 谍肤、 發(fā)現(xiàn)和集成)提供了一種服務(wù)發(fā)布 啦租、 查找和定位的方法,是服務(wù)的信息注冊規(guī)范荒揣,以便被需要該服務(wù)的用戶發(fā)現(xiàn)和使用它篷角。 UDDI 規(guī)范描述了服務(wù)的概念,同時也定義了一種編程接口系任。通過 UDDI 提供的標準接口恳蹲,企業(yè)可以發(fā)布自己的服務(wù)供其他企業(yè)查詢和調(diào)用,也可以查詢特定服務(wù)的描述信息俩滥,并動態(tài)綁定到該服務(wù)上阱缓。在 UDDI 技術(shù)規(guī)范中,主要包含以下三個部分的內(nèi)容:

(1)數(shù)據(jù)模型

UDDI 數(shù)據(jù)模型是一個用于描述業(yè)務(wù)組織和服務(wù)的 XMLSchema 举农。

(2)API

UDDI API 是一組用于查找或發(fā)布 UDDI 數(shù)據(jù)的方法荆针, UDDI API 基于 SOAP。

(3)注冊服務(wù)

UDDI 注冊服務(wù)是 SOA 中的一種基礎(chǔ)設(shè)施颁糟,對應(yīng)著服務(wù)注冊中心的角色航背。

2.2 WSDL

WSDL(Web Service Description Language,Web 服務(wù)描述語言)是對服務(wù)進行描述的語言棱貌,它有一套基于 XML 的語法定義 玖媚。WSDL 描述的重點是服務(wù),它包含服務(wù)實現(xiàn)定義和服務(wù)接口定義婚脱,如圖 3 所示今魔。

采用抽象接口定義對于提高系統(tǒng)的擴展性很有幫助。

服務(wù)接口定義就是一種抽象的 障贸、 可重用的定義错森,行業(yè)標準組織可以使用這種抽象的定義來規(guī)定一些標準的服務(wù)類型,服務(wù)實現(xiàn)者可以根據(jù)這些標準定義來實現(xiàn)具體的服務(wù)篮洁。服務(wù)實現(xiàn)定義描述了給定服務(wù)提供者如何實現(xiàn)特定的服務(wù)接口涩维。

服務(wù)實現(xiàn)定義中包含服務(wù)和端口描述。一個服務(wù)往往會包含多個服務(wù)訪問入口袁波,而每個訪問入口都會使用一個端口元素來描述瓦阐,端口描述的是一個服務(wù)訪問入口的部署細節(jié),例如篷牌,通過哪個地址來訪問睡蟋,應(yīng)當使用怎樣的消息調(diào)用模式來訪問等。

2.3 SOAP

SOAP ( Simple Object Access Protocol 枷颊,簡單對象訪問協(xié)議)定義了服務(wù)請求者和服務(wù)提供者之間的消息傳輸規(guī)范戳杀。 SOAP 用 XML 來格式化消息叫倍,用 HTTP 來承載消息。通過 SOAP 豺瘤,應(yīng)用程序可以在網(wǎng)絡(luò)中進行數(shù)據(jù)交換和遠程過程調(diào)用( Remote Procedure Call 吆倦, RPC )。

SOAP 主要包括以下四個部分:

(1)封裝

SOAP 封裝定義了一個整體框架坐求,用來表示消息中包含什么內(nèi)容蚕泽,誰來處理這些內(nèi)容,以及這些內(nèi)容是可選的還是必需的桥嗤。

(2)編碼規(guī)則

SOAP 編碼規(guī)則定義了一種序列化的機制须妻,用于交換系統(tǒng)所定義的數(shù)據(jù)類型的實例。

(3)RPC 表示

SOAP RPC 表示定義了一個用來表示遠程過程調(diào)用和應(yīng)答的協(xié)議泛领。

(4)綁定

SOAP 綁定定義了一個使用底層傳輸協(xié)議來完成在節(jié)點之間交換 SOAP 封裝的約定荒吏。

SOAP 消息基本上是從發(fā)送端到接收端的單向傳輸,但它們常常結(jié)合起來執(zhí)行類似于請求 / 應(yīng)答的模式渊鞋。所有的 SOAP 消息都使用 XML 進行編碼绰更。 SOAP 消息包括以下三個部分:

(1)封裝(信封)

封裝的元素名是 Envelope ,在表示消息的 XML 文檔中锡宋,封裝是頂層元素儡湾,在 SOAP 消息中必須出現(xiàn)。

(2)SOAP 頭

SOAP 頭的元素名是 Header 执俩,提供了向 SOAP 消息中添加關(guān)于這條 SOAP 消息的某些要素的機制徐钠。 SOAP 定義了少量的屬性用來表明這項要素是否可選以及由誰來處理。 SOAP 頭在 SOAP 消息中可能出現(xiàn)役首,也可能不出現(xiàn)尝丐。如果出現(xiàn)的話,必須是 SOAP 封裝元素的第一個直接子元素衡奥。

(3)SOAP 體

SOAP 體的元素名是 Body 爹袁,是包含消息的最終接收者想要的信息的容器。 SOAP 體在 SOAP 消息中必須出現(xiàn)且必須是 SOAP 封裝元素的直接子元素杰赛。如果有頭元素呢簸,則 SOAP 體必須直接跟在 SOAP 頭元素之后;如果沒有頭元素乏屯,則 SOAP 體必須是 SOAP 封裝元素的第一個直接子元素。

(4)REST

REST ( Representational State Transfer 瘦赫,表述性狀態(tài)轉(zhuǎn)移)是一種只使用 HTTP 和 XML 進行基于 Web 通信的技術(shù)辰晕,可以降低開發(fā)的復(fù)雜性,提高系統(tǒng)的可伸縮性确虱。它的簡單性和缺少嚴格配置文件的特性含友,使它與 SOAP 很好地隔離開來, REST 從根本上來說只支持幾個操作( POST、GET窘问、PUT 和 DELETE )辆童,這些操作適用于所有的消息。 REST 提出了如下一些設(shè)計概念和準則:

(1)網(wǎng)絡(luò)上的所有事物都被抽象為資源惠赫。
(2)每個資源對應(yīng)一個唯一的資源標識把鉴。
(3)通過通用的連接件接口對資源進行操作。
(4)對資源的各種操作不會改變資源標識儿咱。
(5)所有的操作都是無狀態(tài)的庭砍。

3 SOA 的實現(xiàn)方法

SOA 只是一種概念和思想,需要借助于具體的技術(shù)和方法來實現(xiàn)它混埠。從本質(zhì)上來看怠缸, SOA 是用本地計算模型來實現(xiàn)一個分布式的計算應(yīng)用,也有人稱這種方法為 “ 本地化設(shè)計钳宪,分布式工作 ” 模型 揭北。CORBA、DCOM 和 EJB 等都屬于這種解決方式吏颖,也就是說罐呼, SOA 最終可以基于這些標準來實現(xiàn)。

從邏輯上和高層抽象來看侦高,目前嫉柴,實現(xiàn) SOA 的方法也比較多,其中主流方式有 WebService奉呛、 企業(yè)服務(wù)總線和服務(wù)注冊表计螺。

3.1 Web Service

在 Web Service ( Web 服務(wù))的解決方案中,一共有三種工作角色瞧壮,其中服務(wù)提供者和服務(wù)請求者是必需的登馒,服務(wù)注冊中心是一個可選的角色。它們之間的交互和操作構(gòu)成了 SOA 的一種實現(xiàn)架構(gòu)咆槽,如圖 4 所示陈轿。

(1)服務(wù)提供者

服務(wù)提供者是服務(wù)的所有者,該角色負責定義并實現(xiàn)服務(wù)秦忿,使用 WSDL 對服務(wù)進行詳細 麦射、 準確 、 規(guī)范地描述灯谣,并將該描述發(fā)布到服務(wù)注冊中心潜秋,供服務(wù)請求者查找并綁定使用贞瞒。

(2)服務(wù)請求者

服務(wù)請求者是服務(wù)的使用者羡洛,雖然服務(wù)面向的是程序乱豆,但程序的最終使用者仍然是用戶钩述。從架構(gòu)的角度看,服務(wù)請求者是查找 牙勘、 綁定并調(diào)用服務(wù)职恳,或與服務(wù)進行交互的應(yīng)用程序谜悟。服務(wù)請求者角色可以由瀏覽器來擔當,由人或程序(例如葡幸,另外一個服務(wù))來控制最筒。

(3)服務(wù)注冊中心

服務(wù)注冊中心是連接服務(wù)提供者和服務(wù)請求者的紐帶蔚叨,服務(wù)提供者在此發(fā)布他們的服務(wù)描述,而服務(wù)請求者在服務(wù)注冊中心查找他們需要的服務(wù)邢锯。不過搀别,在某些情況下,服務(wù)注冊中心是整個模型中的可選角色蒂培。例如护戳,如果使用靜態(tài)綁定的服務(wù)垂睬,服務(wù)提供者則可以把描述直接發(fā)送給服務(wù)請求者驹饺。

WebService 模型中的操作包括發(fā)布 、 查找和綁定么伯,這些操作可以單次或反復(fù)出現(xiàn)田柔。

(1)發(fā)布

為了使用戶能夠訪問服務(wù),服務(wù)提供者需要發(fā)布服務(wù)描述硬爆,以便服務(wù)請求者可以查找它擎鸠。

(2)查找

在查找操作中劣光,服務(wù)請求者直接檢索服務(wù)描述或在服務(wù)注冊中心查詢所要求的服務(wù)類型绢涡。對服務(wù)請求者而言,可能會在生命周期的兩個不同階段中涉及查找操作凿傅,首先是在設(shè)計階段数苫,為了程序開發(fā)而查找服務(wù)的接口描述虐急;其次是在運行階段止吁,為了調(diào)用而查找服務(wù)的位置描述。

(3)綁定

在綁定操作中敷待,服務(wù)請求者使用服務(wù)描述中的綁定細節(jié)來定位 仁热、 聯(lián)系并調(diào)用服務(wù)抗蠢,從而在運行時與服務(wù)進行交互迅矛。綁定可以分為動態(tài)綁定和靜態(tài)綁定。

  1. 在動態(tài)綁定中壶硅,服務(wù)請求者通過服務(wù)注冊中心查找服務(wù)描述庐椒,并動態(tài)地與服務(wù)交互;
  2. 在靜態(tài)綁定中笔宿,服務(wù)請求者已經(jīng)與服務(wù)提供者達成默契泼橘,通過本地文件或其他方式直接與服務(wù)進行綁定迈勋。

在采用 WebService 作為 SOA 的實現(xiàn)技術(shù)時粪躬,應(yīng)用系統(tǒng)大致可以分為六個層次,分別是底層傳輸層 提前、 服務(wù)通信協(xié)議層 狈网、 服務(wù)描述層 笨腥、 服務(wù)層 脖母、 業(yè)務(wù)流程層和服務(wù)注冊層谆级。

(1)底層傳輸層

底層傳輸層主要負責消息的傳輸機制, HTTP 脚仔、JMS ( Java Messaging Service 舆绎, Java 消息服務(wù))和 SMTP 都可以作為服務(wù)的消息傳輸協(xié)議,其中 HTTP 使用最廣窥突。

(2)服務(wù)通信協(xié)議層

服務(wù)通信協(xié)議層的主要功能是描述并定義服務(wù)之間進行消息傳遞所需的技術(shù)標準波岛,常用的標準是 SOAP 和 REST 協(xié)議音半。

(3)服務(wù)描述層

服務(wù)描述層主要以一種統(tǒng)一的方式描述服務(wù)的接口與消息交換方式曹鸠,相關(guān)的標準是 WSDL彻桃。

(4)服務(wù)層

服務(wù)層的主要功能是將遺留系統(tǒng)進行包裝晾蜘,并通過發(fā)布的 WSDL 接口描述被定位和調(diào)用剔交。

(5)業(yè)務(wù)流程層

業(yè)務(wù)流程層的主要功能是支持服務(wù)發(fā)現(xiàn)岖常,服務(wù)調(diào)用和點到點的服務(wù)調(diào)用,并將業(yè)務(wù)流程從服務(wù)的底層調(diào)用抽象出來板惑。

(6)服務(wù)注冊層

服務(wù)注冊層的主要功能是使服務(wù)提供者能夠通過 WSDL 發(fā)布服務(wù)定義冯乘,并支持服務(wù)請求者查找所需的服務(wù)信息晒夹。相關(guān)的標準是 UDDI惋戏。

3.2 服務(wù)注冊表

服務(wù)注冊表( service registry )雖然也具有運行時的功能响逢,但主要在 SOA 設(shè)計時使用。它提供一個策略執(zhí)行點( Policy Enforcement Point 些膨, PEP )订雾,在這個點上洼哎,服務(wù)可以在 SOA 中注冊,從而可以被發(fā)現(xiàn)和使用锭沟。服務(wù)注冊表可以包括有關(guān)服務(wù)和相關(guān)構(gòu)件的配置 族淮、 依從性和約束文件凭涂。從理論上來說切油,任何幫助服務(wù)注冊 白翻、 發(fā)現(xiàn)和查找服務(wù)合約 、 元數(shù)據(jù)和策略的信息庫 岛琼、 數(shù)據(jù)庫 槐瑞、 目錄或其他節(jié)點都可以被認為是一個注冊表困檩。大多數(shù)商用服務(wù)注冊產(chǎn)品支持服務(wù)注冊 那槽、 服務(wù)位置和服務(wù)綁定功能骚灸。

(1)服務(wù)注冊

服務(wù)注冊是指服務(wù)提供者向服務(wù)注冊表發(fā)布服務(wù)的功能(服務(wù)合約),包括服務(wù)身份 蝶柿、 位置 交汤、 方法 劫笙、 綁定 邀摆、 配置 栋盹、 方案和策略等描述性屬性敷矫。使用服務(wù)注冊表實現(xiàn) SOA 時曹仗,要限制哪些新服務(wù)可以向注冊表發(fā)布 怎茫、 由誰發(fā)布以及誰批準和根據(jù)什么條件批準等,以便使服務(wù)能夠有序的注冊蜜宪。

(2)服務(wù)位置

服務(wù)位置是指服務(wù)使用者圃验,幫助它們查詢已注冊的服務(wù)澳窑,尋找符合自身要求的服務(wù)摊聋。這種查找主要是通過檢索服務(wù)合約來實現(xiàn)的栈暇,在使用服務(wù)注冊表實現(xiàn) SOA 時,需要規(guī)定哪些用戶可以訪問服務(wù)注冊表鹿寨,以及哪些服務(wù)屬性可以通過服務(wù)注冊表進行暴露等脚草,以便服務(wù)能得到有效的 馏慨、 經(jīng)過授權(quán)的使用姑隅。

(3)服務(wù)綁定

服務(wù)使用者利用查找到的服務(wù)合約來開發(fā)代碼讲仰,開發(fā)的代碼將與注冊的服務(wù)進行綁定鄙陡,調(diào)用注冊的服務(wù)趁矾,以及與它們實現(xiàn)互動毫捣。可以利用集成的開發(fā)環(huán)境自動將新開發(fā)的服務(wù)與不同的新協(xié)議 饶辙、 方案和程序間通信所需的其他接口綁定在一起畸悬。

3.3 企業(yè)服務(wù)總線

ESB 的概念是從 SOA 發(fā)展而來的蹋宦,它是一種為進行連接服務(wù)提供的標準化的通信基礎(chǔ)結(jié)構(gòu)冷冗,基于開放的標準蒿辙,為應(yīng)用提供了一個可靠的 、 可度量的和高度安全的環(huán)境俺叭,并可幫助企業(yè)對業(yè)務(wù)流程進行設(shè)計和模擬熄守,對每個業(yè)務(wù)流程實施控制和跟蹤 裕照、 分析并改進流程和性能晋南。

在一個復(fù)雜的企業(yè)計算環(huán)境中羔砾,如果服務(wù)提供者和服務(wù)請求者之間采用直接的端到端的交互,那么隨著企業(yè)信息系統(tǒng)的增加和復(fù)雜度的提高唉擂,系統(tǒng)之間的關(guān)聯(lián)會逐漸變得非常復(fù)雜檀葛,形成一個網(wǎng)狀結(jié)構(gòu)屿聋,這將帶來昂貴的系統(tǒng)維護費用藏鹊,同時也使得 IT 基礎(chǔ)設(shè)施的復(fù)用變得困難重重。

ESB 提供了一種基礎(chǔ)設(shè)施楚殿,消除了服務(wù)請求者與服務(wù)提供者之間的直接連接脆粥,使得服務(wù)請求者與服務(wù)提供者之間進一步解耦变隔。

ESB 是由中間件技術(shù)實現(xiàn)并支持 SOA 的一組基礎(chǔ)架構(gòu)蟹倾,是傳統(tǒng)中間件技術(shù)與XML 猖闪、 WebService等技術(shù)結(jié)合的產(chǎn)物培慌,是在整個企業(yè)集成架構(gòu)下的面向服務(wù)的企業(yè)應(yīng)用集成機制吵护。

具體來說竖配, ESB 具有以下功能:

(1)支持異構(gòu)環(huán)境中的服務(wù) 进胯、 消息和基于事件的交互胁镐,并且具有適當?shù)姆?wù)級別和可管理性盯漂。
(2)通過使用 ESB 就缆,可以在幾乎不更改代碼的情況下竭宰,以一種無縫的非侵入方式使現(xiàn)有系統(tǒng)具有全新的服務(wù)接口切揭,并能夠在部署環(huán)境中支持任何標準廓旬。
(3)充當緩沖器的 ESB (負責在諸多服務(wù)之間轉(zhuǎn)換業(yè)務(wù)邏輯和數(shù)據(jù)格式)與服務(wù)邏輯相分離孕豹,從而使不同的系統(tǒng)可以同時使用同一個服務(wù)巩步,不用在系統(tǒng)或數(shù)據(jù)發(fā)生變化時椅野,改動服務(wù)代碼籍胯。
(4)在更高的層次杖狼, ESB 還提供諸如服務(wù)代理和協(xié)議轉(zhuǎn)換等功能蝶涩。允許在多種形式下通過像HTTP 绿聘、 SOAP和 JMS 總線的多種傳輸方式熄攘,主要是以網(wǎng)絡(luò)服務(wù)的形式挪圾,為發(fā)表 哲思、 注冊 棚赔、 發(fā)現(xiàn)和使用企業(yè)服務(wù)或界面提供基礎(chǔ)設(shè)施忆嗜。
(5)提供可配置的消息轉(zhuǎn)換翻譯機制和基于消息內(nèi)容的消息路由服務(wù),傳輸消息到不同的目的地冲甘。
(6)提供安全和擁有者機制江醇,以保證消息和服務(wù)使用的認證 陶夜、 授權(quán)和完整性条辟。

在企業(yè)應(yīng)用集成方面黔夭,與現(xiàn)存的 、 專有的集成解決方案相比羽嫡, ESB 具有以下優(yōu)勢

(1)擴展的本姥、基于標準的連接

ESB 形成一個基于標準的信息骨架,使得在系統(tǒng)內(nèi)部和整個價值鏈中可以容易地進行異步或同步數(shù)據(jù)交換杭棵。 ESB 通過使用 XML婚惫、SOAP 和其他標準,提供了更強大的系統(tǒng)連接性魂爪。

(2)靈活的、服務(wù)導(dǎo)向的應(yīng)用組合

基于 SOA 滓侍, ESB 使復(fù)雜的分布式系統(tǒng)(包括跨多個應(yīng)用 蒋川、 系統(tǒng)和防火墻的集成方案)能夠由以前開發(fā)測試過的服務(wù)組合而成,使系統(tǒng)具有高度可擴展性粗井。

(3)提高復(fù)用率尔破,降低成本

按照 SOA 方法構(gòu)建應(yīng)用,提高了復(fù)用率浇衬,簡化了維護工作懒构,進而減少了系統(tǒng)總體成本。

(4)減少市場反應(yīng)時間耘擂,提高生產(chǎn)率

ESB 通過構(gòu)件和服務(wù)復(fù)用胆剧,按照 SOA 的思想簡化應(yīng)用組合,基于標準的通信 醉冤、 轉(zhuǎn)換和連接來實現(xiàn)這些優(yōu)點秩霍。

4 微服務(wù)

微服務(wù)顧名思義,就是很小的服務(wù)蚁阳,所以它屬于面向服務(wù)架構(gòu)的一種铃绒。通俗一點來說,微服務(wù)類似于古代著名的發(fā)明螺捐,活字印刷術(shù)颠悬,每個服務(wù)都是一個組件,通過編排組合的方式來使用定血,從而真正做到了獨立 赔癌、 解耦 、 組件化 澜沟、 易維護 灾票、 可復(fù)用 、 可替換 茫虽、 高可用 刊苍、 最終達到提高交付質(zhì)量 既们、 縮短交付周期的效果。

從專業(yè)的角度來看班缰,微服務(wù)架構(gòu)是一種架構(gòu)模式贤壁,它提倡將單一應(yīng)用程序劃分成一組小的服務(wù),服務(wù)之間互相協(xié)調(diào) 埠忘、 互相配合脾拆,為用戶提供最終價值。每個服務(wù)運行在其獨立的進程中莹妒,服務(wù)與服務(wù)間采用輕量級的通信機制互相溝通(通常是基于 HTTP 協(xié)議的 RESTfulAPI )名船。每個服務(wù)都圍繞著具體業(yè)務(wù)進行構(gòu)建,并且能夠被獨立的部署到生產(chǎn)環(huán)境 旨怠、 類生產(chǎn)環(huán)境等渠驼。

另外,應(yīng)當盡量避免統(tǒng)一的 鉴腻、 集中式的服務(wù)管理機制迷扇,對具體的一個服務(wù)而言,應(yīng)根據(jù)業(yè)務(wù)上下文爽哎,選擇合適的語言 蜓席、 工具對其進行構(gòu)建。

所以總結(jié)起來课锌,微服務(wù)的核心特點為:小厨内,且專注于做?件事情 、 輕量級的通信機制 渺贤、 松耦合 雏胃、 獨立部署。

4.1 微服務(wù)的優(yōu)勢

微服務(wù)之所以能盛行志鞍,必然是有它獨特優(yōu)勢的瞭亮,下面我們來分析微服務(wù)有哪些方面的優(yōu)勢。

(1)技術(shù)異構(gòu)性

在微服務(wù)架構(gòu)中固棚,每個服務(wù)都是一個相對獨立的個體街州,每個服務(wù)都可以選擇適合于自身的技術(shù)來實現(xiàn)。如玻孟,要開發(fā)一個社交平臺,此時鳍征,我們可能使用文檔型數(shù)據(jù)庫來存儲帖子的內(nèi)容黍翎,使用圖數(shù)據(jù)來存儲朋友圈的這些關(guān)系等,這樣可以把每一塊的性能都充分發(fā)揮出來艳丛。

同時匣掸,在應(yīng)用新技術(shù)時趟紊,微服務(wù)架構(gòu)也提供了更好的試驗場。因為對于單塊的系統(tǒng)而言碰酝,采用一個新的語言 霎匈、 數(shù)據(jù)庫或者框架都會對整個系統(tǒng)產(chǎn)生巨大的影響,這樣導(dǎo)致我們想嘗試新技術(shù)時送爸,望而卻步铛嘱。但微服務(wù)不同,我們完全可以只在一個微服務(wù)中采用新技術(shù)袭厂,待技術(shù)使用熟練之后墨吓,再推廣到其他服務(wù)。

(2)彈性

彈性主要講的是系統(tǒng)中一部分出現(xiàn)故障會引起多大問題纹磺。在單塊系統(tǒng)中帖烘,一個部分出現(xiàn)問題,可能導(dǎo)致整體系統(tǒng)的問題橄杨。而微服務(wù)架構(gòu)中秘症,每個服務(wù)可以內(nèi)置可用性的解決方案與功能降級方案,所以比單塊系統(tǒng)強式矫。

(3)擴展

單塊系統(tǒng)中乡摹,我們要做擴展,往往是整體進行擴展衷佃。而在微服務(wù)架構(gòu)中趟卸,可以針對單個服務(wù)進行擴展。

(4)簡化部署

在大型單塊系統(tǒng)中氏义,即使修改一行代碼锄列,也需要重新部署整個應(yīng)用系統(tǒng)。這種部署的影響很大 惯悠、 風險很高邻邮,因此不敢輕易地重新部署。而微服務(wù)架構(gòu)中克婶,每個服務(wù)的部署都是獨立的筒严,這樣就可以更快地對特定部分的代碼進行部署。

(5)與組織結(jié)構(gòu)相匹配

我們都知道情萤,團隊越大越難管理鸭蛙,同時團隊越大也代表系統(tǒng)規(guī)模越大代碼庫越大,這樣容易引起一系列的問題筋岛。且當團隊是分布式的時候娶视,問題更嚴重。微服務(wù)架構(gòu)就能很好地解決這個問題,微服務(wù)架構(gòu)可以將架構(gòu)與組織結(jié)構(gòu)相匹配肪获,避免出現(xiàn)過大的代碼庫寝凌,從而獲得理想的團隊大小及生產(chǎn)力。服務(wù)的所有權(quán)也可以在團隊之間遷移孝赫,從而避免異地團隊的出現(xiàn)较木。

(6)可組合性

在微服務(wù)架構(gòu)中,系統(tǒng)會開放很多接口供外部使用青柄。當情況發(fā)生改變時伐债,可以使用不同的方式構(gòu)建應(yīng)用,而整體化應(yīng)用程序只能提供一個非常粗粒度的接口供外部使用刹前。

(7)對可替代性的優(yōu)化

在單塊系統(tǒng)中如果刪除系統(tǒng)中的上百行代碼泳赋,也許不知道會發(fā)生什么,引起什么樣的問題喇喉,因為單塊系統(tǒng)中關(guān)聯(lián)性很強祖今。但在微服務(wù)架構(gòu)中,我們可以在需要時輕易地重寫服務(wù)拣技,或者刪除不再使用的服務(wù)千诬。

4.2 微服務(wù)面臨的挑戰(zhàn)

軟件開發(fā)業(yè)內(nèi)有一句名言 “ 軟件開發(fā)沒有銀彈 ” ,雖然前面介紹了微服務(wù)很多方面的優(yōu)勢膏斤,但微服務(wù)并不能解決所有問題徐绑。下面我們來分析在使用微服務(wù)架構(gòu)時可能面臨的一些挑戰(zhàn)。

(1)分布式系統(tǒng)的復(fù)雜度

使用微服務(wù)實現(xiàn)分布式系統(tǒng)的復(fù)雜度要比單塊系統(tǒng)高莫辨。這表現(xiàn)在多個方面傲茄,如:性能方面微服務(wù)是拆分成多個服務(wù)進行部署,服務(wù)間的通信都是通過網(wǎng)絡(luò)沮榜,此時的性能會受影響盘榨。同時可靠性也會受影響。數(shù)據(jù)一致性也需要嚴格控制蟆融,其成本也比單塊系統(tǒng)高草巡。

(2)運維成本

相比傳統(tǒng)的單塊架構(gòu)應(yīng)用,微服務(wù)將系統(tǒng)分成多個獨立的部分型酥,每個部分都是可以獨立部署的業(yè)務(wù)單元山憨。這就意味著,原來適用于單塊架構(gòu)的集中式的部署 弥喉、 配置 郁竟、 監(jiān)控或者日志收集等方式,在微服務(wù)架構(gòu)下由境,隨著服務(wù)數(shù)量的增多枪孩,每個服務(wù)都需要獨立的配置 、 部署 、 監(jiān)控 蔑舞、 日志收集等,因此成本呈指數(shù)級增長嘹屯。

(3)部署自動化

傳統(tǒng)單塊系統(tǒng)部署往往是以月 攻询、 周為單位,部署頻度很低州弟,在這種情況下钧栖,手動部署是可以滿足需求的。而對于微服務(wù)架構(gòu)而言婆翔,每個服務(wù)都是一個獨立可部署的業(yè)務(wù)單元拯杠,每個服務(wù)的修改都需要獨立部署。這樣部署的成本是比較高的啃奴,如亞馬遜潭陪,每天都要執(zhí)行數(shù)十次 、 甚至上百次的部署最蕾,此時仍用人工部署是行不通的依溯,要使用自動化部署。如何有效地構(gòu)建自動化部署流水線瘟则,降低部署成本 黎炉、 提高部署頻率,是微服務(wù)架構(gòu)下需要面臨的一個挑戰(zhàn)醋拧。

(4)DevOps 與組織結(jié)構(gòu)

傳統(tǒng)單塊架構(gòu)中慷嗜,團隊通常是按技能劃分,如開發(fā)部 丹壕、 測試部 庆械、 運維部,并通過項目的方式協(xié)作雀费,完成系統(tǒng)交付干奢。而在微服務(wù)架構(gòu)的實施過程中,除了如上所述的交付 盏袄、 運維上存在的挑戰(zhàn)忿峻,在組織或者團隊層面,如何傳遞 DevOps 文化的價值辕羽,讓團隊理解 DevOps 文化的價值逛尚,并構(gòu)建全功能團隊,也是一個不小的挑戰(zhàn)刁愿。微服務(wù)不僅表現(xiàn)出一種架構(gòu)模型绰寞,同樣也表現(xiàn)出一種組織模型。這種新型的組織模型意味著開發(fā)人員和運維的角色發(fā)生了變化,開發(fā)者將承擔起服務(wù)整個生命周期的責任滤钱,包括部署和監(jiān)控觉壶,而運維也越來越多地表現(xiàn)出一種顧問式的角色,盡早考慮服務(wù)如何部署件缸。因此铜靶,如何在微服務(wù)的實施中,按需調(diào)整組織架構(gòu)他炊,構(gòu)建全功能的團隊争剿,是一個不小的挑戰(zhàn)。

DevOps(Development和Operations的組合詞)是一組過程痊末、方法與系統(tǒng)的統(tǒng)稱蚕苇,用于促進開發(fā)(應(yīng)用程序/軟件工程)、技術(shù)運營和質(zhì)量保障(QA)部門之間的溝通凿叠、協(xié)作與整合涩笤。 它是一種重視“軟件開發(fā)人員(Dev)”和“IT運維技術(shù)人員(Ops)”之間溝通合作的文化、運動或慣例幔嫂。透過自動化“軟件交付”和“架構(gòu)變更”的流程辆它,來使得構(gòu)建、測試履恩、發(fā)布軟件能夠更加地快捷锰茉、頻繁和可靠。

(5)服務(wù)間依賴測試

由于微服務(wù)架構(gòu)是把系統(tǒng)拆分為若干個可獨立部署的服務(wù)切心,所以需要進行服務(wù)間的依賴測試飒筑。在服務(wù)數(shù)量較多的情況下,如何有效地保證服務(wù)之間能有效按照接口的約定正常工作绽昏,成為微服務(wù)實施過程中必須面臨的巨大挑戰(zhàn)协屡。

(6)服務(wù)間依賴管理

傳統(tǒng)的單塊系統(tǒng),功能實現(xiàn)比較集中全谤,大部分功能都運行在同一個應(yīng)用中肤晓,同其他系統(tǒng)依賴較少。而微服務(wù)架構(gòu)則不同认然,在將系統(tǒng)功能拆分成相互協(xié)作的獨立服務(wù)之后补憾,隨著微服務(wù)個數(shù)的增多,如何清晰有效地展示服務(wù)之間的依賴關(guān)系卷员,成為了一個挑戰(zhàn)盈匾。

4.3 微服務(wù)與 SOA

微服務(wù)可以講是 SOA 的一種,但仔細分析與推敲毕骡,我們又能發(fā)現(xiàn)他們的一些差異削饵。這種差異表現(xiàn)在多個方面岩瘦,具體如下表所示。

微服務(wù) SOA
能拆分就拆分 能放一起就放一起窿撬,是一個整體
縱向業(yè)務(wù)劃分 水平劃分
單一組織負責 按層級劃分不同部門組織負責
細粒度 粗粒度
一兩句話可解釋清楚 SOA 的目錄就有幾百字
獨立的子公司 類似大公司中的業(yè)務(wù)單元(BU = Business Unit),也就是獨立完成一件事情的小組或部門
小組件 較復(fù)雜組件
業(yè)務(wù)邏輯存在于每一個服務(wù)中 業(yè)務(wù)邏輯橫跨多個業(yè)務(wù)領(lǐng)域
使用輕量級通信方式启昧,如 HTTP 企業(yè)服務(wù)總線(ESB),充當服務(wù)之間通信角色

這些差異自然影響到其實現(xiàn)劈伴,在實現(xiàn)方面的主要差異如下表所示箫津。

微服務(wù)實現(xiàn) SOA 實現(xiàn)
團隊級,自底向上開展 企業(yè)級宰啦,自頂向下開展
一個系統(tǒng)被拆分成多個服務(wù),細粒度 服務(wù)由多個子系統(tǒng)組成饼拍,粗粒度
松散的服務(wù)架構(gòu) 企業(yè)服務(wù)總線赡模,集中式服務(wù)架構(gòu)
集成方式簡單(HTTP、REST师抄、JSON) 集成方式復(fù)雜(ESB/WS/SOAP)
服務(wù)能獨立部署 單塊架構(gòu)系統(tǒng)漓柑,相互依賴,部署復(fù)雜
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叨吮,一起剝皮案震驚了整個濱河市辆布,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茶鉴,老刑警劉巖锋玲,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涵叮,居然都是意外死亡惭蹂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門割粮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盾碗,“玉大人市俊,你說我怎么就攤上這事叔锐『瓶迹” “怎么了欠窒?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵伪嫁,是天一觀的道長弯汰。 經(jīng)常有香客問我序调,道長导饲,這世上最難降的妖魔是什么朵锣? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任谬盐,我火速辦了婚禮,結(jié)果婚禮上诚些,老公的妹妹穿的比我還像新娘飞傀。我一直安慰自己皇型,他們只是感情好,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布砸烦。 她就那樣靜靜地躺著弃鸦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪幢痘。 梳的紋絲不亂的頭發(fā)上唬格,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音颜说,去河邊找鬼购岗。 笑死,一個胖子當著我的面吹牛门粪,可吹牛的內(nèi)容都是我干的喊积。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼玄妈,長吁一口氣:“原來是場噩夢啊……” “哼乾吻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拟蜻,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤绎签,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后酝锅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诡必,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年屈张,在試婚紗的時候發(fā)現(xiàn)自己被綠了擒权。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡阁谆,死狀恐怖碳抄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情场绿,我是刑警寧澤剖效,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站焰盗,受9級特大地震影響璧尸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜熬拒,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一爷光、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧澎粟,春花似錦蛀序、人聲如沸欢瞪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遣鼓。三九已至,卻和暖如春重贺,著一層夾襖步出監(jiān)牢的瞬間骑祟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工气笙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留次企,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓潜圃,卻偏偏與公主長得像抒巢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子秉犹,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355