以下內容來自「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
登場了,它裏面提供了許多框架的兼容方案,比如 nodejs
有 express
, 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 login
時 username
就是我們騰訊雲的 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 中文網!