zoukankan      html  css  js  c++  java
  • 在腾讯云云函数计算上部署.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:

    image

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

    image

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

    image

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

    image

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

    image

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

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

  • 相关阅读:
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark RDD(Resilient Distributed Datasets)论文
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    【机器学习实战】第10章 K-Means(K-均值)聚类算法
    [译]flexbox全揭秘
  • 原文地址:https://www.cnblogs.com/shanyou/p/scf-dotnet-customruntime.html
Copyright © 2011-2022 走看看