在騰訊云云函式計算上部署.NET Core 3.1
雲廠商(騰訊雲、Azure等)提供了Serverless服務,藉助於Serverless,開發人員可以更加專注於程式碼的開發,減少運維的成本。騰訊雲的函式計算提供了很多執行庫,對.NET的支援需要通過custom runtime 來支援,可以支援任何版本的.NET Core,也就是需要自定義runtime,需要使用到函式計算的custom runtime功能,具體參見https://cloud.tencent.com/document/product/583/47274。 本文主要介紹一下使用ASP.NET CORE 3.1部署在騰訊雲Serverless(函式計算)的內容。
C#語言由於需要編譯後才可以在 CoreCLR 虛擬機器中執行。因此在 SCF 中的使用方式,和 Python、Node.js 這類指令碼型語言不同,和Java一樣有如下限制:
- 不支援上傳程式碼:使用 C# 語言,僅支援上傳已經開發完成,編譯打包後的 zip 包。SCF 環境不提供 C# 的編譯能力。
- 不支援線上編輯:不能上傳程式碼,所以不支援線上編輯程式碼。CoreCLR 執行時的函式,在程式碼頁面僅能看到再次通過頁面上傳或 COS 提交程式碼的方法。
自定義.NET Custom runtime
Custom Runtime的封裝工作就是要把各種trigger 的事件封裝一個.NET Standard庫,開發雲函式。自 .NET Core 2.0 開始, 提供了名為 IHostedService 的新介面,有助於輕鬆實現託管服務,文章《ASP.NET Core 3.x控制IHostedService啟動順序淺探》有深入的實現分析,基於IHostedService 實現一個SCFHostService:
這裡我們把SCF的Custom Runtime 抽象到ISCFHost 中
在SCFHost 類中完成Custom Runtime的業務處理,接收來自SCF 的事件,轉發給函式進行處理,函式處理的介面 IFunctionInvoker:
預設實現了FunctionInvoker 把請求資訊 返回給 SCF:
responseBody 代表了SCF函式的不同Trigger事件資訊,我們可以根據不同的Trigger 定義不同的處理函式,例如我們處理HttpTrigger的函式為HttpFunctionInvoker:
上面我們已經完成了最小的MVP封裝,利用.NET Core的依賴注入容器封裝起來,我們定義了一個ISCFBuilder 來組裝函式的配置和服務:
SCF 雲函式開發
我們使用.NET Core的控制檯程式來開發雲函式,建立一個控制檯程式, 引用Yhd.TencentCloud.SCF 包,把Program.cs 替換成類似程式碼:
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
using Yhd.FindJob;
using Yhd.TencentCloud.SCF.Executors;
public class Index
{
static async Task Main(string[] args)
{
var builder = new HostBuilder()
.ConfigureSCF((context, scfbuilder) =>
{
var configuration = scfbuilder.Configuration;
scfbuilder.Services.AddFindJob(configuration);
scfbuilder.Services.AddEasyCaching(options =>
{
options.UseInMemory();
//use redis cache that named redis
options.UseRedis(configuration)
.WithJson()
;
});
scfbuilder.Services.AddTransient<IFunctionInvoker, JobsHttpFunctionInvoker>();
})
.UseConsoleLifetime();
var host = builder.Build();
using (host)
{
await host.RunAsync();
}
}
}
通過ConfigureSCF 可以新增函式的依賴服務,例如上面例子中的EasyCaching 以及函式的服務, 關鍵的一句是 scfbuilder.Services.AddTransient<IFunctionInvoker, JobsHttpFunctionInvoker>(); 把函式的處理邏輯使用JobsHttpFunctionInvoker 進行注入。把函式的配置放到appsettings.json。
現在SCF 雲函式有個問題是本地Windows開發問題,本地的函式邏輯的測試可以通過單元測試進行。還有函式打包必須在Linux環境下進行。
雲函式部署
建立 bootstrap 檔案
bootstrap 是執行時入口載入程式檔案,Custom Runtime 載入函式時固定檢索 bootstrap 同名檔案,並執行該程式來啟動 Custom Runtime 執行時。Custom Runtime 支援任意語言及版本開發執行函式,主要基於 bootstrap 載入程式由開發者自定義實現。其中,bootstrap 需具備以下條件:
- 需具有可執行許可權。
- 能夠在 SCF 系統環境(CentOS 7.6)中執行。
下面這個是 .NET Core 3.1的雲函式 bootstrap 檔案
#!/bin/sh
echo "Start dotnet bootstrap ~~~"
export DOTNET_ROOT=/opt/rt
export PATH=$(pwd):/opt/rt:${PATH}
dotnet ./index/bin/Release/netcoreapp3.1/index.dll
index.dll 就是我們開發的函式檔案。
成功建立 bootstrap 和 函式檔案 後,目錄結構如下所示:
├ bootstrap
└ index
需要在Linux 下執行以下命令,設定檔案可執行許可權,並將其新增至 ZIP 包
部署包準備好後,可以通過 雲函式控制檯 來建立和釋出函式
基於騰訊雲 CustomRuntime的.NET 封裝的開發SDK 後續會開源,歡迎你的持續關