阿里雲函數計算- 調研

https://yq.aliyun.com/articles/743665javascript


_2020_02_05_12_12_40

前言

本文以一個Nodejs前端開發者角度出發,體驗了函數計算開發生態流程與功能,以及閱讀了官方生態文檔和視頻後的總結梳理。但願對想快速創建阿里雲函數計算全局觀 的小夥伴有所幫助。html

官方產品主頁:https://www.aliyun.com/product/fc
官方文檔:https://help.aliyun.com/document_detail/52895.html
控制檯:https://fc.console.aliyun.com/

前端

總體

利用 (控制檯可視化界面、CLI工具) 經過模板快速生成規範化的工程、函數
利用 開發者生態工具(Vscode插件、Fun、Fcli、WebIDE、SDK、OpenAPI)來開發、測試、上線
利用 (控制檯可視化界面),進行高級配置:超時時間、併發度、內存大小、自定義域名、灰度版本管理、預留資源

java

主要概念

區域

region這個概念阿里雲上資源都涉及到,即你購買的服務部署的集羣地域。不一樣產品支持的集羣region可能有些不一樣,不一樣region他們有時候會有必定的服務訪問網絡限制、域名備案要求等。我這裏選擇好比選擇 華東1(杭州)node

服務

函數是掛載在服務下
一個大型應用拆成多個服務,每一個服務是一個業務工程,一個服務工程下有多個函數。
函數計算,以函數爲單位管理開發,經過配置將流量路由到對應服務對應函數下

c++

Path 服務名 函數名
/* s2 f2
/login s3 f3
/login/a s4 s4
/login/* s5 f5

函數

做爲業務邏輯執行處理的入口,有兩類須要區別git

  • 普通函數,由觸發器觸發
// event 觸發器調用傳遞的事件數據
// context 執行上下文相關配置,如服務配置、函數配置
// callback 遵循nodejs異步處理標準,第一個參數異常
exports.handler = function(event, context, callback) {
  callback(null, 'hello world');
};
  • HTTP函數,有http觸發器 觸發的函數,其入口參數比較特殊,但也是咱們最經常使用的
// req 阿里雲函數計算規範,請求request結構體
// res 返回response 結構體
// context 同普通函數接口的 context 接口相同
 exports.handler = function (req, res, context) {
   res.send('hello world')
 }
  • 初始化入口函數,這是一個特殊的入口函數,爲何有時須要這麼個函數:好比建立mongo數據庫鏈接,能夠在這個初始化函數中啓動,不須要每一個請求進來才進行檢查,建立鏈接,加快函數冷啓動時間,也更好管理代碼
// context 同普通函數接口的 context 接口相同
exports.initializer = function(context, callback) {
  callback(null, '');
};

觸發器

在事件驅動的計算模型中,函數基於事件觸發執行。
常見的觸發器:
github

  • 定時觸發器
  • OSS事件觸發器(文件存儲
  • CDN 回源事件觸發器
  • API 網關觸發器
  • 經常使用的HTTP 觸發器

故建立的普通函數,須要配置對應的觸發器,經過觸發器事件來觸發函數的執行。
這裏由於觸發事件後,函數執行有兩種狀況
web

  • 函數同步調用:事件被函數處理後直接將結果返回。如:http觸發器、使用控制檯調用
  • 函數異步調用:事件在寫入到消息隊列後則返回。如:定時任務、 OSS 事件觸發器

開發者工具

最爲開發者一開始上來工具太多了,有些不知如何下手。控制檯可視化界面 + Vscode插件 應該就可以知足大大部分開發者的需求了, 這裏就上面工具一一介紹下docker

1. 控制檯可視化界面

地址:https://fc.console.aliyun.com
功能以下:
enter image description here

  • 主頁:

    • 產品動態
    • 用戶總體監控數據:函數執行次數、公網流量Byte、資源使用量CU(Compute Unit)
    • 用戶幫助文檔入口
  • 函數管理

    • 建立:普通函數、http函數、根據模板建立函數
    • 編輯:函數在線編寫, 觸發調用、代碼包上傳、OSS文件存儲關聯
    • 觸發器管理:修改觸發器配置,新增函數觸發器(觸發器與函數多對多關係)
    • 監控指標:內存、執行時間、錯誤量、錯誤率
    • 日誌:須要用戶額外開通日誌服務進行對接,實時採集分析,個性化錶盤配置、報警規則設定
    • 預留實例:由於函數是彈性自動擴縮容的,每次冷啓動耗時影響,會對服務耗時有毛刺的影響,對耗時有要求的用戶能夠聯繫平臺給帳號配置白名單,配置預留實例。
    • 建立應用:將服務配置、函數配置、trigger配置、工程構建、通用場景化應用模板建立好一個應用
    • 服務版本:給服務設置版本,作快照備份。設置別名,進行流量版本灰度比例設置,目前支持兩個版本切分流量
  • 自定義域名

    • 默認域名:帳號id.服務地址.fc.aliyuncs.com 如:16530750.cn-shanghai.fc.aliyuncs.com, 請求函數爲:xxx.xxx.fc.aliyuncs.com/2016-08-15/proxy/服務名/函數名/
      http觸發器的函數,服務端會爲 response header 中強制添加 content-disposition: attachment 字段,此字段會使得返回結果在瀏覽器中以附件的方式打開。此字段沒法覆蓋,使用自定義域名將不受影響。
    • 自定義域名, 將本身的域名 CNAME 到 xxx.xxx.fc.aliyuncs.com ,域名須要備案成功後才能訪問成功
      enter image description here

2. Vscode插件

地址:https://github.com/alibaba/serverless-vscode
vscode 編輯器開發神器,佔有率和生態不斷提高。函數計算平臺給出了IDE一站式插件:本地圖形化開發、調試和部署工具
使用前須要安裝Docker,其緣由是,經過docker運行有平臺提供標準化的函數Runtime, 來在開發者本地進行開發、調試。
該插件功能以下:


  • 關聯阿里雲帳號
  • 第二欄列出遠端部署的服務和函數,支持菜單按鈕刷新,切換地區、帳號

    • 點擊菜單按鈕,下載服務工程、下載函數工程
    • 點擊菜單按鈕,觸發執行遠端函數,右側能夠編寫觸發事件參數
    • 點擊服務、函數、觸發器菜單欄,右側打開其配置信息
  • 第一欄列出當前本地工程,根據配置文件 template.yaml 中全部服務、函數、觸發器

    • 點擊菜單按鈕,瀏覽器打開函數計算相關文檔
    • 點擊菜單按鈕,瀏覽器打開函數計算Vscode插件源碼倉庫
    • 點擊菜單按鈕,對當前服務(一個配置文件template.yaml)全部函數進行代碼上傳,部署deploy
    • 點擊菜單按鈕,新增一個新服務, 一步步輸入服務名、函數名、選擇運行Runtime、選擇函數類型(普通函數、http函數), 此時會在該工程配置文件template.yaml 中會更新添加一個服務。其中一步步提示,可進行後退操做
    • 點擊菜單按鈕,新增一個函數,在當前服務中。同上一步步輸入選擇配置,最終更新配置文件,新建一個函數目標
    • 點擊菜單按鈕, 可也進行查看函數代碼、觸發函數、debug 觸發函數。
    • 點擊菜單,能快速定位高亮提示到,配置文件中對應位置。
    • 入口函數代碼位置,定位有兩個按鈕觸發函數、debug觸發函數
      enter image description here

3. Fun

地址:https://github.com/alibaba/funcraft
安裝:npm install @alicloud/fun -g
本地命令行開發、調試和部署工具,做爲一個命令行工具,內置了多個子命令,好比 config、local、deploy 等

  • init 根據模板初始化一個服務,fun init 選擇須要模板、或者指定自定義工程模板
  • config 子命令能夠用來配置通用信息,如 Account ID、Access Key Id
  • local 子命令能夠用來本地運行、調試函數,

    • 運行函數 fun local start service/function
    • 調試函數 fun local start -d 3000 --config VSCode service/function (根據提示配置vscode調試配置,啓動後便可調試)
  • deploy 子命令能夠將本地開發代碼發佈到線上

    • 部署全部服務、全部函數:fun deploy -t ./template.yml
    • 部署特定服務中特定函數: fun deploy -t ./template.yml demo/hello
  • 對生成環境更推薦 ROS 部署,在配置文件中聲明bucket 配置

    • 打包上傳資源到OSS: fun package --oss-bucket bucket-name
    • 進行不一樣環境部署,任何資源中間環節部署失敗,都會自動整個資源棧的自動回滾,解決部署過程當中的可能致使服務不可用的問題。

      • fun deploy --use-ros --stack-name test
      • fun deploy --use-ros --stack-name staging
      • fun deploy --use-ros --stack-name prod

4. OpenAPI

地址:https://help.aliyun.com/document_detail/52877.html#createservice
函數計算資源管理接口API,便可以經過http接口, 對平臺資源(服務、函數、觸發器等) 增刪查改操做

5. SDK

地址: https://github.com/aliyun/fcli
函數計算clientSDK ,即開發者能夠方便經過這個sdk, 對平臺資源增刪查改操做
源代碼即經過http接口調用上面OpenAPI,SDK裏自動處理了簽名認證

6. Fcli

地址: https://github.com/aliyun/fcli
注意要和Fun 進行區別。
Fun: 本地開發、調試、部署的命令行工具
Fcli: 操做管理 在阿里雲函數計算平臺資源的命令行工具。


開發者經過這個命令行工具 ,對函數計算平臺資源增刪查改操做。如我用控制檯可視化界面、vscode可視化界面都沒有找到刪除服務的操做入口,後來經過這個命令行工具成功將不須要的服務刪除掉了。
源代碼即經過依賴使用上面的SDK client 進行操做的

7.WebIDE

地址:https://ide.fc.aliyun.com
瀏覽器版本IDE進行函數管理開發。體驗了下,可能由於資源成本考慮,還須要用戶本身本地使用docker 啓動鏡像,將本地建立的網絡磁盤掛載到WebIDE。且服務region只支持一個華東1(杭州)。故開發者目前能夠忽略使用
由於如下已是一個很不錯且低成本的最佳實踐方式。故官方對WebIDE開發鏈路建設優先級沒這麼重

  • 平常開發:vscode插件 + vscode + docker裏標準化runtime
  • 高級配置:官網函數計算控制檯

8.開發者工具總結

以上開發者生態工具關係:

OpenAPI => SDK client => Fcli
=> Fun(開發、調試、部署命令行工具) + Fcli(平臺資源管理命令行工具)
=>(本地vscode 可視化插件 |+官網站點平臺)
=> 我想的理想狀態(官網Web站點平臺 + 無依賴的WebIDE )


開發者工具能力一層層抽象、複用,對咱們構建相似生態能夠說有很好的借鑑做用

配置文件

阿里雲函數計算配置文件 template.yaml , 一個工程一個配置文件,一個配置文件下能夠有多個服務,每一個服務有多個函數,
每一個函數多個觸發器,以下進行了大致解釋

# template.yaml
ROSTemplateFormatVersion: '2015-09-01'  # ROS(Resource Orchestration) 資源編排 本號
Transform: 'Aliyun::Serverless-2018-04-03' # 繼承模板
Resources:  # 資源列表
  demo:  # 資源-服務1
    Type: 'Aliyun::Serverless::Service' # 資源類型
    Properties: # 資源屬性
      InternetAccess: true
    hello: #函數1
      Type: 'Aliyun::Serverless::Function'
      Properties:
        Handler: index.handler # 處理函數入口
        Runtime: nodejs10 # 函數運行環境
        Timeout: 60 # 函數超時時間s
        MemorySize: 512  # 運行內存限制
        EnvironmentVariables: {} # 環境變量
        CodeUri: ./demo/hello  # 函數代碼
      Events:  # 函數的觸發器
        http-trigger:
          Type: HTTP # 觸發器類型
          Properties: # 觸發器配置
            AuthType: anonymous # 權限認證
            Methods: # http接口method
              - GET
              - POST
    common-fun: # 函數2
      Type: 'Aliyun::Serverless::Function'
      Properties:
        Handler: index3.handler  
        Runtime: nodejs10 
        Timeout: 60 
        MemorySize: 512 
        EnvironmentVariables: {}
        CodeUri: ./demo/common-fun 
  demo-vscode: # 資源 - 服務2
    Type: 'Aliyun::Serverless::Service'
    Properties:
      Description: This is demo-vscode service
    hello:
      Type: 'Aliyun::Serverless::Function'
      # ...

傳統應用工程遷移

由於咱們傳統的web 大都是express、koa、egg 框架寫的。函數計算以函數爲執行入口,相對傳統工程少了應用的啓動端口號監聽、路由部分。路由部分被放在了平臺外層。那如何快速底層平遷移傳統服務呢?有以下兩種方式

1. 函數內部路由 + 添加代理層

const { Server } = require('@webserverless/fc-express')
const express = require('express');
const app = express();

// 保留傳統服務內部路由
app.all("/", (req, res) => {
  // ...
});
app.all('/login/*', (req, res) => {
 // ....
});
const server = new Server(app);

// 此時函數變成了一個傳統服務
module.exports.handler = function(req, res, context) {
  server.httpProxy(req, res, context);
};

進行平臺自定義域名 + 路由配置, 將這個服務的流量都導入這個特殊的函數

Path 服務名 函數名
/service/* s1 f1

能夠看到經過官方提供的模塊@webserverless/fc-express, 咱們很快的進行了服務的遷移。
這個模塊裏作了什麼

  • 針對http 觸發器對應函數(特殊處理函數)

    • 阿里雲本身的規範 res/req 參數,適配轉化到對應的 express req res 對象上,
    • 阿里雲callback 執行,適配到 express res.send/res.json 上
  • 針對API 網關觸發器對應函數(普通處理函數)

    • event 對象須要映射到 express req 對象
    • 阿里雲callback 執行,適配到 express res.send/res.json 上
  • 問題

    • 適配多少代理了不肯定的風險
    • 請求對象屬性沒有從函數計算中透傳出來,好比:protocol、hostname 等,因此在 express 應用中沒法獲取
    • 移植後的 express 也須要是無狀態的,函數是無狀態的

自定義運行時

2019年10月推出支持用戶自定義 Custom Runtime,能夠完成如下目標:

  • 打造屬於本身的自定義runtime,各類依賴通用上下文、環境本身把握,把握函數入口參數規範
  • 不在須要每次重複安裝、打包上傳通用依賴,加大冷啓動時間,補充官方默認基礎依賴:默認基礎依賴,即這些你服務工程不須要安裝依賴,也能夠 require('ali-oss')
  • 現有的 web 應用或基於傳統開發 web 項目基本不用作任何改造,便可將項目遷移到函數計算平臺
  • 具體作法文檔:https://help.aliyun.com/document_detail/132044.html, 這邊還沒找到一個完整的自定義Runtime的nodejs 方案工程,能夠快速參考,但願官方能夠補充

依賴安裝

因爲阿里雲-函數計算,纔有的非docker鏡像發佈業務代碼,而是上傳zip包的形式(官方給出的緣由是 docker鏡像太大的問題,下載給冷啓動帶來影響,另外docker 方案並不是絕對隔離安全。阿里雲函數計算底層用的是虛擬機,不知道是如何作到同docker同樣資源利用率這麼高的)
由於上傳的是包含依賴+業務源代碼,有些安裝依賴是會進行編譯的,如node-gyp編譯c++, 編譯環境與運行環境不一致,可能會形成線上問題。故你本地開發安裝須要編譯依賴是,須要保持與你部署環境一致,對應nodejs用戶,函數計算的 Nodejs 運行環境是:

  • Linux 內核版本:Linux 4.4.24-2.al7.x86_64
  • docker 基礎鏡像:docker pull node:xxx 對應配置設置的版本 (nodejs 版本一致能解決大大部分問題, 使用nvm 便可)
    其餘語言這個問題會多些,官方給出了經過 fun install 命令行 在一個docker 標準運行環境容器sbox環境安裝的解決方案

函數工做流

2019年中推出的產品,目前公測中
產品文檔:https://help.aliyun.com/document_detail/114020.html
產品控制檯:https://fnf.console.aliyun.com/fnf/cn-hangzhou/flows
函數工做流-函數編排,不只僅是爲函數計算而生,但其和函數計算結合起來十分合適。函數工做流提供了豐富的控制原語讓您描述業務邏輯,好比您能夠串行執行任務、並行執行任務。這樣咱們能夠經過配置文件來描述各本來獨立函數計算以前如何流轉起來,傳遞數據。該配置文件也能夠經過可視化拖拽造成一張數據流轉操做圖。
這是函數級serverless, 相對應用級serverless的優點
相對應用級工程管理,函數級管理更爲複雜,但卻帶來了複用函數、靈活組合編排函數的好處。




加快冷啓動

  • 開發者減少最後打包上傳的工程代碼大小,如 業務代碼拆分、減小依賴node_modules大小.
  • 選擇合適的函數語言,如nodejs 代替java 大大提高語言運行時建立
  • 優化函數初始化邏輯

    • 使用定時觸發器 預熱函數
    • 使用 Initializer 函數入口,異步複用初始化通用依賴,如mongo鏈接
  • 選擇合適的內存: 在併發量必定的狀況下,函數內存越大,冷啓動表現越優
    enter image description here
  • 2019.9月推出預留實例能力,來解決部分應用對冷啓動耗時尖刺的問題
    enter image description here

最後

阿里雲-函數計算,是阿里自研的一種Serverless實現, 通過幾年發展能夠說產品相對成熟、生態完善豐富。其初始定位應該是面向簡單函數級的Severless, 基於zip包上傳源代碼和依賴,進行下載部署。 由於Severless 是還在蓬勃發展,各大平臺(亞馬遜、Google、微軟)有本身的實現規範, 對ymal配置文件、入口函數參數等會有不一樣。
標準化發起者Google牽頭的開源項目Knative 也在蓬勃發展中,定位是提供一套標準化,面向函數、應用、容器的Serverless方案,在阿里雲上已經開始支持私有化部署K8s+Istio+Knative集羣來搭建,相對函數計算服務拿來即用,門檻更高些,目前還在公測階段,我在另外一篇文章裏有詳細介紹:https://yq.aliyun.com/articles/743865

以上使我對阿里雲函數計算平臺的一些總結,但願對你們有所幫助,若有理解有誤,歡迎指出,共同成長。

相關文章
相關標籤/搜索