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