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

阿里雲函數計算服務(FunctionCompute,FC)是一個事件驅動的全託管計算服務。經過函數計算與雲端各個服務的普遍集成,開發者只須要編寫函數代碼,就可以快速地開發出彈性高可用的後端系統。接下來咱們使用FC,來快速實現一個圖片轉換服務, 並把這個圖片轉換服務做爲支付寶小程序的後端。html

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

資源下載及準備工做

示例代碼附件 【必須】前端

支付寶小程序開發工具下載 【非必須】node

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

簡明架構圖

函數入口

普通函數入口git

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

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

  • event 參數

event 參數是用戶調用函數時傳入的數據,其類型是strnpm

  • 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

而後打開 調試器 和 模擬器

總結

函數計算有以下優點:

  • 無需採購和管理服務器等基礎設施
  • 專一業務邏輯的開發
  • 提供日誌查詢、性能監控、報警等功能快速排查故障
  • 以事件驅動的方式觸發應用響應用戶請求
  • 毫秒級別彈性伸縮,快速實現底層擴容以應對峯值壓力
  • 按需付費。只需爲實際使用的計算資源付費,適合有明顯波峯波谷的用戶訪問場景


本文做者:rsong

閱讀原文

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索