作者 | 阿里云 Serverless 技術研發 落語
背景
阿里云函式計算產品在較早的時候支持了HTTP觸發器能力,支持用戶使用 HTTP 協議進行函式呼叫,函式計算后端通過一個共享的 APIServer 組件對所有客戶提供回應 HTTP 觸發器呼叫的服務,需要依賴 URL 中的 Path 將客戶流量路由到客戶的函式容器內部,容器內收到的 HTTP 請求 Path 會帶有函式計算的路由標識,如果客戶在函式計算部署 REST 風格的應用,那么就會遇見 404 問題,

在一開始,函式計算并不是為客戶運行中小型規模應用而設計的,函式計算提供了原生的 REST 架構,將每個函式視為一個獨立的資源,通常一個函式只負責一小塊功能,也就是一個 API,如果一個函式只對應一個 API,那么在函式代碼中也不必去實作一套路由邏輯去回應不同 URL Path 路徑的請求了,

函式計算在近兩年引入了Custom Runtime/Custom Container Runtime型別的函式,客戶可以直接在函式計算上運行自己存量的應用,而不必按照函式計算推薦的架構去拆分自己的應用,客戶以及社區內比較成熟的專案的開發習慣是采用MVC等架構,在一個程式中開發大量的REST API,在行程內按照報文中的HTTP Path進行路由,將不同路徑的請求“轉發”至不同的方法或函式進行處理,

在這樣的背景下,客戶可以在函式計算運行存量的 REST 應用,但應用無法正常對外提供服務,客戶花費大量的精力對存量的應用進行改造,而且這個改造僅僅在函式計算是必須的,是一種典型的平臺攜裹用戶的產品設計,
使用 fcapp.run呼叫函式
為了解決上述的問題,并兼容存量的函式以及客戶習慣,函式計算為每個新創建的 HTTP 觸發器分配了一個獨立的域名,例如{random-string}.cn-shanghai.fcapp.run,使用該域名訪問函式計算,函式計算會按照域名進行路由,將流量轉發至函式容器內,避免對客戶代碼造成侵入性,

使用 fcapp-test.run 進行本地網頁測驗
由于中國大陸政策的影響,函式計算主域名無法在互聯網為客戶提供網站型別的業務,所有的函式請求結果將被轉為下載行為,對于純 API 型別的函式,我們認為將請求結果轉為下載是沒有影響的,但對于網站屬性的函式,回傳的 HTML 文本以及 JavaScript 代碼強依賴瀏覽器的解釋器才能正常展示,我們判斷讓開發者能夠實時看到函式回傳的頁面是一個強訴求,
在生產場景,我們推薦客戶為函式系結已備案的域名來解決這個問題,而在測驗環境有更加簡潔的方案,在測驗階段可以臨時通過測驗域名fcapp-test.run以及添加本地的host決議繞過這個問題,請求結果將不會被轉為下載行為,可以正常進行網頁除錯,
# 1. 從頁面獲取fcapp.run的域名
FC_DOMAIN='wordpress-xxxxx-serverlordpress-ydziwvakfn.cn-shenzhen.fcapp.run'
FC_TEST_DOMAIN=`echo ${FC_DOMAIN} | sed 's/fcapp.run/fcapp-test.run/g'`
echo "FC域名: ${FC_DOMAIN}"
echo "FC測驗域名: ${FC_TEST_DOMAIN}"
# 2. 查詢域名決議的IP
FC_IP=`ping ${FC_DOMAIN} -c 1 | HEAD -1 | awk '{print $3}' | sed 's/[():]//g'`
echo "FC IP: ${FC_IP}"
# 3. 修改host檔案,將測驗域名的本地決議指向fcapp.run的決議
# 如果沒有權限需要手動加
sudo -- sh -c "printf '\n${FC_IP} ${FC_TEST_DOMAIN}\n' >> /etc/hosts"
cat /etc/hosts
# 4. 使用測驗域名在瀏覽器訪問函式
curl -v "${FC_TEST_DOMAIN}"
了解 TCP 協議以及HTTP協議的同學可以很容易地理解背后的技術細節,客戶端在發起HTTP請求時,首先會通過域名決議查詢到域名對應的IP地址,并發起TCP連接,接下來會通過建立的TCP連接,將HTTP Request報文發送至Server端,如果客戶端直接向函式計算的Server發起TCP連接,并將可以與函式關聯的域名發送至函式計算,那么函式計算就可以回傳客戶期望的內容,
函式計算在后端進行了處理,兼容了fcapp-test.run域名的訪問,但并不提供權威DNS決議,客戶只需要在本地進行Host配置或者使用自建的DNS服務器,將fcapp-test.run的域名決議至函式計算Server,就能夠正常測驗函式,該方案既滿足了中國大陸法律法規的要求,又以極低的成本滿足了客戶除錯頁面的需求,極大地優化了客戶在函式計算的研發體驗,
使用函式計算運行 wordpress 官方鏡像
通過以上的方案,函式計算支持客戶在不修改任何業務代碼的前提下遷移自己的REST應用,下面使用wordpress官方鏡像進行說明,
前置條件
- 開通函式計算賬號,
- 將 wordpress 鏡像轉存到阿里云容器鏡像服務中,
- 創建或使用已有的 mysql 實體,并為wordpress服務初始化相應的賬號以及資料庫,如果使用阿里云RDS實體,請確保函式服務的VPC配置與RDS實體的VPC配置一致,且白名單配置正確,
創建相應的函式以及服務
使用wordpress官方鏡像創建函式,并設定容器內監聽埠為80,

注入資料庫配置
修改函式配置,將mysql的資料庫配置以環境變數的方式注入函式容器內,

無需備案,測驗wordpress函式功能
查看創建的觸發器分配的域名,按照上述檔案配置,使用fcapp-test.run域名進行測驗,


上線你的函式
對外提供網站型別服務只能通過已備案域名來實作,函式計算用戶可以通過配置自定義域名的功能,將域名與函式進行系結,使用自己的域名對外提供服務,同時也可以使用任意標準的網關型別的云產品或者開源產品,使用fcapp.run的內網域名上線你的函式,
小結
作為 Serverless 技術的標志性產品之一,函式計算長久以來專注于提升產品適用的場景,fcapp.run域名以及相關產品特性的引入,標志著函式計算在 REST 場景以及 Web 場景的很大一步,客戶從此可以將 REST 應用零改造地部署在函式計算上,研發測驗的體驗以及正式上線的方案都做到了優秀,非常歡迎同學們使用函式計算,并提出寶貴的意見,
更多內容關注 Serverless 微信公眾號(ID:serverlessdevs),匯集 Serverless 技術最全內容,定期舉辦 Serverless 活動、直播,用戶最佳實踐,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/469906.html
標籤:其他
上一篇:C語言 鏈表的基本使用 -- 13個函式,初始化(頭插、尾插)、遍歷列印、獲取元素總個數、插入(按值前插/后插、按位置)、洗掉(按值、按位置)、逆置、清空、銷毀
