初探 SCF 的 Web function 和 Custom image

以下內容來自「icebreaker」原創文章:《初探 SCF 的 Web function 和 Custom image》,以獲取授權。

一篇 Hello world,初步介紹這 2 個新功能如何使用 文中這 2 個功能也很快要全區域公測了

前言

最近騰訊雲SCF最新內測了

這兩個功能,筆者內測申請通過了,就興致勃勃的嘗試了一下

01. Web function

過去

Web function 出現之前,我們在編寫 SCF 函數 去處理 http 請求的時候,往往要經過許多次的轉化。

這主要是因爲,函數本身都是事件觸發的,而原先 API網關 接收 http 請求後,再根據請求的路徑匹配,發現匹配成功後的後端類型是 SCF雲函數 後, 就會把這個請求轉化成事件,接着交給 SCF 處理。

而大家也知道,使用那種最 "Raw"SCF 寫法,遠不如我們直接使用一些傳統的web框架,來的簡單方便

// 最`"Raw"`的寫法
exports.main_handler = async (event, context) => {
    // do sth ...
    return event
};

此時就輪到 tencent-framework-components 登場了,它裏面提供了許多框架的兼容方案,比如 nodejsexpress , koa 之類的兼容方案,也不一一列舉了。

然而原先 web框架都是直接處理 http 請求,那麼如何讓他們去處理轉化好的 event 呢?答案很簡單,當我們查看這些的源碼的時候,可以看到它們是在 SCF 內部,把 event 又轉化成了 http 請求, 交給那些 web 框架去做處理的,響應類似,所以這就造成了原先的方案,轉換鏈路長,性能損耗多的情況。

現在

一個很大的優勢在於,API網關 檢測到後端類型是 Web函數SCF,後, 就會把 原生http請求 直接透傳了 , 減少了中間無意義的轉化。而且現在也更加的不限制開發框架了。

比如像原先要給每個不同的語言的框架組件,寫一個事件轉化的 "墊片", 現在也不需要了。這會導致那些提供 web 服務的組件逐漸被淘汰,畢竟這可是 runtime 層面上的優化,天生優勢就很大。至於 Web 函數的編寫體驗,這方面, 由於個人一直是在 SCF 的容器鏡像裏進行開發的,而且也有方案改善體驗,所以這塊沒有感受到

在 SCF 環境裏開發的話,從這裏把鏡像拉下來,利用 vscode + Remote - Containers開發起來也非常方便。

還有一點體驗上的優化,原先組件的方式部署,往往需要我們要提供一個 sls.js 文件作爲組件的入口, 用它把 Web Server 實例暴露出去,現在也不需要了。因爲函數環境內,有內置的 Proxy , 它用來轉發請求到我們 Web Server 的監聽端口那。我們只需要提供一個 scf_bootstrap 啓動文件,把 Web Server 跑起來就行。

總結一下就是,原先暴露 Web Server 實例,現在暴露 Web Server 監聽端口。

02. Custom image

Custom image 的開發體驗上就要比 Custom runtime 好多了,使用方式也很簡單

騰訊雲控制檯 -> 雲產品 -> 容器服務 -> 鏡像倉庫 -> 個人/企業版 裏 推送鏡像就能部署了

在我們 新建命名空間和鏡像(私有!)後,就會 生成一個 鏡像地址 (namespace/reponame)

點進去,裏面有 使用指引, docker loginusername 就是我們騰訊雲的 APPID ,password 可以在 我的鏡像 那裏隨便設置

本地構建好鏡像之後,就可以直接發佈到個人的鏡像倉庫裏,非常方便

另外,它也支持從 github,gitlab,coding 那裏直接構建(筆者沒有嘗試)

03. Web function + Custom image

這裏就通過一個 ASP.NET Core 項目部署到 SCF 爲例

原因很簡單, 因爲 Web function 目前是不帶 dotnet 這個標準語言環境的,見 文檔

我們新建一個ASP.NET Core項目, 在裏面添加 Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /src
COPY ["BlazorApp.csproj", ""]
RUN dotnet restore "./BlazorApp.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "BlazorApp.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "BlazorApp.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "BlazorApp.dll", "--urls" , "http://0.0.0.0:9000"]

最後一行暴露監聽端口9000

然後發佈到騰訊雲的個人倉庫裏就能使用了。

接着,由於還是在內測,Serverless Framework 還沒有跟上,所以我們還是要去 控制檯 UI 上手工點點的:

然後就部署成功了。附部署成功後的訪問地址:https://service-11fd8pan-1257725330.cd.apigw.tencentcs.com

03. 總結

這兩個功能,還是大大提升了 SCF 的上限和開發者體驗的。就對我自己的影響來說,會拋棄很多的 SF 組件吧。

參考文檔:

Web 函數:https://cloud.tencent.com/document/product/583/56124

使用鏡像部署函數:https://cloud.tencent.com/document/product/583/56051

One More Thing

立即體驗騰訊雲 Serverless Demo,領取 Serverless 新用戶禮包 👉 騰訊雲 Serverless 新手體驗

歡迎訪問:Serverless 中文網

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章