03_SOA(Service-oriented architecture)詳解

SOA

面向服務(wù)的體系結(jié)構(gòu)(SOA)是一種軟件設(shè)計(jì)風(fēng)格,其中服務(wù)由應(yīng)用程序組件通過網(wǎng)絡(luò)上的通信協(xié)議提供給其他組件。面向服務(wù)體系結(jié)構(gòu)的基本原則獨(dú)立于供應(yīng)商、產(chǎn)品和技術(shù)。服務(wù)是一個(gè)獨(dú)立的功能單元,可以遠(yuǎn)程訪問、獨(dú)立操作和更新,比如在線檢索信用卡對(duì)賬單。

根據(jù)SOA的許多定義,服務(wù)有四個(gè)屬性:

  • 它在邏輯上表示具有指定結(jié)果的業(yè)務(wù)活動(dòng)。
  • 它是自包含的。
  • 對(duì)于消費(fèi)者來說,這是一個(gè)黑匣子。
  • 它可能包括其他基礎(chǔ)服務(wù)

可以結(jié)合使用不同的服務(wù)來提供大型軟件應(yīng)用程序的功能,這是SOA與模塊化編程共享的原則。面向服務(wù)的體系結(jié)構(gòu)集成了分布式、獨(dú)立維護(hù)和部署的軟件組件。它是通過技術(shù)和標(biāo)準(zhǔn)實(shí)現(xiàn)的,這些技術(shù)和標(biāo)準(zhǔn)促進(jìn)了組件在網(wǎng)絡(luò)上的通信和合作,特別是在IP網(wǎng)絡(luò)上。

概述

在SOA中,服務(wù)使用協(xié)議來描述如何使用描述元數(shù)據(jù)傳遞和解析消息。該元數(shù)據(jù)描述了服務(wù)的功能特征和服務(wù)質(zhì)量特征。面向服務(wù)的體系結(jié)構(gòu)旨在允許用戶將大塊功能組合起來,形成純粹由現(xiàn)有服務(wù)構(gòu)建的應(yīng)用程序,并以特定的方式組合它們。服務(wù)向請(qǐng)求者提供一個(gè)簡單的接口,該接口抽象出作為黑盒子的底層復(fù)雜性。此外,用戶還可以訪問這些獨(dú)立的服務(wù),而不需要知道它們的內(nèi)部實(shí)現(xiàn)。

定義概念

相關(guān)的流行語服務(wù)導(dǎo)向促進(jìn)了服務(wù)之間的松散耦合。SOA將功能分為不同的單元或服務(wù),開發(fā)人員可以通過網(wǎng)絡(luò)訪問這些單元或服務(wù),以便允許用戶在應(yīng)用程序的生產(chǎn)中組合和重用它們。這些服務(wù)及其相應(yīng)的消費(fèi)者通過以明確定義的共享格式傳遞數(shù)據(jù)或通過協(xié)調(diào)兩個(gè)或更多服務(wù)之間的活動(dòng)來相互通信。

2009年10月發(fā)布了一份面向服務(wù)架構(gòu)的宣言。其中提出了六個(gè)核心價(jià)值觀,如下所示:

  • 商業(yè)價(jià)值比技術(shù)戰(zhàn)略更重要。
  • 戰(zhàn)略目標(biāo)比項(xiàng)目特定的利益更重要。
  • 內(nèi)在互操作性比定制集成更重要。
  • 共享服務(wù)比特定用途實(shí)現(xiàn)更重要。
  • 靈活性比優(yōu)化更重要。
  • 進(jìn)化精煉比追求初始完美更重要。

SOA可以被視為連續(xù)體的一部分,其范圍從分布式計(jì)算的舊概念和模塊化編程,到SOA,再到當(dāng)前的mashup,SaaS和云計(jì)算實(shí)踐(有些人認(rèn)為是SOA的后代)。

原則

盡管許多行業(yè)來源已經(jīng)發(fā)布了自己的原則,但沒有與面向服務(wù)架構(gòu)的確切組成相關(guān)的行業(yè)標(biāo)準(zhǔn)。其中一些包括以下內(nèi)容:

  • 標(biāo)準(zhǔn)化服務(wù)合同

    • 服務(wù)遵循標(biāo)準(zhǔn)通信協(xié)議,由一組給定服務(wù)中的一個(gè)或多個(gè)服務(wù)描述文檔共同定義。
  • 服務(wù)引用自治(松散耦合的一個(gè)方面)

    • 服務(wù)之間的關(guān)系被最小化到他們只知道它們存在的水平。
  • 服務(wù)地點(diǎn)透明度(疏松耦合的一個(gè)方面)

    • 無論網(wǎng)絡(luò)位于何處,都可以從網(wǎng)絡(luò)中的任何位置調(diào)用服務(wù)。
  • 服務(wù)壽命

    • 服務(wù)的設(shè)計(jì)應(yīng)該是長期的。在可能的情況下,如果服務(wù)不需要新特性,就應(yīng)該避免強(qiáng)制消費(fèi)者進(jìn)行更改,如果您今天調(diào)用服務(wù),那么明天就應(yīng)該能夠調(diào)用相同的服務(wù)。
  • 服務(wù)抽象

    • 服務(wù)充當(dāng)黑盒,即它們的內(nèi)部邏輯對(duì)消費(fèi)者隱藏。
  • 服務(wù)的自主權(quán)

    • 服務(wù)是獨(dú)立的,并且從設(shè)計(jì)時(shí)和運(yùn)行時(shí)的角度控制它們封裝的功能。
  • 服務(wù)無國籍

    • 服務(wù)是無狀態(tài)的,即要么返回請(qǐng)求的值,要么提供異常,從而最小化資源的使用。
  • 服務(wù)粒度

    • 確保服務(wù)具有足夠大小和范圍的原則。服務(wù)提供給用戶的功能必須是相關(guān)的。
      服務(wù)標(biāo)準(zhǔn)化
    • 服務(wù)被分解或合并(規(guī)范化)以最小化冗余。在某些情況下,可能不需要這樣做,這些情況下需要性能優(yōu)化、訪問和聚合。
  • 服務(wù)的可組合性

    • 服務(wù)可用于組合其他服務(wù)。
  • 服務(wù)發(fā)現(xiàn)

    • 服務(wù)由通信元數(shù)據(jù)補(bǔ)充,通過這些元數(shù)據(jù)可以有效地發(fā)現(xiàn)和解釋服務(wù)。
  • 服務(wù)的可重用性

    • 邏輯被劃分為各種服務(wù),以提升代碼的重用。
  • 服務(wù)封裝

    • 許多最初沒有在SOA下計(jì)劃的服務(wù)可能被封裝或成為SOA的一部分。

Patterns

每個(gè)SOA構(gòu)建塊都可以扮演以下三個(gè)角色之一:

  • 服務(wù)提供者

    • 它創(chuàng)建Web服務(wù)并將其信息提供給服務(wù)注冊(cè)表。每個(gè)提供商都會(huì)討論大量的方法,以及為什么要公開哪些服務(wù),哪些更重要:安全性或易用性,提供服務(wù)的價(jià)格等等。
    • 提供商還必須決定應(yīng)該為給定的代理服務(wù)列出服務(wù)的類別以及使用該服務(wù)需要哪種貿(mào)易伙伴協(xié)議。
  • 服務(wù)代理,服務(wù)注冊(cè)表或服務(wù)倉庫

    • 其主要功能是使任何潛在請(qǐng)求者都能獲得有關(guān)Web服務(wù)的信息。實(shí)施經(jīng)紀(jì)人的人決定經(jīng)紀(jì)人的范圍。公共經(jīng)紀(jì)人隨處可見,但私人經(jīng)紀(jì)人只能向有限的公眾開放。UDDI是一種早期的,不再主動(dòng)支持的嘗試來提供Web服務(wù)發(fā)現(xiàn)。
  • 服務(wù)請(qǐng)求者/消費(fèi)者

    • 它使用各種查找操作在代理注冊(cè)表中查找條目,然后綁定到服務(wù)提供者以調(diào)用其中一個(gè)Web服務(wù)。無論服務(wù)消費(fèi)者需要哪種服務(wù),他們都必須將其帶入經(jīng)紀(jì)人,將其與相應(yīng)的服務(wù)綁定,然后使用它。如果服務(wù)提供多種服務(wù),他們可以訪問多種服務(wù)。

服務(wù)消費(fèi)者 - 提供者關(guān)系由標(biāo)準(zhǔn)化服務(wù)合同管理,其中包括業(yè)務(wù)部分,功能部分和技術(shù)部分。

服務(wù)組合模式有兩種廣泛的高級(jí)架構(gòu)風(fēng)格:編排和編排。不受特定體系結(jié)構(gòu)風(fēng)格約束的較低級(jí)別的企業(yè)集成模式在SOA設(shè)計(jì)中仍然具有相關(guān)性和合格性。

實(shí)施方法

面向服務(wù)的體系結(jié)構(gòu)可以使用Web服務(wù)實(shí)現(xiàn)。這樣做是為了使功能構(gòu)建塊可以通過獨(dú)立于平臺(tái)和編程語言的標(biāo)準(zhǔn)Internet協(xié)議訪問。這些服務(wù)既可以代表新應(yīng)用程序,也可以代表現(xiàn)有遺留系統(tǒng)的包裝,使其具備網(wǎng)絡(luò)功能。

實(shí)施者通常使用Web服務(wù)標(biāo)準(zhǔn)構(gòu)建SOA。一個(gè)例子是SOAP,它在2003年從W3C(萬維網(wǎng)聯(lián)盟)推薦1.2版后獲得了廣泛的行業(yè)認(rèn)可。這些標(biāo)準(zhǔn)(也稱為Web服務(wù)規(guī)范)也提供了更大的互操作性和一些保護(hù)鎖定專有供應(yīng)商軟件。但是,也可以使用任何其他基于服務(wù)的技術(shù)(如Jini,CORBA或REST)實(shí)現(xiàn)SOA 。

架構(gòu)可以獨(dú)立于特定技術(shù)運(yùn)行,因此可以使用多種技術(shù)實(shí)現(xiàn),包括:

  • 基于WSDL和SOAP的Web服務(wù)
  • 消息傳遞,例如,使用ActiveMQ,JMS,RabbitMQ
  • RESTful HTTP,具有Representational狀態(tài)轉(zhuǎn)移(REST),構(gòu)成自己的基于約束的架構(gòu)風(fēng)格
  • OPC-UA
  • WCF(Microsoft的Web服務(wù)實(shí)現(xiàn),構(gòu)成WCF的一部分)
  • Apache Thrift
  • GRPC
  • SORCER

實(shí)現(xiàn)可以使用這些協(xié)議中的一個(gè)或多個(gè),例如,可以使用文件系統(tǒng)機(jī)制來遵循符合SOA概念的進(jìn)程之間的定義的接口規(guī)范來傳送數(shù)據(jù)。關(guān)鍵是具有已定義接口的獨(dú)立服務(wù),可以調(diào)用這些接口以標(biāo)準(zhǔn)方式執(zhí)行其任務(wù),而無需服務(wù)預(yù)先知道調(diào)用應(yīng)用程序,并且應(yīng)用程序不需要或不需要知道服務(wù)如何實(shí)際執(zhí)行其任務(wù)。SOA支持開發(fā)通過組合松散耦合和可互操作的服務(wù)構(gòu)建的應(yīng)用程序。

這些服務(wù)基于獨(dú)立于底層平臺(tái)和編程語言的正式定義(或合同,例如WSDL)進(jìn)行互操作。接口定義隱藏了特定于語言的服務(wù)的實(shí)現(xiàn)。因此,基于SOA的系統(tǒng)可以獨(dú)立于開發(fā)技術(shù)和平臺(tái)(例如Java,.NET等)運(yùn)行。例如,在運(yùn)行于.NET平臺(tái)上的C#和用Java EE平臺(tái)上運(yùn)行的Java編寫的服務(wù)編寫的服務(wù)都可以由公共復(fù)合應(yīng)用程序(或客戶端)使用。在任一平臺(tái)上運(yùn)行的應(yīng)用程序也可以使用在另一平臺(tái)上運(yùn)行的服務(wù)作為便于重用的Web服務(wù)。托管環(huán)境還可以包裝COBOL遺留系統(tǒng)并將其作為軟件服務(wù)提供。

諸如BPEL之類的高級(jí)編程語言和諸如WS-CDL和WS-Coordination之類的規(guī)范通過提供一種定義和支持將細(xì)粒度服務(wù)編排成更粗粒度的業(yè)務(wù)服務(wù)的方法來擴(kuò)展服務(wù)概念,架構(gòu)師可以反過來并入在復(fù)合應(yīng)用程序或門戶中實(shí)現(xiàn)的工作流和業(yè)務(wù)流程。

面向服務(wù)的建模是一個(gè)SOA框架,它可以識(shí)別指導(dǎo)SOA從業(yè)者對(duì)其面向服務(wù)的資產(chǎn)進(jìn)行概念化,分析,設(shè)計(jì)和構(gòu)建的各種規(guī)程。在面向服務(wù)的建??蚣埽⊿OMF)提供了一個(gè)建模語言和工作結(jié)構(gòu)或“地圖”描繪了有助于成功的面向服務(wù)的建模方法的各種組件。它說明了識(shí)別服務(wù)開發(fā)方案的“做什么”方面的主要元素。該模型使從業(yè)者能夠制定項(xiàng)目計(jì)劃并確定面向服務(wù)的計(jì)劃的里程碑。SOMF還提供了一種通用的建模符號(hào),以解決業(yè)務(wù)和IT組織之間的一致性問題。

組織利益

一些企業(yè)架構(gòu)師認(rèn)為,SOA可以幫助企業(yè)更快,更經(jīng)濟(jì)地響應(yīng)不斷變化的市場條件。這種體系結(jié)構(gòu)促進(jìn)了宏(服務(wù))級(jí)別的重用,而不是微觀(類)級(jí)別的重用。它還可以簡化現(xiàn)有IT(傳統(tǒng))資產(chǎn)的互連和使用。

使用SOA,我們的想法是組織可以從整體上看待問題。企業(yè)擁有更多的整體控制權(quán)。從理論上講,不會(huì)有大量的開發(fā)人員使用任何工具集可能會(huì)讓他們滿意。但他們將編碼為業(yè)務(wù)中設(shè)定的標(biāo)準(zhǔn)。他們還可以開發(fā)企業(yè)級(jí)SOA,封裝面向業(yè)務(wù)的基礎(chǔ)架構(gòu)。SOA也被描述為為汽車駕駛員提供效率的高速公路系統(tǒng)。關(guān)鍵在于,如果每個(gè)人都有車,但在任何地方都沒有高速公路,那么事情就會(huì)受到限制和混亂,無論是試圖快速或有效地到達(dá)任何地方。IBM Web服務(wù)副總裁Michael Liebow表示,SOA“建設(shè)高速公路”。

在某些方面,SOA可以被視為架構(gòu)演變而不是革命。它捕獲了以前軟件架構(gòu)的許多最佳實(shí)踐。例如,在通信系統(tǒng)中,很少開發(fā)使用真正靜態(tài)綁定與網(wǎng)絡(luò)中的其他設(shè)備通信的解決方案。通過采用SOA方法,此類系統(tǒng)可以將自己定位為強(qiáng)調(diào)定義明確,高度可互操作的接口的重要性。SOA的其他前身包括基于組件的軟件工程和遠(yuǎn)程對(duì)象的面向?qū)ο蠓治龊驮O(shè)計(jì)(OOAD),例如,在CORBA中。

服務(wù)包括僅通過正式定義的界面可用的獨(dú)立功能單元。服務(wù)可以是某種易于生產(chǎn)和改進(jìn)的“納米企業(yè)”。服務(wù)也可以是作為下屬服務(wù)的協(xié)調(diào)工作而構(gòu)建的“大型企業(yè)”。SOA的成熟部署有效地定義了組織的API。

將服務(wù)實(shí)施視為大型項(xiàng)目的單獨(dú)項(xiàng)目的原因包括:

  • 分離將業(yè)務(wù)概念推廣到業(yè)務(wù),即服務(wù)可以快速獨(dú)立地從組織中常見的較大且移動(dòng)較慢的項(xiàng)目中提供。業(yè)務(wù)開始了解呼叫服務(wù)的系統(tǒng)和簡化的用戶界面。這提倡敏捷。也就是說,它促進(jìn)了業(yè)務(wù)創(chuàng)新并加快了產(chǎn)品上市時(shí)間。
  • 分離促進(jìn)了服務(wù)與消費(fèi)項(xiàng)目的脫鉤。這樣可以鼓勵(lì)良好的設(shè)計(jì),因?yàn)榉?wù)的設(shè)計(jì)不需要知道消費(fèi)者是誰。
  • 服務(wù)的文檔和測試工件未嵌入較大項(xiàng)目的詳細(xì)信息中。當(dāng)服務(wù)需要稍后重用時(shí),這很重要。

SOA承諾間接簡化測試。服務(wù)是自治的,無狀態(tài)的,具有完全記錄的接口,并且與實(shí)現(xiàn)的橫切關(guān)注點(diǎn)分開。如果組織擁有適當(dāng)定義的測試數(shù)據(jù),則會(huì)構(gòu)建相應(yīng)的存根,以便在構(gòu)建服務(wù)時(shí)對(duì)測試數(shù)據(jù)做出反應(yīng)。還會(huì)為服務(wù)捕獲一整套回歸測試,腳本,數(shù)據(jù)和響應(yīng)。該服務(wù)可以使用與其調(diào)用的服務(wù)相對(duì)應(yīng)的現(xiàn)有存根作為“黑盒子”進(jìn)行測試。可以構(gòu)建測試環(huán)境,其中原始和超出范圍的服務(wù)是存根,而網(wǎng)格的其余部分是完整服務(wù)的測試部署。由于每個(gè)界面都有完整的文檔,并有自己的全套回歸測試文檔,識(shí)別測試服務(wù)中的問題變得很簡單。測試演變?yōu)閮H僅根據(jù)其文檔驗(yàn)證測試服務(wù)是否運(yùn)行,并且發(fā)現(xiàn)環(huán)境中所有服務(wù)的文檔和測試用例存在差距。管理數(shù)據(jù)的狀態(tài)冪等服務(wù)是唯一的復(fù)雜性。

批評(píng)

SOA已經(jīng)與Web服務(wù)混為一談; 但是,Web服務(wù)只是實(shí)現(xiàn)構(gòu)成SOA樣式的模式的一種選擇。在沒有本機(jī)或二進(jìn)制形式的遠(yuǎn)程過程調(diào)用(RPC)的情況下,應(yīng)用程序可能運(yùn)行得更慢并且需要更多處理能力,從而增加了成本。大多數(shù)實(shí)現(xiàn)都會(huì)產(chǎn)生這些開銷,但SOA可以使用不依賴于遠(yuǎn)程過程調(diào)用或通過轉(zhuǎn)換的技術(shù)(例如,Java Business Integration(JBI),Windows Communication Foundation(WCF)和數(shù)據(jù)分發(fā)服務(wù)(DDS))來實(shí)現(xiàn)。 XML。同時(shí),新興的開源XML解析技術(shù)(如VTD-XML)和各種XML兼容的二進(jìn)制格式有望顯著提高SOA性能。使用JSON而不是XML實(shí)現(xiàn)的服務(wù)不會(huì)受到此性能問題的影響。

有狀態(tài)服務(wù)要求消費(fèi)者和提供者共享相同的特定于消費(fèi)者的上下文,該上下文包含在提供者和消費(fèi)者之間交換的消息中或由其引用。如果服務(wù)提供者需要為每個(gè)消費(fèi)者保留共享上下文,則該約束的缺點(diǎn)在于它可能降低服務(wù)提供者的整體可伸縮性。它還增加了服務(wù)提供商和消費(fèi)者之間的耦合,使交換服務(wù)提供商更加困難。最終,一些批評(píng)者認(rèn)為SOA服務(wù)仍然受到他們所代表的應(yīng)用程序的限制。

面向服務(wù)的體系結(jié)構(gòu)面臨的主要挑戰(zhàn)是管理元數(shù)據(jù)?;赟OA的環(huán)境包括許多彼此之間進(jìn)行通信以執(zhí)行任務(wù)的服務(wù)。由于設(shè)計(jì)可能涉及多個(gè)服務(wù)一起工作,因此應(yīng)用程序可能會(huì)生成數(shù)百萬條消息。進(jìn)一步的服務(wù)可能屬于不同的組織甚至是競爭公司,造成巨大的信任問題。因此SOA治理進(jìn)入了事物的計(jì)劃。

SOA面臨的另一個(gè)主要問題是缺乏統(tǒng)一的測試框架。沒有工具可以提供在面向服務(wù)的體系結(jié)構(gòu)中測試這些服務(wù)所需的功能。困難的主要原因是:

  • 異質(zhì)性和解決方案的復(fù)雜性。
  • 由于自主服務(wù)的集成,大量的測試組合。
  • 包含來自不同和競爭供應(yīng)商的服務(wù)。
  • 由于新功能和服務(wù)的可用性,平臺(tái)不斷變化。

擴(kuò)展和變體

  • 事件驅(qū)動(dòng)的架構(gòu)

  • Web 2.0

    • 蒂姆·奧萊利(Tim O'Reilly)創(chuàng)造了“ Web 2.0 ” 這一術(shù)語來描述一種快速增長的基于網(wǎng)絡(luò)的應(yīng)用程序。經(jīng)歷了廣泛報(bào)道的主題涉及Web 2.0與面向服務(wù)的體系結(jié)構(gòu)之間的關(guān)系。
    • SOA是將應(yīng)用程序邏輯封裝在具有統(tǒng)一定義的接口的服務(wù)中并通過發(fā)現(xiàn)機(jī)制公開可用的哲學(xué)。復(fù)雜性 - 隱藏和重用的概念,以及松散耦合服務(wù)的概念,激發(fā)了研究人員詳細(xì)闡述了兩種哲學(xué),SOA和Web 2.0及其各自應(yīng)用之間的相似之處。一些人認(rèn)為Web 2.0和SOA具有顯著不同的元素,因此不能被視為“平行哲學(xué)”,而其他人認(rèn)為這兩個(gè)概念是互補(bǔ)的,并將Web 2.0視為全球SOA。
    • Web 2.0和SOA的理念滿足了不同的用戶需求,從而暴露了設(shè)計(jì)方面的差異以及實(shí)際應(yīng)用中使用的技術(shù)。但是,截至2008年,用例展示了結(jié)合Web 2.0和SOA的技術(shù)和原則的潛力。
  • 微服務(wù)

    • 微服務(wù)是對(duì)用于構(gòu)建分布式軟件系統(tǒng)的面向服務(wù)的體系結(jié)構(gòu)的現(xiàn)代解釋 。在一個(gè)微服務(wù)架構(gòu)服務(wù)是過程與彼此之間通過所述通信網(wǎng)絡(luò),以滿足一個(gè)目標(biāo)。這些服務(wù)采用技術(shù)無關(guān)的協(xié)議,這有助于封裝語言和框架的選擇,使他們的選擇,內(nèi)部的服務(wù)問題。微服務(wù)是SOA的一種新的實(shí)現(xiàn)和實(shí)現(xiàn)方法,自2014年(以及DevOps引入之后)開始流行,并且還強(qiáng)調(diào)持續(xù)部署和其他敏捷實(shí)踐。

微服務(wù)沒有一個(gè)共同商定的定義。以下特征和原理可在文獻(xiàn)中找到:

  • 細(xì)粒度接口(可獨(dú)立部署的服務(wù)),
  • 業(yè)務(wù)驅(qū)動(dòng)的開發(fā)(例如領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)),
  • IDEAL云應(yīng)用程序架構(gòu),
  • 多語言編程和持久性,
  • 輕量級(jí)容器部署,
  • 分散的持續(xù)交付
  • DevOps提供全面的服務(wù)監(jiān)控。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 春節(jié)之際,我和媽媽一起為家里選購揮春,進(jìn)入合適的店鋪里,鮮艷的大紅色映入我們的眼簾,有各式各樣的揮春,字樣也琳瑯滿...
    7f1fbc8bc5f3閱讀 116評(píng)論 0 0
  • 我的閨蜜是開飯店的,單親媽媽帶了個(gè)女兒,人脈比較廣,所以生意還挺不錯(cuò)的。 一到周末她的飯店就成了朋友們的大本營,道...
    在水一方含閱讀 443評(píng)論 0 3
  • 今天是5月21號(hào),那個(gè)世界上最喜歡我的男生已經(jīng)離開一千四百八十天了。 時(shí)間過得好快呀,不知不覺已經(jīng)四年了。都說時(shí)間...
    暗淡星辰閱讀 387評(píng)論 2 2
  • 需求分析:有些網(wǎng)站是電腦端一個(gè)網(wǎng)站,手機(jī)端一個(gè)網(wǎng)站,如何判斷設(shè)備類型來讓他跳轉(zhuǎn)到相應(yīng)的頁面呢? 1.首先在util...
    輝夜真是太可愛啦閱讀 6,927評(píng)論 0 0

友情鏈接更多精彩內(nèi)容