Serverless Python 開發實戰(附源碼)

  • 2020 年 3 月 18 日
  • 筆記

Python是一種熱門的程式語言,Serverless 是近年來迅速興起的一個技術概念,基於Serverless架構能構建出多種應用場景,適用於各行各業。

本文將為大家詳細講解 Serverless 架構的處理規範與處理模型、典型的工作流程,以及 Serverless 工程化的難點與挑戰。最後將結合 Python Flask + Serverless 的情人節表白頁製作實例,展示如何用 Serverless 的方式進行 Python 編程,將熱門Python 框架利用Serverless 快速上雲。

文章整理自 Serverless Framework 技術專家陳濤在騰訊雲大學的影片分享,感興趣的讀者可以點擊文末【閱讀原文】下載講師PDF

本次分享大綱如下:

1、Serverless的架構規範  2、Serverless的事件與規範  3、Serverless工程化的難點與挑戰  4、使用Python Flask 開發情人節表白頁

一、Serverless 的架構規範

1、Serverless Web 場景處理的典型結構

如果下圖所示,一般的 Web 場景無非通過客戶端,到伺服器,然後伺服器去調用資料庫,這是最常用的一個簡單 Web 場景,那麼 Serverless 把伺服器完全拆解,比如可能會分為兩塊內容,第一塊是鑒權系統,第二塊是 API 網關,其實 API 網關和鑒權系統都算 BaaS 里的東西,最後是 FaaS 就是函數,我們通過函數去調用資料庫來實現普通的 Web 場景的使用。

這裡有一個思考,就是 Serverless 到底為我們做了一些什麼,在這個典型架構中為我們做的就是及時擴容伺服器、程式碼是否健康運行、防止黑客攻擊伺服器等一系列的運維操作。

從下面兩個架構圖中就可以非常粗淺認知 Serverless 其實是有兩個部分:

  • 第一個是 FaaS 就是計算層,這一塊就對應雲函數。
  • 第二個是 BaaS,其中包括 API 網關、身份驗證、對象存儲,還有時間觸發等。

2、Serverless處理模型

事件源通過同步或非同步來調用被調函數,然後 FaaS 做一些平台化的服務,包括身份、數據、鑒權等,這是典型的 FaaS 解決方案示意圖。

從下圖我們可以非常粗淺了解到一個概念調用,函數最關鍵的概念是調用,就是事件源去調用函數,然後來完成我們一系列的操作。

狀態/運行時是在電腦上所描述的運行執行環境,比方說我們平常用的Python、PHP、Node.js 都是有運行時,就是這個函數在運行時間內所做的一些環境的搭建或者處理。

這是我們 Serverless 處理的一個簡單模型,我們在裡面可以知道是有同步或者非同步的調用。

3、Serverless場景典型的工作流程

它有涉及到這個概念,第一個概念是事件狀態,表示允許等待來自事件源的一個事件。第二個是操作/任務狀態,表示這個狀態下允許按照順序或者並行運行一個函數。第三個是切換狀態,它允許切換到多個其他狀態,比方說前一個函數的結果,然後觸發分支,轉換到不同的一個狀態。第四個是停止狀態,用來終止工作流程。

然後讓我們看一下工作流程,他其實是通過我們的一個事件觸發,然後判斷事件狀態,通過事件狀態調用函數。從函數A中拿到結果,然後再到切換狀態,完成後可能會有兩個結果,結果2、結果3,這是 Function 的結果,其實是調取的 Function 的前一個函數的事件或者是前一個函數的數值,然後再去做操作任務,最後來到 FunctionB 或者 FunctionC,這個流程就結束了。這是我們典型的事件狀態,包括函數調用的一個工作流程。

4、Serverless 函數架構規範

現在我們來看一下 Serverless 的底層的 FaaS 函數、調用模型如何定義,包括約束。

首先看函數定義,下圖表示比較清楚。函數定義是包括幾個概念,第一個概念是 ID,這很好理解,名稱、標籤、版本 ID,其實剛剛所講的運行時,也是函數定義裡面的;還有函數處理的一個程式,就是函數所拿到的事件去做一些處理;以及裡面所包括的程式碼,還有包括依賴,比方說我們今天所有有英文的實踐,可能就需要去用依賴,然後統一上傳到函數,以及環境變數。

元數據詳情,有幾個概念,第一個是版本的概念,第二個是環境變數,第三個是執行角色,第四個是資源,第五個是超時,其實元數據詳情這裡面的一些都是最基礎、可能最常用的一些數據詳情的結構。

第三點數據綁定,其實是一些無伺服器框架允許用戶去指定函數使用的輸入輸出的一些數據資源。這樣就可以讓開發人員去幫助函數資源的簡化,來提高性能來獲取更好的安全性,當然作為開發者來講,並不是很關鍵。

函數約束,是代表運行Serverless函數時滿足的通用的條件,比方說我們的函數必須與不同的事件類的底層來實現分離,是很基礎的一些東西,包括每次調用的方法,不需要不同的函數,就意思說,我們的函數其實它是可復用的,以及事件源是可以去調用多個函數,這些是函數的約束,還有包括它的特性。

函數調用類型,函數調用分四種,第一種是同步請求,第二種是非同步請求,第三種是資訊流,或者叫記錄流,第四種是批量作業。

同步請求很好理解,就比方APP請求,GIPC的調用,它代表客戶端發出的一個請求等待並立即響應,包括我們這次的實踐,所用的方式也就是同步請求。

非同步請求,非同步請求就有很多,就比方說在SF上看到的觸發、MQTT的觸發、電子郵件,還有cos更改的命令觸發,以及計劃事件,比方說用我們的時間觸發器,去寫一個時間,自動觸發任務,這都叫非同步消息隊列請求。

二、Serverless 的事件與規範

什麼是 Severless 的事件,然後是怎麼去定義的,我覺得這是所需要知道的一個重點。

1、什麼是 CloudEvents?

CloudEvents 是一個規範,它是由先 CSF 提出的規範,主要是以通用的格式來描述事件數據以提供跨服務、跨平台、跨系統的交互能力,我們可以去 CloudEvents 的 GitHub 主頁去看關於 FaaS 的詳的事件,包括事件規範。比較重要的一點就是他的所有實現都必須要支援 JSON 格式,這也是 FaaS 和其他不太相同的一個地方。

2、什麼是事件?

事件其實無處不在,每個事件源所產生的事件都各不相同,所以這對於開發者來說需要不斷的去重複學習如何消費不同類型的事件。就比方說可能騰訊雲 CMQ 產生的事件,還有 API 網關的產生的事件或其他廠商的事件,是不太一樣的,就可能一些入參、出參值都是不太一樣的。

不同廠商的 API 網關的觸發器,它所產生的事件也可能不是很相同的,這可以在 SLF 裡面去驗證一下,我也給到騰訊雲的事件的一些基礎參考。但是事件是基於觸發,觸發器達到某項特定事件之後,去入參給 FaaS 層,雲函數去做一些操作。

3、必須的事件屬性。

這其實也是 SCF 的一個統一的管理委員會去制定的一個必須的事件屬性,比方說第一個很簡單,就是 ID,所有的事件都是需要有個 ID 來幫助我們進行事件的查詢,還有包括事件的一些處理,以及識別事件所發生的上下文,這塊很簡單,就是入參和傳參。

還包括事件所使用的該版本的 CloudEvents 的規範,這塊可以去騰訊雲官網參考一下這塊的一些屬性。以及發生相關事件的類型值,還有 Data 的數據內容格式,以及事件上下文主題,發生事件的時間節點。

我還想在這裡為家補充的幾個點就是事件也是有分類的,大致可以分為幾類:

  • 第一類,是事件、消息服務,這塊內容就很多,比方說 MPL、MQTT。
  • 第二類是存儲服務,很簡單,就比方說 COS。
  • 第三類是端點服務,比方說物聯網、ATP 網關、移動設備。
  • 第四類是配置資料庫,比方說地圖就是一種配置資料庫。
  • 第五類是使用特定語言去做的一些 SDK 的用戶程式,這也算作事件源。
  • 第六類是計劃事件,可以具象的說計劃事件其實就是訂製觸發,就是定期去啟用函數的一個功能。

雖然我們每個事件所提供的數據,其實在不同事件源之間都是有不同的,但事件的結構應該是通用的,所以我們能夠分裝關於事件的一些特定的資訊。

三、Serverless工程化的難點與挑戰

說到Serverless工程化的難點、挑戰,這塊我其實都沒怎麼寫,就直接在百度上一搜,這東西其實大家都可以搜到的,所以我也不給大家多講,我需要講的是面對Serverless工程化的難點,我們需要做什麼以及怎麼去做,或者是有沒有什麼工具或者方式,去攻克這些難點。

第一點:長時間問題

在FaaS層,因為它就是通過事件觸發,或者是有一個運行時的概念或者是用完即走的概念,所以說不太適合在長時間去運行應用。這其實是不可否認的,但是我們有一個方案,是ServerlessFramework下的一個component,我們其實是有一定的方案去解決長時間運行運用的難點,但怎麼說我還是不建議大家用FaaS去做長時間,這是我的非常固執的一個觀點,但我們是有解決方案的。

第二點:完全依賴於第三方服務

其實說到底我們 Serverless 其實就是免運維,所以說依賴於升第三方服務的時候,第三方是可以提供我們一站式的解決方案。

意思就是說,我覺得依賴於第三方其實是一件好事,因為它可以幫助我們去做一些監控、負載均衡、業務集群,最關鍵的是彈性的擴縮容,並且可以幫助我們免運維,所以我覺得完全依賴於第三方,其實這不應該是他的一個缺點,應該算作一個優勢,尤其在雲原生的時代,他其實是我們的一個優勢。

第三點:冷啟動的時間

因為我們的函數在你運行的時候,才會啟動,所以說不是你啟完之後一直都是在線的,Serverless是只有你在運行就是有事件觸發的時候,才會去調用函數,去做計算的運行,導致一個冷啟動時間會特別長。

但這塊其實我做了一個測試,這個其實是有關於雲廠商的優化的建議,我測了騰訊雲還有包括中國的A廠商、B廠商,其實在我的測試中會發現,其實騰訊雲的耗時是最短的,我可以給大家共享出這塊測試的程式碼,然後大家可以自己去在同區域,同網路環境,同配置下去跑冷啟動的時間,其實騰訊雲在其他廠商中相比來說,它的冷啟動時間最短。

其次冷啟動時間有什麼解決方案,基本解決方案主要就兩大塊。

  • 第一塊就是復用,可以使用容器的一些復用技術。
  • 第二塊是預熱,可以去做一些預創建,熱門程式碼的快取、網路優化,預啟動來做一些預熱解決冷啟動

這塊的話我其實還是建議大家就是不要過分關於論啟動的基本方案,因為基本方案其實是雲廠商一直在做的一些優化點。所以說大家盡量不要去糾結於這種特別底層的技術實現。

第四點:缺乏調試和開發工具

其實我們最近出了一個特別好用的工具,推出了 Serverless Framework 是可以貫穿到我們整體的 Serverless 應用的生命周期,有包括我們非常健全的開發部署環節的。

測試環節的測試監控,還包括安全環節的,以及 debug 的時候所用到的一些的debug方案,還有包括一些具體的的debug的一個解決實現,還有包括詳細的Dashboard,最後還包括審計、操作記錄、告警資訊、團隊協作。

他其實是貫穿了整體的Serverless的一個整合應用生命周期,所以這塊的調試工具,還有開發工具其實是很好解決的事情。

第五點:語言版本的落後

反正我是可以看到基本上主流的版本,比方說 Python2.7、Python3.6,還有Node.js8.9,包括 PHP 這些常用的新的穩定的原版本,其實都是有在支援我們的 runtime。

當然這塊的話,有的同學可能就會問到一個點,就是很尷尬一點,比方說你Python雖然 3.6 但現在 Python 都已經到 3.8,你為什麼不用?這個我的觀點就是並不是所有語言的語言版本越高越好,我覺得這點還是需要去尋求一個穩定,意思就是說我們需要去找到一個長期維護,並且穩定的版本,然後再給大家去用。

我舉個比較簡單的例子,就是PHP7.0的時候出了N多個bug,可能達到了7.17.2之後,這些東西才漸漸地穩定下來,這些新特性才有人去用,我是這麼看待語言版本落後的問題。

然後我們來看一下有哪些人在用 Serverless 的架構,就如下圖所示,基本上現有的主流的一些互聯網公司,它其實都是在有用 Serverless 架構,其實Serverless 架構也是勢在必行。所以我覺得開發者一定是要懂得並且學習Serverless的架構才能在我們的行業中有一定的競爭力,我是保持我這個觀點的。

最後就是 Serverless 的架構應用。我們現在和 Framework 推出了很多的 Component,你也可以成為我們開源社區的貢獻者,可以去直接去搜Serverless 官方網站,在最底下訂閱我們的公眾號,假如你有問題的話也可以將問題提交給小助手,我們會有專門的一些工作人員為大家去做一些更多詳細的解答。

實戰:Python+Serverless 開發情人節表白頁

然後那麼最後我們來去看一下 Python+Serverless 怎麼去開發情人節表白頁。

1. 安裝

  • 通過 npm 安裝 serverless
$ npm install -g serverless

2. 創建

  • 本地創建 serverless.yml 文件:
$ touch serverless.yml
  • 初始化一個新的 npm 包,並安裝 Express:
npm init              # 創建後持續回車  npm i --save express  # 安裝express
  • 創建一個 app.js文件,並在其中創建您的 Express App:
const express = require('express')  const app = express()    app.get('/', function(req, res) {    res.send('Hello Express')  })    // don't forget to export!  module.exports = app

3. 配置

  • 在 serverless.yml 中進行如下配置
# serverless.yml    express:    component: '@serverless/tencent-express'    inputs:      region: ap-shanghai

4. 部署

  • 通過sls命令進行部署,並可以添加--debug參數查看部署過程中的資訊
$ sls --debug      DEBUG ─ Resolving the template's static variables.    DEBUG ─ Collecting components from the template.    DEBUG ─ Downloading any NPM components found in the template.    DEBUG ─ Analyzing the template's components dependencies.    DEBUG ─ Creating the template's components graph.    DEBUG ─ Syncing template state.    DEBUG ─ Executing the template's components graph.    DEBUG ─ Compressing function ExpressComponent_7xRrrd file to /Users/dfounderliu/Desktop/temp/code/.serverless/ExpressComponent_7xRrrd.zip.    DEBUG ─ Compressed function ExpressComponent_7xRrrd file successful    DEBUG ─ Uploading service package to cos[sls-cloudfunction-ap-shanghai-code]. sls-cloudfunction-default-ExpressComponent_7xRrrd-1572512568.zip    DEBUG ─ Uploaded package successful /Users/dfounderliu/Desktop/temp/code/.serverless/ExpressComponent_7xRrrd.zip    DEBUG ─ Creating function ExpressComponent_7xRrrd    DEBUG ─ Created function ExpressComponent_7xRrrd successful    DEBUG ─ Starting API-Gateway deployment with name express.TencentApiGateway in the ap-shanghai region    DEBUG ─ Using last time deploy service id service-n0vs2ohb    DEBUG ─ Updating service with serviceId service-n0vs2ohb.    DEBUG ─ Endpoint ANY / already exists with id api-9z60urs4.    DEBUG ─ Updating api with api id api-9z60urs4.    DEBUG ─ Service with id api-9z60urs4 updated.    DEBUG ─ Deploying service with id service-n0vs2ohb.    DEBUG ─ Deployment successful for the api named express.TencentApiGateway in the ap-shanghai region.      express:      region:              ap-shanghai      functionName:        ExpressComponent_7xRrrd      apiGatewayServiceId: service-n0vs2ohb      url:                 http://service-n0vs2ohb-1300415943.ap-shanghai.apigateway.myqcloud.com/release/      36s › express › done

部署完畢後,可以在瀏覽器中訪問返回的鏈接,看到對應的express返回值。

實踐相關源碼:

https://docs.qq.com/doc/DVURnWFp3SFNGd3N

Serverless Framework 免費試用計劃

Serverless Framework 免費試用名額已開放,我們誠邀您來試用和體驗最便捷的 Serverless 開發和部署方式。包括服務中使用到雲函數 SCF、API 網關、對象存儲 COS 等產品,均在試用期內提供免費資源,並伴有專業的技術支援,幫助您的業務快速、便捷實現 Serverless !

Serverless Framework 落地 Serverless 架構的全雲端開發閉環體驗,覆蓋編碼、運維、調試、部署等開發全生命周期。使用 Serverless Framework 即可在幾秒鐘內將業務部署至雲端。

詳情可查閱:https://cloud.tencent.com/document/product/1154/38792