在腾讯云云函数计算上部署.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:

这里我们把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 包
部署包准备好后,可以通过 云函数控制台 来创建和发布函数
在腾讯云云函数计算上部署.NET Core 3.1的更多相关文章
- 阿里云函数计算上部署.NET Core 3.1
使用阿里云ECS或者其他常见的VPS服务部署应用的时候,需要手动配置环境,并且监测ECS的行为,做补丁之类的,搞得有点复杂.好在很多云厂商(阿里云.Azure等)提供了Serverless服务,借助于 ...
- IIS上部署Net.Core
部署: 1.安装vc_redist.x64vc_redist.x64 2.安装DotNetCore.1.0.0.RC2-WindowsHosting 3.安装DotNetCore.1.0.0-SDK. ...
- So Easy - 在Linux服务器上部署 .NET Core App
.NET Core 是微软提供的免费.跨平台和开源的开发框架,可以构建桌面应用程序.移动端应用程序.网络应用程序.物联网应用程序和游戏应用程序等.如果你是 Windows 平台下的 dotnet 开发 ...
- 在IIS上部署 .Net Core 3.0 项目踩坑实录
在IIS上部署 .Net Core 3.0 项目的主要流程有: 安装并启用IIS 安装AspNetCoreModuleV2 添加.配置网站 设置应用程序池 通过VS发布 一.安装并启用IIS: 安装了 ...
- 在CentOS 8 上 部署 .Net Core 应用程序
在Centos 8 上 部署 .Net Core 应用程序 -- 记录篇 1.更新dnf 源 1 dnf update 2.安装 Asp.Net Core 运行时 1 dnf install ...
- 在腾讯云&阿里云上部署JavaWeb项目(Tomcat+MySQL)
之前做项目都是在本地跑,最近遇到需要在在云服务器(阿里云或者腾讯云都可以,差不多)上部署Java Web项目的问题,一路上遇到了好多坑,在成功部署上去之后写一下部署的步骤与过程,一是帮助自己总结记忆, ...
- ASP.NET Core学习之四 在CentOS上部署.net core
一.安装CentOs 以前在大学学过linux,但是对命令行总是有一种深深的排斥感,几年之后,还是又回来了. 1.下载 现在没法FQ,就算是FQ网速也是蜗牛一样慢,我使用阿里云的镜像站进行下载速度还是 ...
- 【netcore入门】在Windows IIS上部署.NET Core 2.1项目
部署之前先检查下面2个先决条件是否满足 1.安装了 IIS 模块 win7 在 控制面板→程序和功能→打开或关闭Windows功能→勾选Internet 信息服务(Internet Informati ...
- CentOS7系统上部署.net core程序
一.准备工作 首先安装 xshell 和 xftp ,前者用于SSH连接Linux服务器,后者用于FTP上传下载文件. xshell和xftp个人使用是免费的,下载地址 之后分别输入用户名和密码登录主 ...
随机推荐
- C#LeetCode刷题之#122-买卖股票的最佳时机 II(Best Time to Buy and Sell Stock II)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4032 访问. 给定一个数组,它的第 i 个元素是一支给定股票第 ...
- 存储系列之 从ext2到ext3、ext4 的变化与区别
引言:ext3 和 ext4 对 ext2 进行了增强,但是其核心设计并没有发生变化.所以建议先查看上上篇的<存储系列之 Linux ext2 概述 >,有了ext2的基础,看这篇就是so ...
- python设计模式之责任链模式
python设计模式之责任链模式 开发一个应用时,多数时候我们都能预先知道哪个方法能处理某个特定请求.然而,情况并非总是如此.例如,想想任意一种广播计算机网络,例如最早的以太网实现.在广播计算机网络中 ...
- 解决React路由跳转时出现的红色警告: Warning: Failed prop type: Invalid prop `component` of type `object` supplied to `Route`, expected `function`.
一.报警如图: 二.查找路由版本 我使用路由版本是4.3.1的,然后我测试所有4.0+版本都会出现以上警告. 三.未解决前的代码 三.我又解读了一下报警告内容的大致意思:就是props需要通过函数返回 ...
- aarch64 packages 地址链接收集
1.http://dl.fedoraproject.org/pub/epel/7/aarch64 2.https://rpmfind.net/linux/epel/7/aarch64/ 3.http: ...
- 2020.5.27 第七篇 Scrum冲刺博客
Team:银河超级无敌舰队 Project:招新通 项目冲刺集合贴:链接 目录 一.每日站立会议 1.1 会议照片 1.2 项目完成情况 二.项目燃尽图 三.签入记录 3.1 代码/文档签入记录 3. ...
- 关于函数式接口, printable 自定义
这段代码在jdk1.8可以使用, 由于我是jdk14, 会报错. 这里可以优化, lambda表达式进一步优化写为: printString(System.Out::println); 注意案例版 ...
- iOS多线程之GCD、OperationQueue 对比和实践记录
[toc] 简介 在计算的早期,计算机可以执行的最大工作量是由 CPU 的时钟速度决定的.但是随着技术的进步和处理器设计的紧凑化,热量和其他物理约束开始限制处理器的最大时钟速度.因此,芯片制 ...
- Java8中的Stream API
本篇文章继续介绍Java 8的另一个新特性——Stream API.新增的Stream API与InputStream和OutputStream是完全不同的概念,Stream API是对Java中集合 ...
- File类 -《学堂在线》
File类的作用 ·创建.删除文件: ·重命名文件:判断文件的读写权限及是否存在: ·设置和查询文件的最近修改时间等: ·构造文件流可以使用File类的对象作为参数. //: FileTester.j ...