您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>數(shù)值算法/人工智能>

Serverless架構(gòu)實(shí)踐

大?。?/span>0.7 MB 人氣: 2017-09-28 需要積分:1

  如果你曾經(jīng)想過“應(yīng)該有一個(gè)實(shí)現(xiàn)這種功能的應(yīng)用”,并憧憬有誰能夠?yàn)槟汩_發(fā)一個(gè)就好了,現(xiàn)在我們有一個(gè)好消息,那個(gè)人找到了,就是你自己。

  Web應(yīng)用可以是非常強(qiáng)大、高效和易擴(kuò)展的,但卻不應(yīng)該是復(fù)雜的。簡(jiǎn)單就是Web應(yīng)用的一大優(yōu)勢(shì)。你可以利用這種優(yōu)勢(shì)來搭建自己的解決方案,實(shí)現(xiàn)自己的創(chuàng)意。一旦了解所有模塊是如何搭建到一起的,你就能開發(fā)出想要的應(yīng)用了。

  本書是一本實(shí)用教程,將會(huì)演示一種無服務(wù)器的方案來搭建Web應(yīng)用。使用這個(gè)方案,大部分運(yùn)維方面的問題就不需要你自己操心了,而且也省去運(yùn)行服務(wù)器的費(fèi)用。你能集中時(shí)間和精力開發(fā)想要的應(yīng)用,而讓其他人去考慮業(yè)務(wù)發(fā)展帶來的應(yīng)用上線、配置、升級(jí)、擴(kuò)展服務(wù)器等問題。使用多層Web框架、自動(dòng)生成的代碼或者拷貝模板,這些方法并不會(huì)帶來這樣的好處。等我們一起學(xué)完本書,你就會(huì)知道如何通過移除部分代碼和消除中間層來交付更好的應(yīng)用。

  為了能夠快速演示開發(fā)過程,我們將使用一個(gè)預(yù)設(shè)好的工作空間,里面加載了搭建完整Web應(yīng)用必需的所有模塊。首先,我們會(huì)完成一個(gè)單頁應(yīng)用,用Java、HTML和CSS代碼來實(shí)現(xiàn)原來在服務(wù)器端實(shí)現(xiàn)的邏輯。我們將根據(jù)Web標(biāo)準(zhǔn),深入挖掘單頁Web應(yīng)用的必要功能,從零開始搭建,從而了解它們的運(yùn)行機(jī)制,保證這種設(shè)計(jì)能符合我們應(yīng)用的要求。當(dāng)僅憑Web標(biāo)準(zhǔn)不能完全實(shí)現(xiàn)需求時(shí),我們會(huì)使用jQuery來填補(bǔ)差距。最后,我們會(huì)使用測(cè)試優(yōu)先的方法來漸進(jìn)式開發(fā),以保證單頁應(yīng)用的可測(cè)試性。

  為了降低中間層成本并確保我們的應(yīng)用能供上百萬的用戶使用,我們使用Amazon Web Services(AWS)作為無服應(yīng)用的后端。你將看到如何使用高可用、高可擴(kuò)展、更便宜、更易維護(hù)的云服務(wù)來替換掉傳統(tǒng)Web應(yīng)用的服務(wù)器、數(shù)據(jù)庫和負(fù)載均衡器。我們將討論在開發(fā)此類應(yīng)用時(shí)會(huì)碰到的一些安全性問題,并會(huì)介紹隨著應(yīng)用業(yè)務(wù)的擴(kuò)展可能會(huì)用到的其他技術(shù)和工具。

  我希望能夠讓你看到新的可能性。以前非常費(fèi)時(shí)費(fèi)錢的應(yīng)用開發(fā)或許能變成一個(gè)人在一兩天內(nèi)就可以完成的事情。隨著技術(shù)進(jìn)步和個(gè)人能力的提升,更多的夢(mèng)想將會(huì)實(shí)現(xiàn)。一旦理解了這些技術(shù)的發(fā)展,你就會(huì)發(fā)現(xiàn)從前因?yàn)樘y而幾乎無法實(shí)現(xiàn)的目標(biāo),現(xiàn)在可以借由新途徑來達(dá)成。讀完本書,你將學(xué)會(huì)將創(chuàng)意變成真實(shí)應(yīng)用所需的技能。

  無服Web應(yīng)用

  在傳統(tǒng)Web應(yīng)用中,服務(wù)器是系統(tǒng)不可缺少的組成部分。盡管有時(shí)候服務(wù)器的前面還有負(fù)載均衡器或者專用Web服務(wù)器,但完成大部分工作的還是應(yīng)用服務(wù)器。它完成一個(gè)應(yīng)用所有的必要功能,包括存儲(chǔ)用戶數(shù)據(jù)、進(jìn)行安全認(rèn)證、控制流程等。應(yīng)用的頁面大部分僅僅只是為后端提供界面而已,盡管也會(huì)涉及一些控制導(dǎo)航的功能。使用這種許多人稱之為多層架構(gòu)的傳統(tǒng)方式,系統(tǒng)一般會(huì)由瀏覽器、應(yīng)用服務(wù)器和多個(gè)后端服務(wù)構(gòu)成(見下圖)。

  Serverless架構(gòu)實(shí)踐

  使用無服的方式,可以移除所有這些層次架構(gòu),達(dá)到更直接的實(shí)現(xiàn)。與其僅僅把網(wǎng)頁客戶端當(dāng)作應(yīng)用服務(wù)器的界面展示,不如構(gòu)建一個(gè)單頁Web應(yīng)用在瀏覽器中實(shí)現(xiàn)應(yīng)用邏輯。這意味著你只需要一個(gè)簡(jiǎn)單的靜態(tài)網(wǎng)頁服務(wù)器,所有的交互都只不過是應(yīng)用內(nèi)容的傳輸而已,瀏覽器就像是一個(gè)應(yīng)用容器。這樣,最終的設(shè)計(jì)就是移除傳統(tǒng)Web應(yīng)用架構(gòu)中所有的中間層次,允許瀏覽器直接連接到它所需要的服務(wù)上。

  使用Facebook、Google和Twitter之類的OAuth 2.0身份認(rèn)證服務(wù)商提供的服務(wù),無須保存用戶密碼就可以創(chuàng)建用戶身份。如果要存儲(chǔ)數(shù)據(jù),你可以在瀏覽器端直接使用Amazon DynamoDB之類的服務(wù)。在瀏覽器中無法執(zhí)行的函數(shù)都可以使用Amazon Lambda微服務(wù)或者其他專門的Web服務(wù)來處理。除了能夠簡(jiǎn)化架構(gòu),這種切換到Web服務(wù)作為后端的方式,還能讓應(yīng)用獲得這些服務(wù)與生俱來的可用性和可擴(kuò)展性優(yōu)勢(shì)。

  你可能會(huì)好奇到底發(fā)生了什么,使這種方式成為可能。為什么現(xiàn)在在一個(gè)Web應(yīng)用中,中間層的應(yīng)用服務(wù)器變得可有可無呢?答案是,自從2015年以來,類似Amazon這樣的云服務(wù)提供商開始對(duì)外提供服務(wù)的API,這使得無服務(wù)器的方式成為可能,Amazon本身也為如何使用他們的工具和基礎(chǔ)設(shè)施提供了最好的示范。

  基于Web標(biāo)準(zhǔn)搭建一個(gè)單頁Web應(yīng)用,而不是使用服務(wù)器端Web框架來完成,我們可以快速應(yīng)用一些新興技術(shù)。例如,我們不再需要將應(yīng)用的數(shù)據(jù)模型綁定到任何一個(gè)對(duì)象層級(jí)或者數(shù)據(jù)同步機(jī)制上,因而能更方便地集成不同服務(wù)。既然我們所有的工作都倚賴于Web,就不必拘泥于以前搭建Web應(yīng)用的成見,可以用目前最新的技術(shù)來搭建應(yīng)用(見下圖)。

  Serverless架構(gòu)實(shí)踐

  無服設(shè)計(jì)的好處

  如果你在尋找一種快速搭建低成本W(wǎng)eb應(yīng)用的方法,無服Web應(yīng)用很可能就是一個(gè)解決方案。不需要花費(fèi)時(shí)間和精力了解傳統(tǒng)Web應(yīng)用技術(shù)棧的各個(gè)層級(jí),采用這種方式你能更專注于實(shí)現(xiàn)業(yè)務(wù)功能,有人會(huì)為你操心運(yùn)行維護(hù)和可擴(kuò)展性的問題。接下來讓我們深入探討無服設(shè)計(jì)的好處,幫助你在考慮下一個(gè)項(xiàng)目中是否使用這種方式時(shí)做出更明智的決定。

  零服務(wù)器

  無服設(shè)計(jì)最明顯的好處就是不需要維護(hù)服務(wù)器(不管是物理的還是虛擬的)。你不需要擔(dān)心打安全補(bǔ)丁、監(jiān)控CPU和內(nèi)存使用情況、回滾日志、磁盤空間不足或者其他在維護(hù)自有服務(wù)器時(shí)經(jīng)常碰到的運(yùn)維問題。和大多數(shù)平臺(tái)即服務(wù)(PaaS)方式一樣,無服設(shè)計(jì)能讓你專注于應(yīng)用開發(fā),而無須擔(dān)心基礎(chǔ)設(shè)施的問題。

  易擴(kuò)展

  這種設(shè)計(jì)方式的另一大好處是,你可以依靠云服務(wù)供應(yīng)商來擴(kuò)展自己的應(yīng)用。在做水平擴(kuò)容時(shí),不需要忙不顛地在幾個(gè)負(fù)載均衡應(yīng)用服務(wù)器之間保持?jǐn)?shù)據(jù)的一致性,你可以直接連接Web服務(wù),而它們已經(jīng)解決了數(shù)據(jù)一致性的問題。這意味著不管你的應(yīng)用有幾個(gè)用戶、幾百個(gè)用戶,還是幾十萬個(gè)用戶,只需要修改Amazon Web Services控制臺(tái)的一些設(shè)置就可以保證完美的運(yùn)行。

  高可用

  另外,使用這種設(shè)計(jì)能輕松實(shí)現(xiàn)高可用性。你不必為了升級(jí)而關(guān)閉應(yīng)用服務(wù)器,或者為了實(shí)現(xiàn)“熱”部署而擴(kuò)建基礎(chǔ)設(shè)施。不再會(huì)有服務(wù)的重啟或者部署包在服務(wù)器間的拷貝。最妙的是,Amazon有一群訓(xùn)練有素的員工7×24小時(shí)守護(hù)著你的基礎(chǔ)設(shè)施,一旦發(fā)現(xiàn)問題隨時(shí)能夠響應(yīng)。

  低成本

  這些服務(wù)的成本可以非常低。使用無服的方式以及利用Amazon的免費(fèi)套餐(Free Tier),一個(gè)月支付幾美分就可以運(yùn)行你的應(yīng)用。一旦超過了免費(fèi)額度,其費(fèi)用經(jīng)常也是隨著你的用戶量線性增長(zhǎng)的(考慮費(fèi)用最高的情況)。我們?cè)谶@本書里構(gòu)建的應(yīng)用就算擴(kuò)展到100萬的用戶,一天也只需要花費(fèi)一杯咖啡的錢。

  (微)服務(wù)友好

  這種方式可以輕松適應(yīng)微服務(wù)或者其他的面向服務(wù)架構(gòu)。你可以在系統(tǒng)中引入特定的服務(wù)以實(shí)現(xiàn)自定義身份認(rèn)證、驗(yàn)證或者異步數(shù)據(jù)處理。如果有必要,你甚至可以重新引入應(yīng)用服務(wù)器,漸進(jìn)式地重構(gòu)應(yīng)用。反之,如果一開始就使用一個(gè)中間層來控制所有的安全證書,就很難切換到需要認(rèn)證的Web服務(wù)上。這些應(yīng)用服務(wù)器沒辦法像無服應(yīng)用一樣,在應(yīng)用層管理身份信息。

  代碼更少

  在傳統(tǒng)Web應(yīng)用里,一些操作(比如導(dǎo)航)在Web客戶端和服務(wù)器端都需要執(zhí)行,造成了代碼的重復(fù)。有時(shí)候,這種重復(fù)工作并不明顯,尤其當(dāng)服務(wù)器代碼是用不同的語言寫時(shí)。而在無服應(yīng)用中,應(yīng)用邏輯都移到了客戶端,很容易保證應(yīng)用內(nèi)不再有重復(fù)的代碼。將應(yīng)用邏輯代碼放在一個(gè)位置(以及用一種語言實(shí)現(xiàn))幫助我們解決了這個(gè)問題。

  此外,無服的方式更便于構(gòu)建和排錯(cuò),因?yàn)橄到y(tǒng)的組成部分變得更少了。Web應(yīng)用天生就是分布式的,也就是說,正如CAP理論所述 ,它們?cè)谕粋€(gè)網(wǎng)絡(luò)的節(jié)點(diǎn)間傳遞消息(一般是以請(qǐng)求和響應(yīng)的形式),限制它們的是實(shí)現(xiàn)方式。

  有些應(yīng)用會(huì)比其他應(yīng)用更分散(more distributed)。一個(gè)系統(tǒng)越分散,就越難排錯(cuò)。移除應(yīng)用中的中間層能減少其分散的程度。在我們這個(gè)簡(jiǎn)單的應(yīng)用中,如果一個(gè)客戶端需要從一個(gè)數(shù)據(jù)庫中獲取數(shù)據(jù),就會(huì)直接連接數(shù)據(jù)庫,而不是通過中間層連接。這就意味著系統(tǒng)中的網(wǎng)絡(luò)節(jié)點(diǎn)更少,也意味著如果出現(xiàn)問題,需要定位的地方更少。

  如上所述,構(gòu)建一個(gè)無服應(yīng)用的理由有很多。學(xué)完本書,你就會(huì)明白為什么這種方式如此強(qiáng)大。了解了無服應(yīng)用的這些優(yōu)點(diǎn),我們?cè)賮砜纯此心男┫拗啤?/p>

  無服設(shè)計(jì)的限制

  盡管無服架構(gòu)有許多優(yōu)點(diǎn),但它也不是適用于所有類型的應(yīng)用。為了享受這種設(shè)計(jì)帶來的益處,你必須接受一系列的限制。如果你的應(yīng)用不能適應(yīng)這些限制,那么它很可能不是最合適的構(gòu)建方式。所以在搭建應(yīng)用之前,讓我們一起看看這些限制。

  供應(yīng)商鎖定

  首先最大的限制就是你使用的Web服務(wù)必須支持第三方身份認(rèn)證服務(wù)商,這樣在云服務(wù)提供商的選擇上就受到了限制。所以如果使用無服的方式,你就會(huì)依賴于第三方服務(wù),供應(yīng)商鎖定也就成了一個(gè)問題。構(gòu)建一個(gè)基于其他公司服務(wù)的系統(tǒng),意味著這個(gè)應(yīng)用的命運(yùn)和供應(yīng)商公司的命運(yùn)綁在了一起。如果供應(yīng)商公司被收購、破產(chǎn)或者改變商業(yè)模式,你的應(yīng)用不下大力氣修改就很難在其他地方運(yùn)行。所以,評(píng)估服務(wù)提供商的業(yè)務(wù)目標(biāo)和長(zhǎng)期穩(wěn)定性與技術(shù)選型是同樣重要的。

  奇怪的日志

  所有運(yùn)維關(guān)注的事情,比如應(yīng)用日志,在你使用無服設(shè)計(jì)之后會(huì)呈現(xiàn)新的形態(tài)。當(dāng)你把所有請(qǐng)求都通過一臺(tái)服務(wù)器路由時(shí),記錄下所有信息以查看用戶正在做什么是非常簡(jiǎn)單的事情。沒有了這種中心化設(shè)計(jì),日志的記錄必須由每個(gè)支撐應(yīng)用的不同Web服務(wù)來實(shí)現(xiàn)。這些日志格式跟大部分應(yīng)用服務(wù)器日志都不同,記錄的數(shù)據(jù)也很可能是你不熟悉的。我們?cè)诤竺娴?章的“分析S3日志”會(huì)深入探討Web服務(wù)日志的分析。

  不一樣的安全模型

  對(duì)于無服應(yīng)用,有些常見的安全隱患不復(fù)存在,但你將會(huì)遇到一些不熟悉的新問題。比如,為了安全而驗(yàn)證用戶數(shù)據(jù),結(jié)果不能在瀏覽器中安全地實(shí)現(xiàn)。你需要假設(shè)有些惡意用戶可能會(huì)在瀏覽器中劫持證書而使用該證書授權(quán)的Web服務(wù)。使用無服的方式,意味著你不能把瀏覽器中的應(yīng)用驗(yàn)證邏輯和安全驗(yàn)證邏輯放在一起,必須分開實(shí)現(xiàn)。

  Amazon提供的許多Web服務(wù)都能驗(yàn)證請(qǐng)求。你可以參考第5章的“數(shù)據(jù)訪問和驗(yàn)證”一節(jié)內(nèi)容利用DynamoDB來實(shí)現(xiàn)。然而,對(duì)于有些應(yīng)用來說,很難只用Web服務(wù)提供的工具來實(shí)現(xiàn)充分的有效性約束。比如,在瀏覽器中直接編寫文本時(shí),你不可能放心地將寫入的數(shù)據(jù)編碼后存到數(shù)據(jù)庫中,保證不會(huì)有跨站腳本攻擊發(fā)生。因?yàn)楣粽卟皇褂脩?yīng)用就能直接將這個(gè)數(shù)據(jù)添加到數(shù)據(jù)庫。

  這種情況下,你有(至少)兩個(gè)選擇。第一,可以假設(shè)某些用戶可編輯的表可能包含未經(jīng)驗(yàn)證的數(shù)據(jù),然后針對(duì)性地設(shè)計(jì)系統(tǒng)的其他部分。比如,用戶只能寫入他們自己可讀取的數(shù)據(jù),這是可行的方式。第二,可以將某些寫操作委托給自定義Web服務(wù),比如可以使用Lambda函數(shù)來進(jìn)行驗(yàn)證,并且以一種安全的方式寫入數(shù)據(jù)。我們將會(huì)在第6章的“使用Lambda構(gòu)建微服務(wù)”中詳細(xì)介紹。

非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?