天天看點

十分鐘上線 - 函數計算建構支付寶小程式的後端

阿裡雲 函數計算服務 (FunctionCompute,FC)是一個事件驅動的全托管計算服務。通過函數計算與雲端各個服務的廣泛內建,開發者隻需要編寫函數代碼,就能夠快速地開發出彈性高可用的後端系統。接下來我們使用FC,來快速實作一個圖檔轉換服務, 并把這個圖檔轉換服務作為支付寶小程式的後端。

支付寶小程式demo前端效果圖:

十分鐘上線 - 函數計算建構支付寶小程式的後端

資源下載下傳及準備工作

示例代碼附件

【必須】

支付寶小程式開發工具下載下傳

【非必須】

函數計算FC 快捷入口 對象存儲OSS 快捷入口 日志服務Log Service 快捷入口

簡明架構圖

十分鐘上線 - 函數計算建構支付寶小程式的後端

函數入口

普通函數入口

def my_handler(event, context):
    return 'hello world'           
  • 函數名

my_handler需要與建立函數時的"Handler"字段相對應:例如建立函數時指定的 Handler 為main.my_handler,那麼函數計算會去加載main.py中定義的my_handler函數

  • event 參數

event 參數是使用者調用函數時傳入的資料,其類型是str

  • context 參數

context 參數中包含一些函數的運作時資訊(例如 request id/臨時 AK 等)。其類型是FCContext,具體結構和使用在下面的使用 context介紹

  • 傳回值

函數的傳回值會作為調用函數的結果傳回給使用者,它可以是任意類型:對于簡單類型會函數計算會把它轉換成 str 傳回,對于複雜類型會把它轉換成 JSON 字元串傳回

HTTP 觸發器的函數入口

HELLO_WORLD = b"Hello world!\n"
def handler(environ, start_response):
    context = environ['fc.context']
    status = '200 OK'
    response_headers = [('Content-type', 'text/plain')]
    start_response(status, response_headers)
    return [HELLO_WORLD]           
  • environ : environ 參數是一個 python 字典,裡面存放了所有和用戶端相關的資訊,具體詳情參考 environ 參數 ,函數計算增加了兩個自定義的 key,分别是

    fc.context

    fc.request_uri

    • fc.context : 和普通函數入口的 context 意義一樣
    • fc.request_uri : string 類型,request 的 url

需要注意的點:environ 中的

HTTP_Variables

,裡面包含 request 中 header, 比如某個請求的 header 的為

'x-Custom-key':'value'

, 在 environ 中會表現為:

environ['HTTP_X_CUSTOM_KEY']='value'

, 可以了解為,對于 request header 中的 key,WSGI 做如下處理:

key = "HTTP_" + k.upper().replace("-","_")

  • start_response : start_response 參數是一個可調用者(callable), 具體參考 the-start-response-callable , 這個是 FC runtime 提供的,它接受兩個必要的位置參數和一個可選參數。

更多詳細介紹請參考

python runtime

具體操作步驟

假定這次實驗所有操作在華東2 上海region 完成,所有實驗相關的資源請從

附件

中下載下傳

這裡介紹兩種部署函數的方法:

  1. 利用fun 工具進行自動化部署
  2. 利用控制台進行可視化部署

準備工作

  • 準備存儲圖檔的 oss bucket

    比如在華東2建立了一個名叫

    xcx-demo

    的bucket

利用fun工具進行自動部署

Fun

是用于在阿裡雲上定義 serverless 應用的模型。

Serverless 應用是由事件觸發功能組成的應用。一個典型的 serverless 應用由一個或多個由諸如向 阿裡雲 OSS 上傳對象,在 阿裡雲 OTS 上執行資料操作以及 API 操作等事件觸發的阿裡雲函數計算組成。這些函數可以獨立使用。也可以利用其它資源,例如阿裡雲 OTS 的表和 OSS 的 buckets。最基本的 serverless 應用可以隻有一個函數。

比如對于這個案例,定義的yaml檔案如下:

ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
  sh-pro:
    Type: 'Aliyun::Serverless::Log'
    Properties:
      Description: 'image process log pro'
    fc-log:
      Type: 'Aliyun::Serverless::Log::Logstore'
      Properties:
        TTL: 362
        ShardCount: 1 
  pydemo:
    Type: 'Aliyun::Serverless::Service'
    Properties:
      Description: 'fc xiaochengxu demo'
      Policies:
        - AliyunOSSFullAccess
      LogConfig:
        Project: 'sh-pro'
        Logstore: 'fc-log'
    upload:
      Type: 'Aliyun::Serverless::Function'
      Properties:
        Handler: upload.handler
        CodeUri: './'
        Description: 'http function for upload image'
        Runtime: python2.7
        Timeout: 60
        MemorySize: 256
      Events:
        http-trigger:
          Type: HTTP
          Properties:
            AuthType: ANONYMOUS
            Methods: ['POST']
    proc:
      Type: 'Aliyun::Serverless::Function'
      Properties:
        Handler: proc.handler
        CodeUri: './'
        Description: 'http function for process image'
        Runtime: python2.7
        Timeout: 60
        MemorySize: 256
      Events:
        http-trigger:
          Type: HTTP
          Properties:
            AuthType: ANONYMOUS
            Methods: ['GET']
           

上面的定義的yaml檔案要做以下幾件事情:

  1. 建立日志資源:logproject:

    sh-pro

    , logstore:

    fc-log

  2. 建立service:

    xcxdemo

    以及function:

    upload

    proc

    , 函數添加了一個類型為

    HTTP

    ,名叫

    http-trigger

    的trigger
  3. 配置service role以及logconfig, 其中role的權限為

    AliyunOSSFullAccess

    和函數執行日志寫到fc-log的權限

具體操作

npm install @alicloud/fun -g           
  • 修改template.yml中的logproject的名字和.env中的相關配置,執行指令

    fun deploy

執行成功後,應該可以看到如下資源被建立, 截圖:

十分鐘上線 - 函數計算建構支付寶小程式的後端
十分鐘上線 - 函數計算建構支付寶小程式的後端

控制台setup

建立函數,并且配置http trigger

  • 在 上海 region 先建立好日志資源,用于函數計算的日志收集
十分鐘上線 - 函數計算建構支付寶小程式的後端
  • 建立service,配置service一個具有通路oss權限的role
    • 點選授權
      十分鐘上線 - 函數計算建構支付寶小程式的後端
  • 點選确定
    十分鐘上線 - 函數計算建構支付寶小程式的後端
  • 建立一個函數,并設定Http trigger, 使用的代碼包為附件中 server 目錄下的

    code.zip

十分鐘上線 - 函數計算建構支付寶小程式的後端
十分鐘上線 - 函數計算建構支付寶小程式的後端
十分鐘上線 - 函數計算建構支付寶小程式的後端
十分鐘上線 - 函數計算建構支付寶小程式的後端

測試函數

curl https://1186202104331798.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/pydemo/upload/  -F "lena.png=@/Users/songluo/work/shworkshop/wp/lena.png"  -v

curl https://1186202104331798.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/pydemo/proc/rotate/10/lena.png >> 1.png
           

将函數作為支付寶小程式的後端

  • 下載下傳安裝支付寶小程式 IDE
  • 打開代碼包中的client, 将代碼中的 url 替換成自己函數的 url
十分鐘上線 - 函數計算建構支付寶小程式的後端

然後打開 調試器 和 模拟器

十分鐘上線 - 函數計算建構支付寶小程式的後端

總結

函數計算有如下優勢:

  • 無需采購和管理伺服器等基礎設施
  • 專注業務邏輯的開發
  • 提供日志查詢、性能監控、報警等功能快速排查故障
  • 以事件驅動的方式觸發應用響應使用者請求
  • 毫秒級别彈性伸縮,快速實作底層擴容以應對峰值壓力
  • 按需付費。隻需為實際使用的計算資源付費,适合有明顯波峰波谷的使用者通路場景

歡迎大家通過掃碼加入我們使用者群中,搭建過程中有問題或者有其他問題可以在群裡提出來。

函數計算官網客戶群(11721331)。

十分鐘上線 - 函數計算建構支付寶小程式的後端

繼續閱讀