OpenWhisk 是乙個開源的、事件驅動的計算平台。
在上一篇文章中,我介紹了乙個微服務架構,它使用佇列、發布/訂閱頻道或訊息中心來排列“工作”列表。 每個工作項都是乙個資料塊,將以某種方式(通常是 JSON 文件)進行處理、儲存或操作。 我使用 Redis、RabbitMQ 或 Apache Kafka 建立了乙個指標收集器微服務,用於從移動或 Web 應用程式收集 Web 指標資料,並將其寫入佇列或發布/子通道。
另乙個指標收集器儲存微服務使用的收集資料,並將其寫入 Cloudant、MongoDB 或 Elasticsearch 選項。 然後,我向您展示了如何新增其他微服務,以便在流資料傳入時對其進行聚合。 幸運的是,作曲IO 支援部署 Redis、Rabbimq、MongoDB 或 Elasticsearch,IBM 提供 Cloudant 和 Apache Kafka 即服務,因此很容易上手,但有很多變化的部分。
今天,我正在使用一項新服務 OpenWhisk,它簡化了微服務的部署,無需管理自己的訊息傳遞或部署自己的工作伺服器。
OpenWhisk 是乙個開源的、事件驅動的計算平台。 您可以將操作傳送到 OpenWhisk,然後提供要由 OpenWhisk 處理的資料流。 OpenWhisk 處理處理工作負載所需的計算資源的擴充套件; 您只需要處理操作**和觸發這些操作的資料。 您只需為已完成的工作量付費,而不必為等待工作的閒置伺服器付費。
您可以在 jAscript 或 Swift 中編寫操作。 這意味著 Web 開發人員和 iOS 開發人員可以使用相同的語言來建立伺服器端和前端。
本文中提供的部分和命令列呼叫假定您已在 IBM Cloud(以前稱為 Bluemix)(現在更名為 IBM Cloud Functions,基於 Apache OpenWHISK)中註冊了 OpenWHISK beta 計畫,並且您已經安裝了“WSK”命令列工具。 請訪問我們建立乙個名為“hello”的檔案。js 的 j**ascript 檔案,其中包含乙個返回簡單物件的函式:
function main()
這是最簡單的 OpenWhisk 操作; 它只返回乙個靜態字串作為有效負載。 使用以下命令將操作部署到 openwhisk:
> wsk action create hello hello.jsok: created action hello
這將建立乙個名為“hello”的操作來執行 hellojs的。 我們可以使用以下命令在雲中執行它:
> wsk action invoke --blocking hello
我們也可以要求我們輸入一些引數:
function main(params) ;
然後更新我們的操作:
> wsk action update hello hello.jsok: created updated hello
使用引數執行我們的 **:
> wsk action invoke --blocking --result hello --param name 'jennie' --param place 'the block'
我們建立了乙個簡單的 j**ascript 函式來處理一些資料,而不必擔心佇列、員工或任何網路基礎設施,並且我們能夠在 OpenWhisk 平台上做到這一點。
我們可以在操作中做更複雜的事情,比如做 API 呼叫。 我建立了以下操作,該操作呼叫包含《權力的遊戲》資料的簡單搜尋服務例項,並傳入 q 引數:
var request = require('request');function main(msg) ,json:true}request(opts, function(error, response, body) )return whisk.async();
我們可以建立這個動作,並給它乙個不同的名稱:
> wsk action create gameofthrones gameofthrones.jsok: created action gameofthrones
然後用引數 q 呼叫它;
> wsk action invoke --blocking --result gameofthrones --param q 'melisandre',"gender":},"from_cache":true,"rows":"total_rows":1}}
我們可以在 OpenWhisk 操作中執行的另乙個任務是在 Slack 中發布訊息。 Slack 有乙個很好的 API 來建立自定義整合:Slack 管理員可以設定乙個“傳入 Webhook”,這樣他們就可以通過簡單地向 HTTP 端點傳送 POST 請求來將字串發布到頻道。 我們可以用幾行建立 Slack 發布操作:
var request = require('request');function main(msg) )json:true}request(opts, function(error, response, body) )return whisk.async();
將“我的自定義 Slack Webhook URL”替換為 Slack 在建立“傳入 Webhook”整合時建立的 Webhook URL。 請注意,此操作是非同步執行的,並且僅在請求完成時回收。
然後,我們可以像往常一樣部署和執行它:
> wsk action create slack slack.jsok: created action slack
> wsk action invoke --blocking --result slack --param text'you know nothing, jon snow'
碰巧的是,Whisk 有乙個內建的 Slack 整合,但你自己構建乙個對您來說也不錯,不是嗎? 然後,您可以執行自己的邏輯,根據傳入的資料決定是否發布 Slack 訊息。
將自己的自定義操作寫入 Cloudant 相對簡單,因為您可以:
Cloudant Node 的“要求”js 庫使用 Cloudant 的 HTTP API 將資料寫入 Cloudant 這種方法的缺點是您需要將 Cloudant 憑據硬編碼到操作中,就像我們在上乙個示例中硬編碼 Slack webhook URL 一樣,這不是最佳實踐。
幸運的是,OpenWhisk 有乙個預構建的 Cloudant 整合,您無需任何自定義即可呼叫它**。 如果您已經擁有 Cloudant 帳戶,則可以使用以下命令列授予對 Cloudant 服務的訪問許可權:
> wsk package bind /whisk.system/cloudant mycloudant -pusername 'myusername' -p password 'mypassword' -p host'mydomainname.cloudant.com'
然後,您可以檢視 OpenWHISK 可以與之互動的連線列表:
> wsk package listpackages/[email protected]_dev/mycloudant private binding
其中[email protected] 是我的 IBM Cloud 使用者名稱(或您的 IBM Cloud 組織的名稱),Dev 是您的 IBM Cloud 空間。
您可以呼叫包的 write 命令將資料寫入 cloudant:
> wsk action invoke /[email protected]_dev/mycloudant/ write --blocking --result --param dbname testdb --param doc ''
到目前為止,我們已經建立並更新了 openwhisk 操作,並且我們還觸發了每個操作以將任務作為一組命令執行。 “wsk”工具允許您觸發一些操作,在後台執行它們,還允許您將操作鏈結在一起以形成序列,但我們不打算在本文中介紹這一點。
我們是乙個簡單的 j**ascript 塊,其中只呼叫“main”函式。 這意味著我們可以使用常見的自動化測試和持續整合工具來測試我們的。 部署只需要乙個命令列語句; 無需擔心伺服器、作業系統或網路硬體。
OpenWhisk 是乙個事件驅動的系統。 你已了解如何通過手動部署**來建立事件。 但是我們如何設定 OpenWhisk 來處理事件流呢?
OpenWhisk 中的觸發器是觸發事件和執行 ** 的另一種方式。 我們可以建立一些指定的觸發器,然後建立一些規則來定義要對哪些觸發器執行哪些操作(而不是直接呼叫操作,我們將呼叫觸發器; 為這些觸發器定義的規則決定了要執行的操作。 這允許我們將操作鏈結在一起,允許觸發器觸發多個操作的執行,還可以通過將其分配給多個觸發器來重用相同的操作。
觸發器可以單獨觸發,也可以與外部源關聯觸發,例如:
來自 cloudant 資料庫的更改源 - 每次新增、更新或刪除文件時,都會觸發乙個觸發器 GitHub 儲存庫提交源 - 每次提交時,都會觸發乙個觸發器,因此我們可以使用 cloudant 資料庫觸發觸發器,以便將一些資料寫入 Slack:
> wsk trigger create mycloudanttrigger --feed /[email protected]_dev/ mycloudant/changes --param dbname mydb --param includedocs true
然後配置該觸發器以觸發我們的 Slack 發布操作:
> wsk rule create --enable myrule mycloudanttriggerslack
現在,每次在 Cloudant 資料庫中新增、更新或刪除文件時,都會觸發我的自定義操作,在這種情況下,它會向 Slack 發布一條訊息!
OpenWhisk 適用於您不想管理任何基礎設施的專案。 您只需為您所做的工作付費,而不會在閒置的伺服器上浪費金錢。 OpenWhisk 易於管理活動峰值,因為它可以橫向擴充套件以滿足該需求。
將 OpenWHISK 與其他即服務資料庫(如 Cloudant)結合使用,因此您不必管理任何資料儲存基礎設施。 Cloudant 旨在儲存大型資料集、處理高併發率並提供高可用性。
由於執行 OpenWhisk 操作需要資源,因此最好將 OpenWhisk 用於以下不常見的計算任務,例如:
處理上傳的影象以建立縮圖,將它們儲存到物件儲存中,從移動應用程式獲取地理位置資料,並呼叫天氣 API 來增強它OpenWHISK 對於處理具有高併發性的系統也很有用,例如:
在將資料傳送到雲端時,還有一些我沒有涉及的 OpenWHISK 功能,其中資料由移動應用程式儲存和處理,例如 Swift 支援、使用 docker 容器作為操作而不是上傳源的能力,以及移動 SDK。