云厂商(腾讯云、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 后续会开源,欢迎你的持续关注。

在腾讯云云函数计算上部署.NET Core 3.1相关推荐

  1. 在阿里云函数计算上部署.NET Core 3.1

    使用阿里云ECS或者其他常见的VPS服务部署应用的时候,需要手动配置环境,并且监测ECS的行为,做补丁之类的,搞得有点复杂.好在很多云厂商(阿里云.Azure等)提供了Serverless服务,借助于 ...

  2. 在CentOS7上部署.net core 控制台应用程序部署为后台服务

    在CentOS7上部署.net core 控制台app为后台服务 转载于:https://www.cnblogs.com/wangwust/p/9821547.html

  3. IIS上部署Net.Core

    部署: 1.安装vc_redist.x64vc_redist.x64 2.安装DotNetCore.1.0.0.RC2-WindowsHosting 3.安装DotNetCore.1.0.0-SDK. ...

  4. 在IIS上部署.net core的webapi项目 以及502.5错误的两种解决方法

    在IIS上部署.net core的webapi项目 以及502.5错误的两种解决方法 参考文章: (1)在IIS上部署.net core的webapi项目 以及502.5错误的两种解决方法 (2)ht ...

  5. Linux系统上部署dotnet core

    Linux系统上部署dotnet core 主要步骤如下: 安装linux Linux下安装dotnet core环境 Linux下部署dotnet core系统 主要步骤如下: 因我公司需要,做一个 ...

  6. 从零开始在 Windows 上部署 .NET Core 到 Kubernetes

    本章节所有代码已上传至:https://github.com/Seanwong933/.NET-Core-on-Kubernetes 文末附有本人遇到过的 Docker 和 k8s 的故障排除. 本文 ...

  7. 【腾讯轻量应用服务器上部署kafka并通过flink读取kafka数据】

    环境准备 经过1个月的摸索,最终选择在腾讯云上搭建一个学习环境.当时选择原因还是新用户有优惠(150左右3年),但现在看1核2g的配置勉强够用,建议后续小伙伴选择时最好是2核4g配置. 由于是单节点安 ...

  8. 阿里云服务器web项目启动连接mysql_在腾讯云阿里云上部署JavaWeb项目(Tomcat+MySQL)...

    云服务器安装Tomcat 安装Tomcat有好多种方式,可以在本地去Tomcat官网下载再用WinSCP上传到云服务器上,也可以直接在云服务器上命令行下载,本地下载再上传比较简单,就不多说了,说说用命 ...

  9. 第二章 在Linux上部署.net core

    项目目标部署环境:CentOS 7+ 项目技术点:.netcore2.0 + Autofac +webAPI + NHibernate5.1 + mysql5.6 + nginx 开源地址:https ...

最新文章

  1. tomcat8 启动项目pom.xml配置
  2. mysql 查询执行过的sql_查看mysql已经执行过的sql语句
  3. hyper-v 安装centos7 后,虚拟机无法访问网络。
  4. Unable to find the requested .Net Framework Data Provider
  5. 使用Docker实现vsftpd配置——用户验证访问上传
  6. Ubuntu桌面远程工具
  7. DVR硬盘录像机技术
  8. 到底要不要去外包公司?这篇带你全面了解外包那些坑!
  9. python学习之——假人配对
  10. iOS图片加载策略的简单实现
  11. 基于android的校园新闻app,移动端校园新闻APP的设计探析
  12. iOS视频通话问题总结及心路历程。。。
  13. Matlab实现曲线拟合的最小二乘法
  14. 2022淘宝天猫年货节超级红包攻略
  15. 模拟卷Leetcode【普通】377. 组合总和 Ⅳ
  16. 【驱动代码移植高通平台之二十三】高通平台i2c设备驱动
  17. 猿人学第四题-CSS加密【雪碧图、样式干扰】
  18. 手把手教你如何设置H5页面动画效果
  19. Eclipse中新建项目前打红色差号“X”处理方法
  20. 宝安区2021年高考成绩查询入口,宝安区2021年学位申请房屋锁定网上查询说明(附入口)...

热门文章

  1. PAT 1042. 字符统计
  2. 第五周软件工程作业-每周例行报告
  3. 62、滑动窗口的最大值
  4. hibernate -- hello world
  5. 极光推送 api ios参数问题
  6. linux oracle手动启动两个实例
  7. win10任务栏和开始菜单_如何将网站固定到Windows 10任务栏或开始菜单
  8. 保存页面供以后使用Firefox的阅读列表扩展
  9. chromebook刷机_如何将网站添加到您的Chromebook架子上
  10. python应用POP3、IMAP、SMTP 协议,获取邮箱验证码