使用阿里雲函數計算構建小程序

1、需求

在用戶使用HyperMotion產品過程中,用戶可以通過掃描產品中二維碼方式,自助進行Licnese申請。用戶提交申請後,請求將發送到釘釘流程中。完成審批後,後臺服務將自動根據用戶的特徵碼、申請的數量、可使用的時間將生成好的正式Licnese發送到客戶的郵箱中。


使用阿里雲函數計算構建小程序


在原有設計中,使用了Python Flask提供WEB界面,後臺使用Celery異步的將用戶請求發送至釘釘中,之後採用輪詢方式監控審批工單狀態,當工單完成審批後,將生成好的License發送至客戶提供的郵箱中。

實現的效果:


使用阿里雲函數計算構建小程序


這種方式雖然可以滿足需求,但是在使用過程中也發現有如下痛點:1、由於對於可用性要求比較高,所以將整套應用以容器化方式部署在雲主機上,程序高可用性依賴於底層的平臺,基於成本考慮並沒有在多可用區進行部署。2、當業務變化時,需要專人將容器從本地容器庫上傳後進行更新,更新速度慢,敏捷性低。3、需要專人對操作系統層進行維護,並且由於該雲主機還運行了其他程序,所以管控上也存在安全風險。

基於以上出現的問題,決定對原有二維碼程序進行重構,並重新部署在阿里雲函數計算服務上。1、第一階段的改造主要是將二維碼掃描程序移植到函數計算服務中。2、第二階段的改造主要是將發送二維碼程序改造為函數計算服務,使用釘釘流程接口中的Callback方法調用該接口,在審批結束後觸發發送License流程。

2、函數計算服務——無服務,零運維

最早接觸Serverless的雛形是在2011年開發Cloud Foundry項目時,當時留下一個非常深的印象就是把寫好的應用直接上傳就完成了部署、擴展等。但是當時Cloud Foundry有一個非常大的侷限性,受限於幾種開發語言和框架。記得當時的Cloud Foundry只支持Node.js、Python、Java、PHP、Ruby on Rails等,脫離了這個範圍則就無法支持,所以當時我其實對這種形態的應用場景存在很大的疑問。這種困惑直到2013年Docker的出現而逐步解開,Docker的出現讓開發語言、框架不再是問題,巧妙的解決了Cloud Foundry上述侷限性。但是Docker畢竟只是一種工具形態,還不能稱得上是平臺,緊接著k8s的出現彌補了這一空白,使得Docker從游擊隊變成了正規軍。在這個發展過程中我們不難看出,軟件領域發展出現了重大變革,從服務器為王逐漸演進到應用為王的階段。如果說虛擬化改變了整個物理機的格局,那麼無服務化的出現則改變了整個軟件開發行業。由於網上各種文檔太多了,這裡就不對Serverless基本概念進行介紹了,借用一張圖說明下。另外還有一點,我們從這裡面看到IT行業裡的某些崗位,註定要消失的,比如傳統運維。


使用阿里雲函數計算構建小程序


3、應用架構

整個架構上,分為兩個函數計算服務完成:

  • 二維碼前端:主要用於顯示頁面,並承擔HTTP請求轉發代理的角色,將請求轉發至二維碼後端,發給釘釘,採用HTTP觸發器,允許公網訪問。
  • 二維碼後端:用於將用戶請求發送給釘釘,該部分服務仍然採用HTTP觸發器,不同於前端,該服務是不允許公網直接訪問的,但是需要配置NAT網關,通過網關訪問釘釘,實現固定IP訪問釘釘的效果。


使用阿里雲函數計算構建小程序


從邏輯上講,整個應用並不複雜,但是在實際使用時遇到最大的問題來自釘釘白名單。由於函數服務對外連接的IP並不固定,所以無法在釘釘中添加,那麼就要求函數服務對外連接的IP地址一定要固定。社區中提供的方法主要分為:

  • ECI(運行Nginx充當Proxy),優勢是便宜,劣勢是高可用性需要自己維護
  • NAT網關,優勢是高可用性,劣勢是比ECI貴

4、構建過程

由於篇幅原因,這裡只介紹關鍵步驟。

4.1 構建模板

為了後續管理和擴展方便,選用了阿里雲函數計算中使用flask-web模板進行構建,同時可以將前端靜態文件模板存放於項目下(出於統一管理的需要,也可以存放於阿里雲的OSS中,作為靜態網站發佈)。

前端我們使用flask-web作為模板創建函數,後端我們直接採用最簡單的HTTP函數。


使用阿里雲函數計算構建小程序


函數入口配置,及觸發器配置:

服務配置,包含公網訪問權限,專有網絡配置,日誌配置,權限配置。


使用阿里雲函數計算構建小程序


  • 前端服務需要公網訪問權限,不需要專有網絡配置,需要的權限為:AliyunLogFullAccess。
  • 後端服務不需要公網訪問權限,但是需要配置好的NAT映射的專有網絡,由於函數服務在北京2區中在cn-beijing-c和cn-beijing-f,所以在新建交換機時需要使用這兩個區。還需要選擇安全組,由於出方向並沒有明確禁止,所以不需要特別的安全組規則設定。需要的權限為:AliyunLogFullAccess/AliyunECSNetworkInterfaceManagementAccess。

配置好後,通過導出功能,分別下載前端和後端代碼和配置,在本地進行開發調試。


使用阿里雲函數計算構建小程序


4.2 前端開發

我們的前端採用Vue.js進行開發,在main.py同級新建templates目錄。Vue編譯好的靜態文件可以放入該目錄中,後續Flask會加載該文件作為入口文件。

<code>├── templates
│ ├── index.html
│ ├── static
├── main.py/<code>
<code># main.py sample
from flask import render_template

LICENSE_URL = "https://[x](https://.cn-beijing-internal.fc.aliyuncs.com/2016-08-15/proxy/QR_code/apply_license/license)x[x](https://xx.cn-beijing-internal.fc.aliyuncs.com/2016-08-15/proxy/QR_code/apply_license/license)x[x](https://xxxx.cn-beijing-internal.fc.aliyuncs.com/2016-08-15/proxy/QR_code/apply_license/license)x[x](https://xxxxxx.cn-beijing-internal.fc.aliyuncs.com/2016-08-15/proxy/QR_code/apply_license/license).cn-beijing-internal.fc.aliyuncs.com/2016-08-15/proxy/QR_code/apply_license/license"

@app.route('/qr_code', methods=['GET'])
def index():
return render_template('index.html')

@app.route('/qr_code/license', methods=['POST'])
def create():
payload = request.json
resp = requests.post(LICENSE_URL,
json=payload,
headers=DEFAULT_HEADERS)
return make_response(resp.text, resp.status_code)/<code>

4.3 後端開發

後端的開發較為簡單,實現一個函數支持POST請求,將轉發的結果發送至釘釘即可。

4.4 本地調試

阿里雲在本地開發時提供了fun應用部署和開發工具,詳細使用方法見:https://help.aliyun.com/document_detail/64204.html。

安裝fun

<code>npm config set registry [https://registry.npm.taobao.org](https://registry.npm.taobao.org/) --global
npm config set disturl [https://npm.taobao.org/dist](https://npm.taobao.org/dist) --global

npm install @alicloud/fun -g/<code>

配置fun

<code>fun config

(venv) [root@ray-dev test_func]# fun config
? Aliyun Account ID xxxxxxxx
? Aliyun Access Key ID ***********r5Qd
? Aliyun Access Key Secret ***********kCCi
? Default region name cn-beijing
? The timeout in seconds for each SDK client invoking 10
? The maximum number of retries for each SDK client 3
? Allow to anonymously report usage statistics to improve the tool over time? Yes/<code>

Http Trigger本地運行

<code>fun local start/<code>

部署

<code>fun deploy/<code>

4.5 配置域名解析

部署完成後有一點需要特別注意,必須要綁定域名,並且設定必要的路由。如果在沒有綁定域名的情況下,服務端會為 response header中強制添加 content-disposition: attachment字段,此字段會使得返回結果在瀏覽器中以附件的方式打開。(https://www.alibabacloud.com/help/zh/doc-detail/56103.htm)

5、總結

  • 靈活使用函數計算對開發成本和運行成本具有“雙降”的效果
  • 函數計算除了Http Trigger外,還包含了Event Trigger。Event Trigger中包含了連接各個服務之間的作用,在一些服務銜接上的作用越來越明顯
  • 函數計算在線開發時比較麻煩,並且查看日誌不方便,所以儘量在本地開發好在上傳的方式


分享到:


相關文章: