共計 3426 個字符,預計需要花費 9 分鐘才能閱讀完成。
本篇文章給大家分享的是有關 Serverless 函數計算的開發與配置是怎樣的,丸趣 TV 小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著丸趣 TV 小編一起來看看吧。
基本概念 1. 服務
服務是函數計算資源管理的單位,同一個服務下有很多函數,這些函數共享服務的網絡配置、權限配置、存儲配置、日志配置。
服務可以對應成一個“應用”,這個應用由很多函數共同組成,這些函數具有相同的訪問權限、網絡配置,日志也記錄到相同的 logstore。這些函數本身的配置可以各不相同,比如同一服務下有的函數內存是 3G,有的函數內存是 512M,有些函數用 Python 寫,有些函數用 Node.js 寫。
當然,如果應用比較復雜,同一個應用也可以對應多個服務,這里沒有強綁定關系。
1)服務配置
服務的幾個核心配置:
** 日志配置:** 開發者的代碼在函數計算平臺運行,如何查看函數運行產生的日志呢?在 Server 化的開發方式中,日志都打到統一的文件中,通過 Logstash/Fluentd 這種日志收集工具收集到 ElasticSearch 中,并通過 Kibana 這種可視化工具查看日志及指標。但是在函數計算中,運行代碼的機器由函數計算動態分配,開發者無法自己收集日志,函數計算需要幫助開發者投遞日志。日志配置就是起到這個作用,配置 LogConfig 設置日志服務的 Project 和 Logstore,函數計算會將函數運行中產生的日志投遞到開發者的 Logstore 里。
但是為了成功投遞日志,單單配置 Logtore 還不夠,函數計算是沒有權限向開發者的 Logstore 投遞日志的,需要用戶授予函數計算向指定的 Logstore 寫數據的權限,有了這個授權后,函數計算就可以名正言順地向開發者的 Logstore 投遞日志了。
** 文件存儲配置:** 函數計算中每個函數都是獨立的,在不同的執行環境中執行,如果用戶有一些公共文件希望多個函數共享怎么辦呢?在傳統 Server 化的開發方式中,好辦,將公共文件放到磁盤就好了,各個都去磁盤的同一位置讀取,函數計算中的機器是函數計算動態分配的,開發者無法事先將文件存入磁盤,那怎么辦呢?可以掛載 NAS,在服務中掛載 NAS 后,函數就可以像訪問本地文件系統一樣訪問 NAS 上的文件了。
** 網絡配置:** 網絡配置顧名思義就是設置函數的網絡訪問能力,主要有兩種,一個是函數中是否可以訪問公網,這是個布爾型的開關,默認是開啟的,如果不需要訪問公網可以關閉開關。另一個是函數是否可以訪問指定 VPC,VPC 是專有網絡,專有網絡內的數據比較機密,是不能通過公共互聯網訪問的。如果需要函數訪問 VPC 內的資源,比如函數需要訪問 VPC 內的 RDS,那就需要授予函數計算訪問指定 VPC 的能力,原理是用戶授權賦予彈性網卡 ENI 訪問 VPC,并將此 ENI 插入到 FC 中執行用戶函數的機器上,從而使函數可以訪問 VPC 內資源。
** 權限:** 函數計算是云原生的架構,與云上許多服務產生交互,阿里云有非常嚴格的權限限制,函數計算是沒有能力訪問開發者的其他云資源的,當開發者需要函數計算訪問其他云服務的時候就需要顯示授予函數計算權限。
權限主要有兩個應用場景:一個是授予函數計算訪問其他服務的權限,比如剛才提到的授權函數計算訪問開發者的日志服務、授權函數計算創建 ENI。另一個是授權函數可以訪問開發者的云資源,這個是什么呢?舉個例子,函數中需要訪問 OSS 獲取對象,但是又不想暴露 AK,那怎么辦呢?開發者可以配置服務中的 Role 有訪問 OSS 的權限,函數執行過程中,函數計算會 assumeRole 生成一個臨時 AK,并將這個 AK 存儲到函數的上下文 context.credentials 里,開發者在代碼中使用 context.credentials.access_key_id/context.credentials.access_key_secret/context.credentials.security_token 去創建 OSS Client 就可以了。
2. 函數
“函數計算”中函數可謂是核心概念,函數是管理、運行的基本單元,一個函數通常由一系列配置與可運行代碼包組成。
1)函數配置
函數的配置如上圖所示:
Runtime 是函數運行時的環境類型:函數計算目前支持 Node.js/Python/Java/C#/PHP 等開發環境,同時也支持 Custom Runtime 自定義運行時;
Code 是函數代碼包:函數計算的后端是只認代碼包的,各個開發工具會自動幫您打包。比如您可以直接在控制臺上編寫代碼,控制臺會自動為您打包創建 / 更新函數,您可以在本地編寫 / 調試函數,通過命令行工具 Funcraft 部署到函數計算,Funcraft 也會幫您打包;
Handler 是入口函數:您在代碼包中寫了好多函數,那函數計算到底從哪里開始執行呢,就從您指定的入口函數開始執行;
Timeout 是函數超時時間:如果函數執行超過這個時間,函數會被強制停止執行;
MemorySize 是為函數分配的執行環境內存:目前取值范圍是 128M~3G,如果函數耗用內存超過分配的內存,會 OOM;
Initializer 是初始化函數:有什么用呢?之前我們介紹函數計算執行環境的時候講到,函數計算會為函數分配執行環境,第一次分配的時候會有冷啟動,當前請求執行完成后,函數計算也不會立即釋放,如果在一段時間內有新的請求到達會復用這個執行環境。Initializer 中的邏輯會在分配執行環境后執行,且保證同一個執行環境執行且只執行一次,那就可以將一些建立連接、加載依賴等耗時的操作放到 Initializer 函數中執行;
InitializerTimeout 就是 Initializer 函數的最大運行時間。
3. 觸發器
往期課程中介紹了函數計算支持的豐富的事件源類型,在事件驅動的計算模型中,事件源是事件的生產者,函數是事件的處理者,觸發器提供了一種集中、統一的方式來管理不同的事件源。當事件發生時,如果滿足觸發器定義的規則,事件源會自動調用觸發器所對應的函數。
典型的使用場景包括對上傳至 OSS 中的對象進行處理,比如圖像處理、音視頻轉碼、OSS zip 包解壓,以及對 SLS 中的日志進行清洗、處理、轉存,在指定時間觸發函數執行等等。
4. 版本 別名
上文介紹了服務、函數、觸發器,開發者就可以基于函數計算將應用搭建起來了,但又有一個新問題:** 開發者有了新需求需要更新代碼,如何保證線上應用不受影響,平滑迭代上線呢?** 為了解決這個問題,函數計算引入了版本和別名。
版本相當于服務的快照,包括服務的配置、服務內的函數代碼及函數配置。當您開發和測試完成后,就發布一個版本,版本單調遞增,版本發布后,已發布的版本不能更改,您可以繼續在 Latest 版本上開發測試,不會影響已發布的版本。調用函數時,只需要指定版本就可以調用指定版本的函數。
那新問題又來了,版本名稱是函數計算指定的單調遞增的,每次發布版本,都會有一個新的版本,** 那每次發完版本后,客戶端還要改代碼執行最新的版本嗎?** 為了解決這個問題呢,我們引入了別名,別名就是指向特定服務版本的指針,發布后,只需要將別名指向發布的版本,再次發布后,再切換別名指向最新的版本,客戶端只需要指定別名就可以保證調用線上最新的代碼。同時別名支持灰度發布的功能,即有 10% 的流量指向最新版本,90% 理論指向老版本。回滾也非常簡單,只需要將別名指向之前的版本即可快速完成回滾。
開發流程
如上圖所示,開發者首先創建服務,設置日志、權限等配置,然后創建函數,在當前版本(Latest 版本)下編寫代碼開發函數,測試通過后發布版本,第一次發布的版本為版本 1,創建別名 prod 指向版本 1,就可以對外提供服務了。
客戶端調用函數的日志會記錄在開發者配置的 Logstore 里,函數計算提供完備的監控圖表,應用上線后,開發者可以通過監控圖表和日志查看應用的健康狀況。
當開發者有新需求時,繼續在 Latest 版本更改代碼開發函數,測試通過后發布版本,這次發布的版本為版本 2,切換別名流量 10% 到版本 2,即可實現應用的灰度發布,觀察一段時間沒有問題,就可以切換 100% 的流量到版本 2 了。
以上就是 Serverless 函數計算的開發與配置是怎樣的,丸趣 TV 小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注丸趣 TV 行業資訊頻道。