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

  • 相关阅读:
    Hdu 1257最少拦截系统
    删除mysql__转
    sql 入门的小例子熟悉一下_这可是一个转转转贴 :)
    header 用法_转
    java_json 转换 文件在file中
    javascript_php 正则匹配 转
    mysql 忘记密码转_kinghu
    php 通用下载
    明天就是新年开始
    翻译 有助于程序命名
  • 原文地址:https://www.cnblogs.com/shanyou/p/scf-dotnet-customruntime.html
Copyright © 2011-2022 走看看