Fn 專案是一個開源無伺服器框架,方便開發者使用多種程式語言建立和佈署函式。它由 Fn Server、Fn CLI、Fn UI 和 Fn LB 等元件組成,協同工作以處理函式呼叫和管理。OpenWhisk 則是由 Apache 軟體基金會維護的另一個無伺服器平台,提供高度可擴充套件的架構和多種觸發器及動作,允許開發者使用多種程式語言編寫函式。OpenWhisk 的核心元件包含 Controller、Invoker 和 CouchDB,分別負責處理 API 請求、執行動作和儲存資料。文章將詳細介紹如何在 Docker 環境中佈署和使用這兩個平台,並提供實用的程式碼範例和操作步驟,幫助讀者快速上手無伺服器技術。

Fn 專案與 OpenWhisk:深入探索無伺服器架構

本章節將探討 Fn 專案與 OpenWhisk 兩個重要的無伺服器(Serverless)技術。首先,我們將分析 Fn 專案的架構、元件及其運作原理,並透過實際操作示範如何佈署與管理 Fn 函式。接著,我們將介紹 OpenWhisk,一個由 Apache 開發的無伺服器平台,並探討其設計理念、功能特性以及如何在本機佈署 OpenWhisk 進行函式開發。

Fn 專案的架構與元件

Fn 專案是一個開放原始碼的無伺服器框架,支援多種程式語言的函式開發與佈署。其核心架構包含以下幾個主要元件:

  1. Fn Server:負責接收與處理函式呼叫請求的核心服務。
  2. Fn CLI:用於管理與佈署函式的命令列工具。
  3. Fn UI:提供視覺化介面,用於監控函式呼叫狀態與日誌。
  4. Fn LB(Load Balancer):負責負載平衡,確保多個 Fn Server 例項之間的請求分配均勻。

Fn Server 的角色與組態

Fn Server 是整個 Fn 架構的核心,負責處理來自客戶端的函式呼叫請求。預設情況下,Fn Server 使用內嵌的資料函式庫來儲存函式相關資訊。然而,在生產環境中,通常需要組態外部資料函式庫(如 MySQL)來提升可擴充套件性與可靠性。

# 組態 Fn Server 使用外部 MySQL 資料函式庫
$ docker run --detach \
  --name mysql \
  --network fn_net \
  -e MYSQL_ROOT_PASSWORD=my-secret-pw \
  -e MYSQL_DATABASE=fn_db \
  -e MYSQL_USER=fn_user \
  -e MYSQL_PASSWORD=fn_password \
  mysql:5.7
詳細解說:
  1. docker run --detach: 在背景執行容器。
  2. --name mysql: 指定容器名稱為 mysql
  3. --network fn_net: 將容器加入 fn_net 網路,使其能夠與其他 Fn 元件進行通訊。
  4. -e MYSQL_ROOT_PASSWORD=my-secret-pw: 設定 MySQL 的 root 使用者密碼。
  5. -e MYSQL_DATABASE=fn_db: 建立一個名為 fn_db 的資料函式庫,用於儲存 Fn 的相關資料。
  6. -e MYSQL_USER=fn_user-e MYSQL_PASSWORD=fn_password: 建立一個具有特定許可權的使用者 fn_user,並設定其密碼。

使用 Fn UI 與 MyAdmin 監控函式狀態與日誌

Fn UI 提供了一個視覺化的介面,用於監控函式的呼叫狀態,包括成功、失敗與執行中的函式數量。MyAdmin 則是一個根據 Web 的 MySQL 管理工具,用於直接查詢 Fn 儲存於 MySQL 中的日誌資料。

啟動 Fn UI 與 MyAdmin

# 啟動 Fn UI
$ docker run --detach \
  --name fnui \
  --network fn_net \
  -p 4000:4000 \
  fnproject/fnui

# 啟動 MyAdmin
$ docker run --detach \
  --name myadmin \
  --network fn_net \
  -p 9000:80 \
  -e PMA_HOST=mysql \
  phpmyadmin/phpmyadmin

詳細解說:

  1. docker run --detach: 在背景執行容器。
  2. --name fnui--name myadmin: 分別指定容器名稱為 fnuimyadmin
  3. --network fn_net: 將容器加入 fn_net 網路,使其能夠與其他 Fn 元件進行通訊。
  4. -p 4000:4000-p 9000:80: 將主機的 4000 與 9000 連線埠對應到容器的對應連線埠,以便從外部存取 Fn UI 與 MyAdmin。
  5. -e PMA_HOST=mysql: 設定 MyAdmin 連線至名為 mysql 的 MySQL 資料函式庫服務。

OpenWhisk 簡介

OpenWhisk 是另一個重要的無伺服器平台,由 Apache 軟體基金會維護,並被 IBM 用於其雲端無伺服器服務。OpenWhisk 提供了一個高度可擴充套件且靈活的架構,支援多種觸發器與動作(Actions),並允許開發者以多種程式語言編寫函式。

OpenWhisk 的核心元件

  1. Controller:負責處理 API 請求,並將其轉發至適當的執行環境。
  2. Invoker:負責執行具體的動作(Actions),並管理執行環境的生命週期。
  3. CouchDB:用於儲存動作、觸發器與其他相關資料。

在 Docker 上佈署 OpenWhisk

佈署 OpenWhisk 需要一系列複雜的步驟,包括組態多個 Docker 容器與相關服務。不過,OpenWhisk 提供了一個簡化的佈署工具,使得在本機進行開發與測試變得更加容易。

# 克隆 OpenWhisk 官方倉函式庫
$ git clone https://github.com/apache/openwhisk.git

# 切換至 OpenWhisk 目錄
$ cd openwhisk

# 使用 Docker Compose 啟動 OpenWhisk
$ ./gradlew composeUp
詳細解說:
  1. git clone https://github.com/apache/openwhisk.git: 從 GitHub 克隆 OpenWhisk 的官方倉函式庫。
  2. cd openwhisk: 切換至剛剛克隆下來的 OpenWhisk 目錄。
  3. ./gradlew composeUp: 使用 Gradle 與 Docker Compose 一鍵啟動 OpenWhisk 所需的所有服務。

練習題

  1. Fn 架構包含哪些主要元件?各自的作用是什麼?
  2. 如何組態 Fn Server 使用外部 MySQL 資料函式庫?
  3. Fn UI 與 MyAdmin 在系統中扮演什麼角色?如何啟動它們?
  4. OpenWhisk 的核心元件有哪些?它們如何協同工作?
  5. 如何在 Docker 環境中佈署 OpenWhisk?需要注意哪些問題?

隨著無伺服器技術的不斷發展,未來我們可以預期更多創新性的應用場景與最佳實踐。例如,如何進一步最佳化無伺服器函式的效能、如何更好地整合現有的開發工具鏈、以及如何確保無伺服器應用的安全性等,都是值得探討的方向。

  graph LR
    A[Fn Server] -->|接收請求|> B[Fn LB]
    B -->|負載平衡|> C[Fn Server 例項1]
    B -->|負載平衡|> D[Fn Server 例項2]
    C -->|儲存資料|> E[MySQL 資料函式庫]
    D -->|儲存資料|> E
    F[Fn UI] -->|監控狀態|> C
    F -->|監控狀態|> D
    G[MyAdmin] -->|查詢日誌|> E

圖表翻譯:

此圖表展示了 Fn 專案中各元件之間的互動關係。Fn LB 負責將請求分配給多個 Fn Server 例項,這些例項再將資料儲存至 MySQL 資料函式庫。同時,Fn UI 用於監控各個 Fn Server 例項的狀態,而 MyAdmin 則用於查詢資料函式庫中的日誌資訊。整個流程體現了系統的高用性與可擴充套件性。

OpenWhisk 簡介與安裝

OpenWhisk 是一個強大的 FaaS(Function as a Service)平台,最初由 IBM 和 Adobe 共同開發,後捐贈給 Apache 基金會。根據 Docker 容器技術,OpenWhisk 可以佈署在雲端或本地硬體上,為開發者提供了無需擔心程式碼生命週期管理或容器執行時操作的便利。

OpenWhisk 的架構與特點

OpenWhisk 的設計目標是實作可擴充套件性,支援大量函式呼叫。目前,它是 IBM Cloud Functions 背後的引擎。與其他容器排程器(如 Docker Swarm 或 Kubernetes)不同,OpenWhisk 直接插入每個 Docker 例項以啟動和擴充套件函式容器,使其更適合純 Docker 基礎設施。

對於開發者而言,OpenWhisk 提供了圍繞函式的高階程式設計模型,具有多項吸引人的功能。其事件觸發機制如圖 6.1 所示:

此圖示呈現了 OpenWhisk 的事件觸發流程。

圖表翻譯:

此圖示展示了 OpenWhisk 的事件處理流程。首先,事件以觸發器的形式出現,經過規則處理後選擇適當的動作執行。動作執行後,其結果儲存在結果儲存中,然後傳回給事件源。

OpenWhisk 的基本概念

與其他平台類別似,OpenWhisk 的最小佈署單元是函式。在 OpenWhisk 中,函式被稱為動作(action)。動作可以回應事件執行。事件以觸發器(trigger)的形式出現,並透過規則(rule)選擇適當的動作執行。動作執行後,其結果儲存在結果儲存中,然後發送回事件源。

OpenWhisk 原生支援多種語言執行時,但本章重點關注其 Docker 執行時,該執行時允許開發者將任何型別的工作負載封裝到容器中,並讓 OpenWhisk 處理剩餘的工作。OpenWhisk 中的動作可以同步、非同步或按排程呼叫。此外,OpenWhisk 提供了宣告式程式設計結構,如序列(sequence),允許多個動作連結並作為流程執行。

安裝 OpenWhisk

撰寫本文時,在本地機器上安裝 OpenWhisk 的最快方法是使用 Docker 和 Docker Compose。

安裝 Docker Compose

首先,需要安裝 Docker Compose。可以按照以下步驟進行:

$ sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

檢查 Docker Compose 版本:

$ docker-compose --version
docker-compose version 1.17.1, build 6d101fb

本章使用 Docker Compose 1.17.1 版本。

克隆 OpenWhisk Dev 工具倉函式庫

確保 Git 已經安裝,然後克隆 OpenWhisk Dev 工具倉函式庫:

$ git clone --depth=1 https://github.com/apache/incubator-openwhisk-devtools

--depth=1 引數告訴 Git 進行淺克隆,這意味著只會下載最新的修訂版本,以節省時間和空間。

啟動 OpenWhisk 例項

進入 incubator-openwhisk-devtools/docker-compose 目錄,該目錄包含 docker-compose.yml 和啟動單節點 OpenWhisk 例項所需的環境變數。

使用以下命令啟動 OpenWhisk 例項:

$ make quick-start

該命令將下載 OpenWhisk 的最新原始碼、啟動本地叢集、初始化資料,並註冊和呼叫示例函式。

驗證 OpenWhisk 安裝

如果輸出結果如預期,則 OpenWhisk 已準備好在 localhost:443 上提供服務。使用 docker ps 命令檢查所有 OpenWhisk 容器是否正在執行:

$ docker ps --format "table {{.ID}}\t{{.Image}}"
CONTAINER ID IMAGE
5e44dca4c542 openwhisk/nodejs6action:latest
d784018ef3de adobeapiplatform/apigateway:1.1.0
74b6b1d71510 openwhisk/controller
0c0cb4779412 openwhisk/invoker
b0111898e1a8 nginx:latest
874dac58a7c1 landoop/kafka-topics-ui:0.9.3
611e9b97ad74 confluentinc/cp-kafka-rest:3.3.1
4e1a82df737e wurstmeister/kafka:0.11.0.1
9c490336abff redis:2.8
abc4c0845fac couchdb:1.6
451ab4c7bf45 zookeeper:3.4

使用 wsk 使用者端

make quick-start 命令已經安裝了 wsk 使用者端。wsk 二進位制檔案位於 openwhisk-master/bin/wsk。通常將 wsk CLI 複製到 /usr/local/bin 並設定 bash 自動補全:

$ sudo cp openwhisk-master/bin/wsk /usr/local/bin
$ wsk sdk install bashauto

啟用 wsk 命令列自動補全:

$ source wsk_cli_bash_completion.sh
$ wsk
____ ___ _ _ _ _ _
/\ \ / _ \ _ __ ___ _ __ | | | | |__ (_)___| | __
/\ /__\ \ | | | | '_ \ / _ \ '_ \| | | | '_ \| / __| |/ /
/ \____ \ / | |_| | |_) | __/ | | | |/\| | | | | \__ \ <
\ \ / \/ \___/| .__/ \___|_| |_|__/\__|_| |_|_|___/_|\_\
\___\/ tm |_|
Usage:
wsk [command]
...

使用 wsk property get 命令

wsk property get 命令用於顯示 OpenWhisk 資訊,包括當前名稱空間、身份驗證金鑰和建置編號。例如,使用 -i--insecure 引數進行不安全的連線:

$ wsk -i property get
client cert

wsk 命令列工具使用流程

  graph LR;
    A[開始] --> B[wsk property get];
    B --> C[顯示 OpenWhisk 資訊];
    C --> D[驗證連線];
    D --> E[使用 wsk 命令列工具];

圖表翻譯: 此圖示展示了使用 wsk 命令列工具的流程。首先,開始使用 wsk property get 命令,然後顯示 OpenWhisk 資訊,接著驗證連線,最後使用 wsk 命令列工具進行操作。

OpenWhisk 包括但不限於以下幾個方面:

  1. 增強安全性:隨著 FaaS 平台的廣泛應用,安全性成為一個越來越重要的議題。OpenWhisk 需要不斷增強其安全性功能,以保護使用者資料和應用程式。
  2. 提高可擴充套件性:OpenWhisk 的設計目標是支援大量函式呼叫,未來需要繼續提高其可擴充套件性,以滿足日益增長的使用需求。
  3. 簡化開發流程:透過簡化開發流程和提供更多的開發工具,OpenWhisk 可以幫助開發者更快速地開發和佈署函式。
  4. 擴充套件支援的語言執行時:雖然 OpenWhisk 目前已經支援多種語言執行時,但未來仍需要繼續擴充套件其支援的語言型別,以滿足不同開發者的需求。

透過不斷改進和創新,OpenWhisk 有望成為更加強大和靈活的 FaaS 平台,為開發者和企業提供更多的價值。