您好,登錄后才能下訂單哦!
<a name="1"></a>
首先介紹下在本文出現的幾個比較重要的概念:
函數計算(Function Compute): 函數計算是一個事件驅動的服務,通過函數計算,用戶無需管理服務器等運行情況,只需編寫代碼并上傳。函數計算準備計算資源,并以彈性伸縮的方式運行用戶代碼,而用戶只需根據實際代碼運行所消耗的資源進行付費。函數計算更多信息 參考。
Fun: Fun 是一個用于支持 Serverless 應用部署的工具,能幫助您便捷地管理函數計算、API 網關、日志服務等資源。它通過一個資源配置文件(template.yml),協助您進行開發、構建、部署操作。Fun 的更多文檔 參考。
NAS: 阿里云文件存儲NAS是一個可共享訪問,彈性擴展,高可靠,高性能的分布式文件系統。在函數計算的場景中,由于其有代碼包的限制,可以使用 NAS 存放一些不經常變動的文件,比如數據模型、靜態資源等。參考。
ROS: 阿里云資源編排服務(ROS)助您簡化云計算資源的管理。您可以遵循ROS定義的模板規范,在模板中定義所需云計算資源的集合及資源間依賴關系。ROS自動完成所有資源的創建和配置,實現自動化部署和運維。更多文檔參考。
備注: 本文介紹的技巧需要 Fun 版本大于等于 3.4.0。
基本上所有的 faas 平臺為了優化函數的冷啟動,都會加入代碼包的限制。阿里云函數計算(FC)也不例外。FC 要求壓縮后的代碼包大小不超過 50MB。由于用戶的函數代碼可能需要大量的依賴庫,所以代碼包很容易達到函數計算設定的閾值。
<a name="N8vb4"></a>
基于平臺硬性要求下,依然有很多途徑來解決函數計算上傳代碼包大小受限的問題。下面列舉 3 種常見的解決方案。 備注: 包括不局限于以下方案。
<a name="8fMeA"></a>
提交函數計算工單,由后臺人員為您賬號開通上傳限制白名單。但提交工單依然有代碼包的限制。部署時代碼包上傳時間長,并且也增加了函數的冷啟動時間,影響函數性能。PS:通過使用預留模式可以完全去除冷啟動,由于超出本文范圍,這里不再闡述。
<a name="NoH42"></a>
對代碼包進行分類,除項目代碼和少量依賴庫可以在創建函數時上傳到函數計算,用戶將部分依賴庫預先上傳到 OSS,并在函數被觸發執行時開始從 OSS 上加載依賴, 這類依賴的加載操作均可定義應用層冷啟動,當加載依賴結束后,應用層冷啟動才結束,函數的處理邏輯才開始執行,應用層冷啟動的開銷往往會導致毛刺的產生,影響函數的性能。您可以將從 OSS 加載代碼包的代碼邏輯放在 initializer 函數中。既可以解決函數計算對上傳代碼包的限制問題,又不影響函數的性能。但需要用戶進行額外的操作。參考使用 initializer 接口解決函數計算上傳代碼包大小受限問題。
<a name="7YbXE"></a>
我們通過 NAS 存放一些體積比較大且不易變動的資源。這使得即使在依賴比較大的場景下依舊適用。NAS 在幫助函數計算解決大依賴問題的同時,由于其自身的配置也比較復雜,也增加了函數計算的使用難度。如何管理 Nas 資源、上傳本地資源到Nas 以及服務級別的 Nas 相關配置參考開發函數計算的正確姿勢 —— 使用 Fun NAS 管理 NAS 資源。
本文旨在介紹第四種方式 -- 使用 Fun 工具來解決函數計算對上傳代碼包的限制,使得部署步驟簡單明了,不需關心額外的配置。同時也展現 Fun 工具對大依賴場景的順滑體驗,Let's go!
注:已經獲得 fc 支持的 runtime 有 nodejs6,nodejs8,nodejs10,python2.7,python3,java8,php7.2,dotnetcore2.1,custom。目前基于所有 fc 支持的 runtime,大依賴場景下除 php7.2 和?dotnetcore2.1 其他都支持。
<a name="qev38"></a>
Fun 安裝教程 可以直接在這里下載二進制版本的 Fun,解壓后即可使用。<br />執行 fun --version
檢查 Fun 是否安裝成功。
$ fun --version
3.4.0
<a name="5Qjsm"></a>
fun install 是 fun 工具的一個子命令,用于安裝 pip,apt 依賴等,提供了命令行接口和 Funfile 描述文件兩種形式。對于 fun install 安裝的依賴,當 fun deploy 部署時會自動處理大依賴。
當 Fun 檢測打包的代碼壓縮后超過限制(50M),會根據對應的 runtime 分離大依賴和代碼。Fun 會將大依賴目錄分為:系統依賴和語言依賴。系統依賴的本地路徑為 .fun/root
,語言依賴根據函數 runtime 得到,各個 runtime 對應的大依賴目錄映射如下:
語言(runtime) | 大依賴目錄(directory) |
---|---|
nodejs6 | node_modules |
nodejs8 | node_modules |
nodejs10 | node_modules |
python2.7 | .fun/python |
python3 | .fun/python |
java8 | .fun/build/artifacts |
custom | / |
自定義執行環境 custom?大依賴目錄為 /
,可以理解為其他 runtime 大依賴目錄的合集。例如:函數 runtime 為 custom,若目錄下存在 node_modules
或 .fun/python
等,Fun 在部署向導過程中會把它們都認定為大依賴,會分別對其處理。
<a name="z0lAH"></a>
函數計算的命令行工具 Fun 現在原生支持了這種大依賴部署,不需要任何額外操作。僅僅執行 fun deploy
:
$ fun deploy
整體流程如下圖所示:
cdn.nlark.com/yuque/0/2020/png/502931/1579052914872-bf485f36-5771-4075-a764-5d8497624536.png">
fun deploy
會自動完成依賴的部署。而當檢測到打包的函數目錄超過了平臺的限制時,會進入到配置向導,幫助用戶自動化地配置。即上圖可以理解為:Fun 通過內置 NAS(阿里云文件存儲)解決方案,可以一鍵幫用戶創建、配置 NAS,并上傳依賴到 NAS 上。而函數計算在運行時,可以自動從 NAS 讀取到函數依賴。
<a name="ywydr"></a>
大依賴向導部分截圖如下:
Fun 部署當前函數時,檢測到壓縮后(.zip)依賴超過了 50M,提示配置向導(后續日志省略...)。只需要輸入回車或 yes 即可。最后 Fun 會自動完成配置,成功部署資源到函數計算。
<a name="si7tS"></a>
fun deploy
大依賴向導完成后,函數會部署到函數計算并對外提供服務。此時大依賴和代碼通過 NAS 進行了分離,再次部署時打包本地代碼目錄時由于沒有了大依賴,所以部署速度會非常的快。
這里推薦一篇使用 fun deploy
進行大依賴部署的實戰案例,展示了 Fun 工具對大依賴場景的順滑體驗Serverless 實戰 —— 快速開發一個分布式 Puppeteer 網頁截圖服務。
<a name="YgNwx"></a>
Fun Package 是用來將代碼、編譯產物、靜態資源等本地資源上傳到 OSS 的功能。使用 fun Package
的場景,通常是,想僅僅通過一個模板文件進行部署的場景。比如,本地開發完成后,可以通過 fun package
,將模板依賴的本地資源上傳到 OSS,這樣,無論是在其他服務器上部署,還是使用 ROS 部署時,僅僅通過一個文本格式的模板文件,就可以完成了。推薦閱讀?Fun Package 功能介紹。
<a name="Pt08i"></a>
流程如下圖所示:
通過 Fun Package 可以將模板文件包含的本地資源一鍵上傳到 OSS 上,完成資源的打包操作。
<a name="bVFso"></a>
將打包后的模板文件(template.packaged.yml)與原文件相比較,可以發現,差異僅僅在使用了本地資源的場景,比如:
- CodeUri: './'
+ CodeUri: 'oss://bucket/PackageDemo/function/39ce6e9109a23d313bc267b1a5211273'
<a name="udyp8"></a>
流程如下圖所示:
當遇到打包的函數體積過大時,同樣會進入大依賴向導,Fun 內置 Ros 的解決方案,幫你完成自動配置。同時 Fun 會分開大依賴和代碼并分別上傳到 OSS。這樣做的目的下文中會有提到。
<a name="0zA7R"></a>
大依賴場景下打包完成后生成的 template.packaged.yml 模版文件會與非大依賴場景下有所不同,除上述?CodeUri 的差異外,還會新增許多資源描述作為使用 Ros 部署時的前置條件,例如 NasCpFunc ,?這里只介紹一種,其它不做贅述。
NasCpFunc:
Type: 'Aliyun::Serverless::Function'
Properties:
Handler: index.cpFromOssToNasHandler
Runtime: nodejs8
CodeUri: 'oss://ellison-hongkong/9e610f5540e21ace83d5b742241da6aa'
MemorySize: 3072
Timeout: 300
NasCpFunc?為大依賴場景下 Fun 為用戶內置的資源函數,可以將它理解為一個輔助函數。當用 Ros 方式部署時,將自動執行輔助函數。它用于實現從 OSS 上下載大依賴(.zip)以及解壓到 Nas 的功能。這也就是為什么上述 fun pakckage 打包時,要將大依賴和代碼分離開并分別上傳到 OSS 的原因。
<a name="t4I4T"></a>
Serverless 實戰——使用 Rendertron 搭建 Headless Chrome 渲染解決方案使用 Rendertron + 函數計算快速搭建一個可以直接用于生產的 Headless Chrome 渲染解決方案,以便于幫助網站更好的進行 SEO。基于文章,我們將升級文章中一鍵部署的體驗。您可以參照上述文章中步驟,其中依賴安裝,項目編譯等均無需額外操作。
Rendertron 項目代碼依賴過大,基于 Fun 工具對大依賴項目的支持,現將其原 Fun deploy 部署改造為 Fun Packge + Ros 部署方式。Fun package 自動處理大依賴上傳到 OSS,Ros 部署將大依賴從 OSS 解壓到 Nas,同時模版中描述的資源自動創建成功。基于函數計算,項目的服務架構如下:<br />
<a name="ZXmNH"></a>
按照 RenderTron 文章中步驟操作,在一鍵部署前,執行 fun package 命令:
fun package --oss-bucket aliyun-ellison
這里的 --oss-bucket
名稱為自己所擁有讀寫權限的 OSS 的 Bucket 名稱。完整日志如下:
<a name="pkGW8"></a>
ROS 通過 Transform 宏實現了將函數計算的模板語法轉換為 ROS 支持的語法。這意味著對于?Fun 規范文檔?里描述的語法規則,ROS 是同樣支持的。同時,ROS 支持的資源?也能在 Fun 模板文件中進行聲明了,比如 RAM、函數工作流?等等。
在體驗上,由于 ROS 部署,要求資源必須“云化”。也就是沒辦法直接使用本地的代碼資源。必須先通過 fun package 命令將資源上傳到 oss。
可見這一步我們已經完成,不管是大依賴場景還是非大依賴場景,fun package 打包完成后,后續的部署操作,只需要完全基于這個打包后的模板文件(template.packaged.yml)即可。不再依賴本地的代碼等資源,可以簡化部署的難度。
最后將資源通過 ROS 的方式進行部署,推薦閱讀開發函數計算的正確姿勢 —— 使用 ROS 進行資源編排。
fun deploy --use-ros --stack-name bucket-name
--stack-name
表示要部署的環境,可以基于該名稱的不同,建立多套開發環境,比如 test、staging、prod。
<a name="JRgPa"></a>
可通過上述 RenderTron 文章中提到的方式驗證,這里不做贅述。
<a name="CAKEQ"></a>
<a name="h6aa3"></a>
Fun 支持大依賴的場景是函數級別的,即當打包某一函數時發現超過限制才會進入向導。當兩個函數處于相同 runtime 和 codeUri,Fun 會在結束第一次向導時,同時自動配置第二個函數,確保部署后,兩個函數都部署成功且可用。
<a name="Oamlf"></a>
不會。如果添加了新的依賴,比如 node_modules 目錄添加了新的依賴庫,需要在 template.yml 模版文件所在目錄執行 fun nas sync,將本地 nas 資源同步到 nas 服務。如果修改了代碼,只需要使用 fun deploy 重新部署即可。由于大依賴和代碼通過 NAS 進行了分離,依賴通常不需要頻繁變化,所以調用的頻率比較低,而 fun deploy 的由于沒有了大依賴,部署速度也會非常的快。
<a name="RAvOJ"></a>
在很多場景,編譯型語言從源碼距離交付物其實是有一定的距離,比如 java,寫完 java 代碼后,還要考慮如何編譯、打包的問題。Fun build 的職責就是完成從源碼到交付產物的構建過程,推薦閱讀?《開發函數計算的正確姿勢 —— 使用 Fun Build 構建函數》。<br />Fun build 會將編譯打包后的交付產物 copy 到?.fun/build/artifacts 目錄,在部署時檢測到代碼大小超過限制,自然會去?.fun/build/artifacts
下查找對應 serviceName/functionName
目錄,并將所有的 jar 包上傳到 Nas。所以 Fun 大依賴部署支持 java8 是以 Fun build 的場景為基礎。未來 Fun 會集成更多的解決方案,敬請期待!
Fun 通過內置 NAS(阿里云文件存儲)解決方案,可以一鍵幫用戶創建、配置 NAS,并上傳依賴到 NAS 上。而函數計算在運行時,可以自動從 NAS 讀取到函數依賴。同時也展現 Fun 工具對大依賴場景的順滑體驗。
如果大家在使用 Fun 的過程中遇到了一些問題,可以在 github 上提 issue,或者加入我們的釘釘群 11721331 進行反饋。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。