---
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) 許可協議。轉載請標明作者、連結與出處!