在腾讯云云函数计算上部署.NET Core 3.1
云廠商(騰訊云、Azure等)提供了Serverless服務(wù),借助于Serverless,開發(fā)人員可以更加專注于代碼的開發(fā),減少運維的成本。騰訊云的函數(shù)計算提供了很多運行庫,對.NET的支持需要通過custom runtime 來支持,可以支持任何版本的.NET Core,也就是需要自定義runtime,需要使用到函數(shù)計算的custom runtime功能,具體參見https://cloud.tencent.com/document/product/583/47274。本文主要介紹一下使用ASP.NET CORE 3.1部署在騰訊云Serverless(函數(shù)計算)的內(nèi)容。
C#語言由于需要編譯后才可以在 CoreCLR 虛擬機中運行。因此在 SCF 中的使用方式,和 Python、Node.js 這類腳本型語言不同,和Java一樣有如下限制:
不支持上傳代碼:使用 C# 語言,僅支持上傳已經(jīng)開發(fā)完成,編譯打包后的 zip 包。SCF 環(huán)境不提供 C# 的編譯能力。
不支持在線編輯:不能上傳代碼,所以不支持在線編輯代碼。CoreCLR 運行時的函數(shù),在代碼頁面僅能看到再次通過頁面上傳或 COS 提交代碼的方法。
自定義.NET Custom runtime
Custom Runtime的封裝工作就是要把各種trigger 的事件封裝一個.NET Standard庫,開發(fā)云函數(shù)。自 .NET Core 2.0 開始, 提供了名為 IHostedService 的新接口,有助于輕松實現(xiàn)托管服務(wù),文章《ASP.NET Core 3.x控制IHostedService啟動順序淺探》有深入的實現(xiàn)分析,基于IHostedService 實現(xiàn)一個SCFHostService:
這里我們把SCF的Custom Runtime 抽象到ISCFHost 中
在SCFHost 類中完成Custom Runtime的業(yè)務(wù)處理,接收來自SCF 的事件,轉(zhuǎn)發(fā)給函數(shù)進行處理,函數(shù)處理的接口 IFunctionInvoker:
默認實現(xiàn)了FunctionInvoker 把請求信息 返回給 SCF:
responseBody 代表了SCF函數(shù)的不同Trigger事件信息,我們可以根據(jù)不同的Trigger 定義不同的處理函數(shù),例如我們處理HttpTrigger的函數(shù)為HttpFunctionInvoker:
上面我們已經(jīng)完成了最小的MVP封裝,利用.NET Core的依賴注入容器封裝起來,我們定義了一個ISCFBuilder 來組裝函數(shù)的配置和服務(wù):
SCF 云函數(shù)開發(fā)
我們使用.NET Core的控制臺程序來開發(fā)云函數(shù),創(chuàng)建一個控制臺程序, 引用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 可以添加函數(shù)的依賴服務(wù),例如上面例子中的EasyCaching 以及函數(shù)的服務(wù), 關(guān)鍵的一句是? scfbuilder.Services.AddTransient<IFunctionInvoker, JobsHttpFunctionInvoker>();? 把函數(shù)的處理邏輯使用JobsHttpFunctionInvoker 進行注入。把函數(shù)的配置放到appsettings.json。
現(xiàn)在SCF 云函數(shù)有個問題是本地Windows開發(fā)問題,本地的函數(shù)邏輯的測試可以通過單元測試進行。還有函數(shù)打包必須在Linux環(huán)境下進行。
?
云函數(shù)部署
創(chuàng)建 bootstrap 文件
bootstrap 是運行時入口引導(dǎo)程序文件,Custom Runtime 加載函數(shù)時固定檢索 bootstrap 同名文件,并執(zhí)行該程序來啟動 Custom Runtime 運行時。Custom Runtime 支持任意語言及版本開發(fā)運行函數(shù),主要基于 bootstrap 引導(dǎo)程序由開發(fā)者自定義實現(xiàn)。其中,bootstrap 需具備以下條件:
需具有可執(zhí)行權(quán)限。
能夠在 SCF 系統(tǒng)環(huán)境(CentOS 7.6)中運行。
下面這個是 .NET Core 3.1的云函數(shù) 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 就是我們開發(fā)的函數(shù)文件。
成功創(chuàng)建 bootstrap 和?函數(shù)文件?后,目錄結(jié)構(gòu)如下所示:
├ bootstrap
└ index
需要在Linux 下執(zhí)行以下命令,設(shè)置文件可執(zhí)行權(quán)限,并將其添加至 ZIP 包?
部署包準備好后,可以通過?云函數(shù)控制臺?來創(chuàng)建和發(fā)布函數(shù)?
基于騰訊云 CustomRuntime的.NET 封裝的開發(fā)SDK 后續(xù)會開源,歡迎你的持續(xù)關(guān)注。
總結(jié)
以上是生活随笔為你收集整理的在腾讯云云函数计算上部署.NET Core 3.1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构与算法专题——第十题 输入法跳不
- 下一篇: MassTransit Get Star