前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在腾讯云云函数计算上部署.NET Core 3.1

在腾讯云云函数计算上部署.NET Core 3.1

原创
作者头像
张善友
修改2020-09-14 10:32:11
1.3K0
修改2020-09-14 10:32:11
举报
文章被收录于专栏:腾讯云TVP腾讯云TVP

云厂商(腾讯云、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:

image
image

这里我们把SCF的Custom Runtime 抽象到ISCFHost 中

image
image

在SCFHost 类中完成Custom Runtime的业务处理,接收来自SCF 的事件,转发给函数进行处理,函数处理的接口 IFunctionInvoker:

image
image

默认实现了FunctionInvoker 把请求信息 返回给 SCF:

image
image

responseBody 代表了SCF函数的不同Trigger事件信息,我们可以根据不同的Trigger 定义不同的处理函数,例如我们处理HttpTrigger的函数为HttpFunctionInvoker:

image
image

上面我们已经完成了最小的MVP封装,利用.NET Core的依赖注入容器封装起来,我们定义了一个ISCFBuilder 来组装函数的配置和服务:

image
image
image
image

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 后续会开源,欢迎你的持续关注。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建 bootstrap 文件
相关产品与服务
云函数
云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境,帮助您在无需购买和管理服务器的情况下运行代码。您只需使用平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性、安全地运行代码。云函数是实时文件处理和数据处理等场景下理想的计算平台。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档