袜子商店应用:一个云原生参照应用
本文要點(diǎn)
襪子商店應(yīng)用始于一個(gè)簡(jiǎn)單的演示應(yīng)用,之后發(fā)現(xiàn)它十分有用,最終演化成一個(gè)完全容器化的、云原生參照應(yīng)用。
該應(yīng)用混合使用了Go、Java、Spring以及Node.js。它擁有完整的持續(xù)集成和發(fā)布管道,最終會(huì)發(fā)布到AWS上Kubernetes集群的準(zhǔn)生產(chǎn)環(huán)境中。
其中的API使用了Open API的規(guī)范。并且使用了一個(gè)名為Dredd的工具,用其獲得swagger規(guī)范并且對(duì)在容器化的服務(wù)上的API進(jìn)行驗(yàn)證。
襪子商店可以使用獨(dú)立Docker、Docker Swarm、Kubernetes、Mesos/Marathon(或DC/OS)、Hashicorp的Nomad以及AWS ECS進(jìn)行部署。
在合并兩個(gè)服務(wù)成為單個(gè)服務(wù)時(shí)會(huì)遇到遠(yuǎn)超預(yù)期的麻煩。因此建議,在完全理清服務(wù)之前,盡量推遲對(duì)服務(wù)的拆分。
微服務(wù)、容器和編排框架是一個(gè)不斷變化的領(lǐng)域。每周都有新的工具、服務(wù)或產(chǎn)品出現(xiàn),同時(shí)伴隨著新的概念、技術(shù)和流行語(yǔ)。為了達(dá)到在構(gòu)建應(yīng)用時(shí)“云端優(yōu)先”的新興思想,就誕生了云原生(Cloud Native)一詞。然而,試圖確定云原生究竟意味著什么將是徒勞的,因?yàn)樗噲D定義的領(lǐng)域正不斷變化著。我們看到最近的一個(gè)動(dòng)向就是云原生計(jì)算基金會(huì)(Cloud Native Computing Foundation)的成立。它歸屬于Linux基金會(huì),是一個(gè)專注于常用技術(shù)和開源軟件的非營(yíng)利性組織。
這看上去正朝著正確的方向發(fā)展,但還是沒有能幫我們定義云原生應(yīng)用到底是什么。我們可以說(shuō)出一些技術(shù),如容器、編排框架,和一些最佳實(shí)踐,如短小、可擴(kuò)展、靈活,但擁有一個(gè)具體的參照往往會(huì)更有幫助。這正是我們所一直在構(gòu)建的。
這就是襪子商店應(yīng)用,一個(gè)真實(shí)、完全容器化、采用微服務(wù)架構(gòu)的云原生應(yīng)用。
該項(xiàng)目一開始是作為DockerCon的一個(gè)小型演示應(yīng)用而誕生的,用于展示由Weave Works開發(fā)的一些新服務(wù)。作為一家致力于為微服務(wù)和基于容器的應(yīng)用構(gòu)建產(chǎn)品和工具的公司,他們需要一個(gè)真實(shí)的應(yīng)用來(lái)演示他們的服務(wù)。在兩周內(nèi),我們構(gòu)建了一個(gè)大量使用微服務(wù)的應(yīng)用,其中投入了各種技術(shù)、編程語(yǔ)言和數(shù)據(jù)存儲(chǔ)。
相關(guān)廠商內(nèi)容
微信Android模塊化架構(gòu)重構(gòu)實(shí)踐蘑菇街分布式消息中間件Corgi的架構(gòu)演進(jìn)Serverless架構(gòu):一條SQL到一個(gè)服務(wù)有多遠(yuǎn)?對(duì)抗復(fù)雜性,架構(gòu)設(shè)計(jì)中可借鑒復(fù)用這些手段阿里:風(fēng)控場(chǎng)景的模型平臺(tái)架構(gòu)設(shè)計(jì)相關(guān)贊助商
ArchSummit深圳2017,7月7-8日,深圳·華僑城洲際酒店,精彩內(nèi)容搶先看
初次運(yùn)行之后,我們看到了持續(xù)維護(hù)該項(xiàng)目的好處。它既可以作為容器和微服務(wù)集中工具的測(cè)試平臺(tái),同時(shí)可以作為云原生系統(tǒng)的參照應(yīng)用,這會(huì)非常有用。在接下來(lái)的幾個(gè)月中,我們致力于將此演示應(yīng)用轉(zhuǎn)換為可以部署到生產(chǎn)的應(yīng)用。我們對(duì)每個(gè)服務(wù)進(jìn)行了徹底改進(jìn)、按需替換數(shù)據(jù)存儲(chǔ)、合并高耦合的服務(wù)、并添加日志和監(jiān)控等標(biāo)準(zhǔn)功能。我們還建立了完整的持續(xù)集成和交付管道,最終會(huì)發(fā)布到AWS上Kubernetes集群的準(zhǔn)生產(chǎn)環(huán)境中。
微服務(wù)
云原生應(yīng)用必須足夠靈活。我們需要快速而獨(dú)立地部署,從而讓我們?cè)谡_的時(shí)間做出正確的決定和變化。這能使組織架構(gòu)變得敏捷。組織內(nèi)部應(yīng)該預(yù)期并鼓勵(lì)變化而不是極力規(guī)避變化。云原生應(yīng)用注重服務(wù)的獨(dú)立性。系統(tǒng)的每一部分都不應(yīng)該相互依賴,以避免造成級(jí)聯(lián)故障。最后,云原生應(yīng)用應(yīng)該是技術(shù)無(wú)關(guān)的。為系統(tǒng)的一個(gè)部分選擇編程語(yǔ)言,或者為特定數(shù)據(jù)集選型關(guān)系型數(shù)據(jù)庫(kù),不應(yīng)對(duì)系統(tǒng)的其他部分造成影響。
顯然,這些不是我們可以通過(guò)獨(dú)立應(yīng)用架構(gòu)來(lái)實(shí)現(xiàn)的。雖然不是所有情況下都必要,但是云原生應(yīng)用還是應(yīng)該構(gòu)建在微服務(wù)之上。在襪子商店應(yīng)用中,我們積極地在應(yīng)用中使用“微服務(wù)”的理念。
這給了我們諸多好處:我們能夠利用多種持久化技術(shù),即在不同的服務(wù)使用不同的數(shù)據(jù)存儲(chǔ)。我們也可以為每個(gè)服務(wù)自由地選擇語(yǔ)言。但真正的好處在于開發(fā)的速度。由于這是一個(gè)開源社區(qū)項(xiàng)目,短期內(nèi)有很多開發(fā)人員參與。通過(guò)對(duì)服務(wù)進(jìn)行適當(dāng)?shù)母綦x,大家可以很容易地融入社區(qū)并快速修復(fù)bug或在某一服務(wù)中添加功能,而無(wú)需了解整個(gè)架構(gòu)。
過(guò)分微服務(wù)化
有觀點(diǎn)認(rèn)為,一開始就使用微服務(wù)架構(gòu)比轉(zhuǎn)換現(xiàn)有的獨(dú)立應(yīng)用更加困難。其中一個(gè)原因是,在一個(gè)全新的項(xiàng)目中,服務(wù)之間的邊界并不總那么清晰。如果你的服務(wù)沿著錯(cuò)誤的邊界進(jìn)行劃分,最終服務(wù)間的交互就會(huì)過(guò)多,而且這可能難以糾正。在我們襪子商店應(yīng)用早期開發(fā)中就遇到這個(gè)問(wèn)題。由于我們激進(jìn)地對(duì)服務(wù)進(jìn)行了劃分,我們創(chuàng)建了一個(gè)登錄服務(wù)和一個(gè)顧客服務(wù)。在我們的后續(xù)開發(fā)中,就發(fā)現(xiàn)它們之間的耦合度太高,他們應(yīng)該是一個(gè)服務(wù),而將它們合并成單個(gè)服務(wù)的過(guò)程又比預(yù)期設(shè)想的要更復(fù)雜。所以建議,在完全理清服務(wù)之前,盡量推遲對(duì)服務(wù)的拆分。
容器
微服務(wù)的廣泛應(yīng)用,在很大程度上是由于一些新興技術(shù)使我們可以更容易地將應(yīng)用分割成小而獨(dú)立的部分。具體地說(shuō),就是容器技術(shù)。它為我們提供了輕量化的包裝和工具。
除了越來(lái)越多地采用微服務(wù)外,容器也是將應(yīng)用從本地轉(zhuǎn)移到云端的關(guān)鍵。無(wú)論是在容器中運(yùn)行的應(yīng)用本身,還是應(yīng)用運(yùn)行所在的基礎(chǔ)架構(gòu),已經(jīng)運(yùn)行在容器上十多年的Google Cloud就是一個(gè)例子。容器是構(gòu)成云的一磚一瓦,也是云原生應(yīng)用的重要組成部分。
在襪子商店應(yīng)用中,我們?cè)诟鱾€(gè)部分都采用了容器。我們不光在docker容器上運(yùn)行我們的服務(wù),更研究了如何在集成和部署管道中利用容器的優(yōu)勢(shì)。
一個(gè)例子就在我們的構(gòu)建過(guò)程中。我們希望擁有一致、可重復(fù)的構(gòu)建版本,但是我們不希望在服務(wù)的鏡像中包含不必要的工具使其變得臃腫。為了滿足這個(gè)需求,我們創(chuàng)建了單獨(dú)的鏡像來(lái)構(gòu)建和運(yùn)行我們的服務(wù)。構(gòu)建的鏡像包含必要的工具,并在任何環(huán)境中提供了一致的可重復(fù)的生成文件。然后,我們將構(gòu)建的二進(jìn)制文件(或jar文件)復(fù)制到實(shí)際運(yùn)行服務(wù)的最小部署鏡像中。(示例)
我們利用容器優(yōu)勢(shì)的另一個(gè)方面是在測(cè)試中,這在微服務(wù)領(lǐng)域是有明顯不同的。我們的服務(wù)規(guī)模相當(dāng)合理,因此可以輕松地測(cè)試內(nèi)部功能。然而,我們的服務(wù)有更多的外部依賴,這為測(cè)試帶來(lái)了一些棘手的問(wèn)題。
我們測(cè)試的一個(gè)重點(diǎn)是我們的服務(wù)API。因?yàn)檫@些是我們服務(wù)間相互通訊的契約。我們使用Open API規(guī)范(即Swagger)記錄了我們所有的API,該API規(guī)范具有諸多的工具。我們使用了一個(gè)名為Dredd的工具,它使用我們的Swagger規(guī)范,并在我們?nèi)萜骰姆?wù)上對(duì)API進(jìn)行驗(yàn)證。當(dāng)我們將其引入到持續(xù)集成管道中時(shí),我們能對(duì)所有服務(wù)的API進(jìn)行持續(xù)地驗(yàn)證。所有這些都會(huì)在容器中運(yùn)行,這為我們的操作帶來(lái)了可重復(fù)性,并且這個(gè)過(guò)程與運(yùn)行的平臺(tái)無(wú)關(guān)。
我們創(chuàng)建了一個(gè)測(cè)試用的Docker鏡像,其中包含了我們的測(cè)試框架和Dredd工具。這個(gè)容器讀入API(Swagger)規(guī)范,并針對(duì)我們的真實(shí)服務(wù)進(jìn)行API調(diào)用,對(duì)API規(guī)范進(jìn)行完整的驗(yàn)證。我們測(cè)試框架的生命周期是短暫的,每個(gè)測(cè)試案例都會(huì)自己創(chuàng)建并刪除獨(dú)立的環(huán)境,并且這個(gè)過(guò)程與運(yùn)行環(huán)境無(wú)關(guān)。
編排
構(gòu)建云原生應(yīng)用的第三個(gè)支柱是編排(orchestration)。一旦我們創(chuàng)建、測(cè)試并部署完單個(gè)服務(wù),接下來(lái)的困難就是管理我們的各個(gè)容器,以保持一個(gè)穩(wěn)定而又靈活的運(yùn)行環(huán)境。一旦你有多個(gè)容器,手動(dòng)編排就變得難以管理,我們需要將其自動(dòng)化。任何應(yīng)用的主要部分包括運(yùn)行服務(wù)的容器、服務(wù)器、存儲(chǔ)和網(wǎng)絡(luò)。從這組初始元素中,我們就有了一個(gè)理想的狀況:運(yùn)行應(yīng)用、服務(wù)的發(fā)現(xiàn)、容錯(cuò)、資源的有效利用。理想情況下,這一切都應(yīng)該在沒有任何手動(dòng)干預(yù)的情況下完成。
幸運(yùn)的是,有許多工具和平臺(tái)想要為我們管理這些。在襪子商店應(yīng)用中,我們決定在盡可能多的編排平臺(tái)上部署我們的應(yīng)用,而不是選擇某個(gè)特定的平臺(tái)進(jìn)行部署。畢竟,作為一個(gè)參照應(yīng)用,它不應(yīng)該與某個(gè)特定的平臺(tái)綁定,而作為一個(gè)真正的“云原生”應(yīng)用,它應(yīng)該在任何編排平臺(tái)上都可以正常工作。這種方式的另一個(gè)好處是可以讓我們?cè)u(píng)估和比較不同的工具。在撰寫本文時(shí),襪子商店應(yīng)用已經(jīng)可以部署在獨(dú)立Docker、Docker Swarm、Kubernetes、Mesos/Marathon(或DC/OS)、Hashicorp的Nomad和AWS ECS上。可以查看對(duì)應(yīng)的文檔。
在大多數(shù)情況下,應(yīng)用在這些平臺(tái)上“恰好可以正常工作”。我們只需要根據(jù)每個(gè)工具的語(yǔ)法調(diào)整配置文件就可以實(shí)現(xiàn)切換。由于我們所有的組件都是容器化的,部署就變得直截了當(dāng)。主要需要關(guān)注的是網(wǎng)絡(luò)。我們使用了WeaveNet插件來(lái)滿足我們的容器網(wǎng)絡(luò)和DNS需求。在某些情況下這恰好可以滿足需求,但更多情況下這會(huì)與工具內(nèi)置的現(xiàn)存DNS或網(wǎng)絡(luò)組件產(chǎn)生沖突。容器網(wǎng)絡(luò)接口將是未來(lái)的發(fā)展方向,但是目前它仍處于早期階段,還不能與所有工具完全集成。
回顧云原生
云原生應(yīng)用有三個(gè)主要支柱:微服務(wù)、容器和動(dòng)態(tài)編排。雖然其中經(jīng)常涉及其他技術(shù),但構(gòu)建云原生架構(gòu)應(yīng)用總會(huì)伴隨著關(guān)注這三個(gè)方面。同時(shí)它們也是互補(bǔ)的技術(shù)。正如我們?cè)谝m子商店應(yīng)用中看到的那樣,容器技術(shù)使構(gòu)建、測(cè)試和部署微服務(wù)變得更加容易。添加了編排平臺(tái)更使我們能夠自信地大規(guī)模運(yùn)行我們的應(yīng)用。如果我們要手動(dòng)管理每個(gè)服務(wù)的部署、重啟、擴(kuò)展和調(diào)度,我們很快就會(huì)變得不堪重負(fù),這樣就會(huì)使云原生應(yīng)用所帶來(lái)的好處不足以彌補(bǔ)維持應(yīng)用運(yùn)行所需的額外工作。
對(duì)于構(gòu)建云原生應(yīng)用其他的重要部分包括連續(xù)交付管道、全面監(jiān)控和日志以及追蹤,所有這些都在襪子商店應(yīng)用中有所使用。
襪子商店應(yīng)用的下一步發(fā)展
既然現(xiàn)在該應(yīng)用處于穩(wěn)定狀態(tài),并且我們已經(jīng)進(jìn)行了必要的自動(dòng)化和測(cè)試,接下來(lái)一個(gè)有趣的用例就是替換某些工具、語(yǔ)言、技術(shù),來(lái)看看這會(huì)帶來(lái)什么樣意外的問(wèn)題,以及這個(gè)過(guò)程是否能順利進(jìn)行。微服務(wù)架構(gòu)常提及的優(yōu)點(diǎn)之一,我認(rèn)為也是云原生應(yīng)用的目標(biāo),就是模塊化。由于我們的應(yīng)用的各種部件和基礎(chǔ)設(shè)施之間的低耦合,所以可以方便地使用等價(jià)的組件替換系統(tǒng)的任何部分。
一個(gè)有趣的例子就是我的一個(gè)同事使用.NET重新編寫了我們的一個(gè)服務(wù)。目前在Linux上的.NET Core還相對(duì)粗糙,除了由于這個(gè)因素所帶來(lái)編寫服務(wù)的一些挑戰(zhàn)之外,已經(jīng)可以成功地將我們?cè)瓉?lái)用Java編寫的訂單服務(wù)與.NET版本無(wú)縫切換。
作為一個(gè)稍稍極端的例子,我想嘗試著替換實(shí)際的容器運(yùn)行時(shí),如使用rkt來(lái)替代當(dāng)前的Docker。這將大大有助于展示我們?cè)凇霸圃鄙系陌l(fā)展,并驗(yàn)證開放容器計(jì)劃。
襪子商店應(yīng)用的目標(biāo)是成為一個(gè)云原生應(yīng)用的參照,也可用作相關(guān)技術(shù)、模式和工具的測(cè)試平臺(tái)。它是一個(gè)完全由社區(qū)擁有和驅(qū)動(dòng)的項(xiàng)目,建議大家可以瀏覽一下代碼、對(duì)應(yīng)用進(jìn)行測(cè)試、使用它來(lái)測(cè)試任何工具和新技術(shù),并通過(guò)PR貢獻(xiàn)自己的代碼。
關(guān)于作者
Ian Crosby是一位經(jīng)驗(yàn)豐富的軟件開發(fā)人員、擁護(hù)者和倡導(dǎo)者。他起步于軍事防御系統(tǒng)的開發(fā),并一直以來(lái)致力于發(fā)揮自己的能力。目前他在阿姆斯特丹的Container Solutions擔(dān)任高級(jí)工程師,他協(xié)助各企業(yè)進(jìn)入新的云原生領(lǐng)域,同時(shí)與合作伙伴一起開發(fā)用于實(shí)現(xiàn)云端原生的工具。
原文地址:http://www.infoq.com/cn/news/2017/06/CSharp-7.1-a
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的袜子商店应用:一个云原生参照应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C# 7.1先睹为快(第一部分)
- 下一篇: 编写高性能 .NET 代码 第二章:垃圾