--- title: 【Serverless 應用案例賞析筆記】01. Serverless 架構與 Apache OpenWhisk date: 2020-03-26 is_modified: false disqus: cynthiahackmd categories: - "雲端網路 › 雲端運算" tags: - "其他課程平台" - "Serverless 應用案例賞析" - "Fass/Serverless" - "網站與雲端平台" - "OpenWhisk" --- {%hackmd @CynthiaChuang/Github-Page-Theme %} <br> <p class="illustration"> <img src="https://i.imgur.com/Wn0R9Lh.png" alt="投影片封面"> 投影片封面(圖片來源: <a href="https://github.com/dWChina/ibm-opentech-ma/blob/master/serverless-use-cases/Serverless-00.pdf">課程講義</a>) </p> 本堂課程作為此系列的準備課程,針對不了解 Serverless 的人,介紹 Serverless 概念、特點以及 Open Source Serverless 平台 Apache OpenWhisk 和基於它實做的企業版本 IBM Functions 的概況。 <!--more--> ## 雲端計算的發展趨勢 在課程一開始先帶我們來回顧雲端計算的發展趨勢。 <p class="illustration"> <img src="https://i.imgur.com/kB72EtC.png" alt="雲端計算的發展趨勢"> 雲端計算的發展趨勢(圖片來源: <a href="https://github.com/dWChina/ibm-opentech-ma/blob/master/serverless-use-cases/Serverless-00.pdf">課程講義</a>) </p> 由圖中可以發現架構演變的趨勢,是朝著==簡單==、==便捷==與==低成本==實現==商業邏輯==(Business Logic)的方向前進。 從最開始裸機的配置與開發;接著進入 IaaS 飛速發展,在這期間以 OpenStack 為代表的社區逐漸的成長,發展出許多的雲端平台公司;到之後發展出以 docker 為代表的 containers,而使得 Kubernetes 和 Mesos 等容器調度工具廣為人知。 :::info :information_source: **docker、Swarm、Kubernetes 和 Mesos** 文章中所說的 docker 指的是 docker 技術本身。而一般看到的 Docker、 Kubernetes 與 Mesos 的比較文章,更有可能是比較與 Docker Swarm 比較,三者皆為容器調度工具。 <br> 三者較可閱讀: 1. [Docker、Kubernetes 和 Apache Mesos 对比中的一些误区](https://zhuanlan.zhihu.com/p/28301108) 2. [2016年容器技术思考:Docker, Kubernetes, Mesos 将走向何方?](http://jolestar.com/container-ecosystem/) ::: <br> 由發展史看可以看出,隨著一系列的發展,對底層的屏蔽是日趨增加。 在裸機的時代,開發人員還需要操心系統的設定與維護;而到了 container 階段,則是已經將執行環境抽離,消除底層系統和基礎架構差異性所帶來的問題。 換句話說,隨著對底層屏蔽的增加,使的開發人員能==專注於功能或程式本身的開發設計==,加速整個開發流程的推進。 <br> 而在最近幾年的技術中,又將粒度再次縮小,提出了所謂的 Function as a Service(FaaS),也就是 Serverless,試圖讓開發人員程從系統、運行環境、軟體相依性等複雜的環境中解脫。 ### 什是 Serverless? Serverless 是雲端計算 IaaS 、 PaaS 的下一個方向,但這像技術並非實現字面意上的『無伺服器』,而是由第三方雲端計算平台供應商負責後端基礎設施的維護,以服務(aaS)的方式為開發者提供所需功能,例如:認證、授權與資料庫服務等。 簡單地說,這裡所強調的『無伺服器』,指的是我們的==程式碼不會明確地被部署在某些特定的軟體或者硬體的伺服器上==,不需要在伺服器上持續執行行程以等待 HTTP 請求或 API 調用;是通過某種事件機制來觸發程式碼的執行,此時供應商才會將此服務進行部署。這樣的架構可以讓開發人員更專注程式碼的運行,而不需要分心管理任何的基礎設施。 <br> 目前已有有些這樣的服務:==由第三方供應,且無須安裝、管理和維護,只在需要的時候使用,並按照使用資源計費==。 例如實務上,有些開發人員為了更專注於商業邏輯相關程式碼的開發,會將與商業邏輯邏輯無關的部份委託給第三方,像是上述所提到的認證、授權與資料庫服務等,這些都是 **Backend-as-a-Service(BaaS)**。 也有的將整個程式運行環境給託管出去的,將開發出來的函式直接放動雲端去當作服務在調用,也就是 **Function-as-a-Service (FaaS)**。 這兩類型的服務都被稱作 Serverless,也都是雲端計算的發展方向。 <br> 這邊整理兩種服務的特性: - **Function-as-a-Service (FaaS)** - 片段程式碼,按需執行、按需擴展、無需管理任何基礎設施相關部份。 - 事件驅動行計算。函式被事件觸發或是被 HTTP 請求調用。 - **Backend-as-a-Service (BaaS)** - 第三方基於 API 的服務,實現應用開發中的基礎功能模塊。 - 這些 API 像服務一樣,自動擴展,無需管理。 兩者都強調:==按需執行、按需擴展、無需管理==。這樣的模式是將軟體開發中的複雜性全部抽出,給開發人員更多的自由,並降低開發門檻;但從另一方面來說,這是將複雜性全留給雲端計算平台供應商。 ### Serverless 要點 Serverless 僅是一個概念,目前還沒有一個普遍公認的權威的定義,但此概念所要實現的目標表達就是: <div class="blockquote-center"> <p> 無需管理、按需執行、按需擴展、按使用來計費 </p> </div> P.S. 對於按使用來計費,我有兩種理解,按調用次數或使用資源來收費,不過兩種的核心的使用了才付費,就看平台供應商的計價方式了。 <br> 至於所使用究竟是 FaaS 或 BaaS 則是次要的。但若採用的 FaaS ,對於函式還是有些要求: 1. 為事件驅動的調用方式。 2. 函式是無狀態、短暫的、且是有限制的,例如:所需記憶體的限制、執行時間的限制。 3. 另外,因為 FaaS 可被 HTTP 調用,因此 API Gateway 設定也是其中的要點。 <br> 另外,講師提到一件事 Serverless 雖然包含了兩種服務概念 FaaS 與 BaaS,不過在講解中多會集中在 FaaS,這點在多數的文章中也是。因為 BaaS 這邊複雜度在提供此服務的開發者那邊,對於我們來說會用就好。因此在提到 Serverless 時大家多著墨在 FaaS 這塊。 <p class="illustration"> <img src="https://i.imgur.com/D1N30gv.jpg?1" alt="感應式水龍頭"> 感應式水龍頭(圖片來源: <a href="https://www.amazon.com/-/es/inoxidable-lavabo-el%C3%A9ctrico-autom%C3%A1tico-dom%C3%A9stico/dp/B07SZMPPBH">Amazon</a>) </p> 課程中講師提到關於水龍頭與計算資源的比喻: <div class="blockquote-center"> <p> 雲端計算的的目標是:期望計算資源如同水資源一樣的便捷,打開就可以享用。 </p> </div> 按她的比喻來理解,現行的 VM 或是 containers 像是一般水龍頭,打開後除非主動關閉,不然就會 24 小時運行,即便此時無人使用,但還是會佔用資源。 而 Serverless 則像是使用了感應式水龍頭,手伸出去了,資源才會被調用執行,結束後資源就自動停用。 ### FaaS 與 PaaS 的比較 在第一次看到 FaaS 的觀念時,覺得它像是更專注提供某種功能的 PaaS,所以查了一下兩者的比較。 在[維基百科上](https://zh.wikipedia.org/wiki/%E7%84%A1%E4%BC%BA%E6%9C%8D%E5%99%A8%E8%A8%88%E7%AE%97)提到: > 以平台即服務(PaaS)為基礎,無伺服器運算提供一個微型的架構... 所以可以推測 FaaS 是 PaaS 的上層,但還不到 SaaS。 <br> 而在 [AWS 的官方博客](https://aws.amazon.com/cn/blogs/china/iaas-faas-serverless/) 上,則是有說到些兩者的差異: 1. **啟動和停止** 大部分 PaaS 應用無法針對每個請求啟動和停止整個應用,而 FaaS 生來就是為了實現這樣的目的。 2. **縮放能力** 兩者在維運方面最大的差異在於==縮放能力==。對於大部分 PaaS 平台,租戶依然需要考慮縮放,就算將它設置為自動縮放,依然無法在具體請求的層面上進行縮放。但是對於 FaaS 應用,這種問題完全是透明的。 <br> 文章比較末端,使用 AWS 雲端架構戰略副總裁 Adrian Cockcroft 給的簡單定義來收尾: > 如果你的 PaaS 能夠有效地在 20 毫秒內啟動實例並運行半秒,那麼就可以稱之為 Serverless <br> 最後附上一篇兩者的比較: [FaaS、PaaS 和无服务器体系结构的优势](https://www.infoq.cn/article/2016/06/faas-serverless-architecture) ### Serverless 架構的優點 1. **快速開發/快速響應** 對於使用者來說最重要的是快速響應,因為底層全部被屏蔽了,只需專注商業邏輯的開發,無需煩心操作系統、運行環境、版本相容...等問題。 借助 Serverless,或許只需要幾個小時,來完成新的實做邏輯即即可,不用再去重新配置環境。 2. **無限擴展** 在 Serverless 架構的中,==橫向擴展是完全自動的、有彈性的、且由平台供應商所管理==,使用者僅需支付您所需要的計算能力。 3. **『綠色』計算** 想想剛剛水龍頭的例子,就可以理解了。 4. **對開發者友好** 恩...不用管硬體配置,只要寫程式就好。這對我這個討厭配置環境的人來說,真的是非常友好 XDDD 每次配環境都會在坑裡掙扎超久的 Orz 5. **費用用低** 在降低成本上包含了兩個方面,即基礎設施的成本和人員(運營/開發)的成本。 ## Opensource Serverless 平台 - Apache OpenWhisk <p class="illustration"> <img src="https://i.imgur.com/uAXvRH6.png" alt="Apache OpenWhisk Icon"> Apache OpenWhisk(圖片來源: <a href="https://landscape.cncf.io/license=open-source">CNCF Cloud</a>) </p> OpenWhisk 是一個開源 FaaS 平台,現在已經脫離孵化器,是 Apache 的一個頂級項目,也在 IBM 公有雲上有做了驗證。它是一個典型的==事件驅動型==的程式編輯模型。 <br> 事件驅動顧名思義就是,事件來了才去做一件事情。以講師給的流程圖為例: 當事件源觸動觸發器後進入系統,然後在系統中通過規則的匹配去決定要觸發的動作,最終產生所需的結果。通常來說,輸入與輸出的的資料格式都是 Json。 <p class="illustration"> <img src="https://i.imgur.com/a5Wgs5M.png?1" alt="apache OpenWhisk 理念"> Apache OpenWhisk 理念(圖片來源: <a href="https://github.com/dWChina/ibm-opentech-ma/blob/master/serverless-use-cases/Serverless-00.pdf">課程講義</a>) </p> 在這邊出現了幾個詞,==觸發器 (Trigger)==、==動作 (Action)== 與 ==規則 (Rule)==,這些詞我跟下一節的筆記整理在一起。 ### OpenWhisk 程式編輯模型 <p class="illustration"> <img src="https://i.imgur.com/lZP3G5P.png" alt="Apache OpenWhisk 程式編輯模型"> Apache OpenWhisk 程式編輯模型(圖片來源: <a href="https://github.com/dWChina/ibm-opentech-ma/blob/master/serverless-use-cases/Serverless-00.pdf">課程講義</a>) </p> **觸發器 (Trigger)** 觸發器可以對外界數據源,如資料庫的增刪查改、 github 上的 push、issue...等,進行對應的反應。 不過在 OpenWhisk 中觸發器僅某類別事件的具名頻道,換句話說僅是==一個名字==。觸發器要對反應特定類型事件的宣告,再藉由使用者或是透過事件來源觸發觸發器。 以資料庫更新為例,若是事件來源觸發,在 OpenWhisk 之外會有一個 Event provider,由它監聽資料庫。當 provider 監聽到更新事件時,再由它通知 Trigger 資料更新了。 <p class="illustration"> <img src="https://i.imgur.com/XznGAql.png" alt="Trigger"> Trigger(圖片來源: <a href="https://github.com/dWChina/ibm-opentech-ma/blob/master/serverless-use-cases/Serverless-00.pdf">課程講義</a>) </p> **動作 (Action)** 動作是執行某個特定動作的一段程式碼,它將會在 openwhisk 中執行。使用所選擇的語言來撰寫 Action,或者直接將 Docker 以映像檔提供執行。 Action 中什麼都可以放,諸如:計算、資料格式轉換、資料抽取、第三方 API 調用...等,程式寫的出來的都行。但必須注意的是,在 FaaS 中是==無狀態==的,不應該存在狀態的記錄,而且是==短時運行==的。在 openwhisk 中預設最長執行時間為是 5 分鐘,若超過 5 分鐘則不建議使用 Faas 執行,或是必須在要切成更小的粒度分開執行。 <p class="illustration"> <img src="https://i.imgur.com/URsL9hc.png" alt="Action"> Action(圖片來源: <a href="https://github.com/dWChina/ibm-opentech-ma/blob/master/serverless-use-cases/Serverless-00.pdf">課程講義</a>) </p> **動作序列 / 動作串 (Sequence)** 全稱是 Action Sequence,這並不在講師的講義中,僅出現在講解過程中出現。 動作序列顧名思義,就是把一系列的動作鏈結來。它是一串按順序呼叫的動作,其中某個動作的輸出會傳遞為下一個動作的輸入,達到動作重複使用的目的。 <br> **規則 (Rule)** 規則會建立觸發器與動作(序列)的關聯。每次觸發觸發器時,規則都會使用觸發事件作為輸入,並呼叫關聯的動作(序列)。使用適當的規則集時,單一觸發器事件可能會呼叫多個動作,也可能會呼叫動作以作為多個觸發程式的事件的回應。 <p class="illustration"> <img src="https://i.imgur.com/hJtcgqJ.png" alt="Rule"> Rule(圖片來源: <a href="https://github.com/dWChina/ibm-opentech-ma/blob/master/serverless-use-cases/Serverless-00.pdf">課程講義</a>) </p> **套件 (Package)** 就是一個集合,可能包含 action、trigger、rule...等,可以利用套件來新增與服務及事件提供者的整合。 這邊講師沒多說,不過 [IBM 的名詞解釋](https://cloud.ibm.com/docs/openwhisk?topic=cloud-functions-about#cloud-functions-) 舉了個例子: > 使用 IBM Cloudant 變更資訊來源所建立的觸發程式,會將服務配置成在每次修改文件或將其新增至 IBM Cloudant 資料庫時發動觸發程式。套件中的動作代表服務提供者可設為可用的可重複使用邏輯,如此,開發人員可以使用服務作為事件來源,以及呼叫該服務的 API。 <p class="illustration"> <img src="https://i.imgur.com/rherSKn.png" alt="Package"> Package (圖片來源: <a href="https://github.com/dWChina/ibm-opentech-ma/blob/master/serverless-use-cases/Serverless-00.pdf">課程講義</a>) </p> 最後來貼張漂亮的流程圖: <p class="illustration"> <img src="https://i.imgur.com/bdt17VM.png" alt="OpenWhisk 流程示例"> OpenWhisk 流程示例(圖片來源: <a href="https://github.com/dWChina/ibm-opentech-ma/blob/master/serverless-use-cases/Serverless-00.pdf">課程講義</a>) </p> ### Apache OpenWhisk 的部署方式 Apache OpenWhisk 的部署看理來很簡單,只要支援 docker 的設備都可以安裝,Apache 已將相關內容都把包成 docker image。相關配置步驟可以看這兩份官方的說明文件:[文件1](https://openwhisk.apache.org/documentation.html#openwhisk_deployment)、[文件2](https://github.com/apache/openwhisk#quick-start) ...不過有沒有真的這麼簡單,可能要頭洗下去才知道。 <p class="illustration"> <img src="https://i.imgur.com/JtiWH57.png" alt="Apache OpenWhisk的部署方式"> Apache OpenWhisk的部署方式(圖片來源: <a href="https://github.com/dWChina/ibm-opentech-ma/blob/master/serverless-use-cases/Serverless-00.pdf">課程講義</a>) </p> ## IBM Functions 先前提過 OpenWhisk 有在 [IBM 公有雲](https://cloud.ibm.com/functions/)上有做了驗證,所以這邊講師就示範了在公有雲上的簡單操作。 ### 建立 Action 1. 從入口處點選**開始建立** <p class="illustration"> <img src="https://i.imgur.com/Pl7SdIK.png" alt="開始建立"> </p> 2. 選擇**建立動作** <p class="illustration"> <img src="https://i.imgur.com/CIqK3tZ.jpg" alt="建立 Action"> </p> 3. 建立**套件** 這步驟非必須,這邊只是試著操作。 <p class="illustration"> <img src="https://i.imgur.com/LACIoTX.jpg" alt="建立 Package"> </p> 4. 為動作命名,並引入剛剛所創建的套件 這邊為了測試方便,運行環境直接選擇 **Node.js** <p class="illustration"> <img src="https://i.imgur.com/b3gprKB.jpg" alt="建立 Package"> </p> 5. 建立後會出現 Node.js 的程式碼作為動作的執行細節 再依照實際要執行的動作進行修改,完成後可以試著點選**呼叫**,查看動作執行後的結果。 <p class="illustration"> <img src="https://i.imgur.com/5EheU6x.jpg" alt="定義動作細節"> </p> 也可以透過 curl 來呼叫 ```shell= $ curl -u API-KEY -X POST https://us-south.functions.cloud.ibm.com/api/v1/namespaces/id%40dgmail.com/actions/test/hello?blocking=true ``` ### 建立 Trigger 1. 從入口處點選**開始建立** <p class="illustration"> <img src="https://i.imgur.com/Pl7SdIK.png" alt="開始建立"> </p> 2. 選擇**建立觸發程式** <p class="illustration"> <img src="https://i.imgur.com/8X3Iavi.png" alt="建立 Trigger"> </p> 3. 設定定時式的觸發器 這邊先簡單設定一個定時觸發的觸發器 <p class="illustration"> <img src="https://i.imgur.com/ynmDXKW.jpg" alt="建立定時觸發器"> </p> 4. 設定觸發時間 這邊使用 cron 的方式設定每 20 秒觸發 <p class="illustration"> <img src="https://i.imgur.com/HlLkZXe.jpg" alt="建立每 20 秒觸發"> </p> 5. 查看 完成與 action 的連接後,可到監視查看。 <p class="illustration"> <img src="https://i.imgur.com/2gfcm2n.jpg" alt="監視"> </p> 應該會看到 trigger 每 20 秒被觸發,接著執行 action 。 P.S. Oops,我現在才發現 every20 打錯了,不過也來不及了... ## 其他連結 1. Serverless 應用案例賞析筆記:[目錄](/@CynthiaChuang/Serverless-Use-Cases-Study-Notes-Contents) / [另開書籍模式閱讀](/@CynthiaChuang/Serverless-Use-Cases-Study-Notes) 2. 課程內容:影片([IBM片源](https://mediacenter.ibm.com/media/1_7hu9nbk8) 、[youku教育片源](https://v.youku.com/v_show/id_XMzg0MTI3NTE3Ng==.html))/ [講義](https://github.com/dWChina/ibm-opentech-ma/blob/master/serverless-use-cases/Serverless-00.pdf) / [Blog](https://mp.weixin.qq.com/s/p0bImKuYSz2FPfdMvTt06Q) ## 參考資料 1. 费良宏 (2017-01-18)。[从IaaS到FaaS—— Serverless架构的前世今生](https://aws.amazon.com/cn/blogs/china/iaas-faas-serverless/) 。檢自 亚马逊AWS官方博客 (2020-03-25)。 2. 協同撰寫。[無伺服器計算](https://zh.wikipedia.org/wiki/%E7%84%A1%E4%BC%BA%E6%9C%8D%E5%99%A8%E8%A8%88%E7%AE%97)。檢自 維基百科 (2020-03-25)。 3. (2018-11)。 [IBM Cloud Functions](https://www-03.ibm.com/software/sla/sladb.nsf/8bd55c6b9fa8039c86256c6800578854/c9c99a9fc9731d3f86258340006f9704/$FILE/i126-7607-03_11-2018_zh_TW.pdf)。檢自 IBM Cloud 其他服務說明 (2020-03-25)。 4. Shashikanh (2019-07-25)。[“Hello, World” in IBM Cloud Functions vs Express Serverless Platform — A Developer’s Perspective](https://medium.com/ibm-cloud/hello-world-in-ibm-cloud-functions-vs-express-serverless-platform-a-developers-perspective-4d5e391653e) 。檢自 IBM Cloud - Medium (2020-03-25)。 5. (2019-07-12)。[Cloud Functions 的運作方式 - Cloud Functions 術語](https://cloud.ibm.com/docs/openwhisk?topic=cloud-functions-about#cloud-functions-terminology) 。檢自 IBM Cloud (2020-03-25)。 6. Linux中国 (2017-08-04)。[Docker、Kubernetes 和 Apache Mesos 对比中的一些误区](https://zhuanlan.zhihu.com/p/28301108)。檢自 Linux 开源评论 - 知乎 (2020-03-25)。 7. jolestar (2017-02-17)。[2016年容器技术思考:Docker, Kubernetes, Mesos 将走向何方?](http://jolestar.com/container-ecosystem/)。檢自 午夜咖啡 (2020-03-25)。 8. Abel Avram,大愚若智 譯 (2016-06-26)。[FaaS、PaaS 和无服务器体系结构的优势](https://www.infoq.cn/article/2016/06/faas-serverless-architecture)。檢自 infoq (2020-03-27)。 9. [Get hands-on experience with Serverless Computing using IBM Cloud Functions](https://developer.ibm.com/series/get-hands-on-with-serverless-series-page/)。檢自 IBM Developer (2020-03-27)。 <br><br> > **本文作者**: 辛西亞.Cynthia > **本文連結**: [辛西亞的技能樹](https://cynthiachuang.github.io/Serverless-Use-Cases-Study-Notes-01) / [hackmd 版本](https://hackmd.io/@CynthiaChuang/Serverless-Use-Cases-Study-Notes-01) > **版權聲明**: 部落格中所有文章,均採用 [姓名標示-非商業性-相同方式分享 4.0 國際](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.en) (CC BY-NC-SA 4.0) 許可協議。轉載請標明作者、連結與出處!