VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > c#编程 >
  • C#关于Azure Functions——无服务器函数创建

第五部分:云原生与无服务器开发

  1. Azure Functions——无服务器函数创建
    实例介绍
    之前做电商后台的订单通知功能时,用传统的Windows服务实现,需要一直运行服务器,资源利用率低,维护成本高。换成Azure Functions后,只有当有新订单时才触发函数执行,按执行次数计费,每月成本不到10元,而且不需要维护服务器,开发效率提升80%。这节就带你从零实现Azure Functions无服务器函数,包括计时器触发、HTTP触发、Blob存储vb.net教程C#教程python教程SQL教程access 2010教程触发、队列触发、数据库触发,覆盖无服务器函数的核心场景。
    需求分析
    Azure Functions要解决“事件驱动计算、按需付费、无服务器维护、弹性扩展、多场景触发”的问题,具体需求如下:
    1.多场景触发:支持HTTP、计时器、Blob存储、队列、数据库、IoT Hub等多种触发方式;
    2.无服务器维护:不需要管理服务器,Azure自动处理资源分配、扩展、故障恢复;
    3.按需付费:按函数执行次数和资源使用时间计费,闲置时不收费;
    4.弹性扩展:根据请求数量自动扩展函数实例,支持高并发场景;
    5.语言支持:支持C#、JavaScript、Python、Java等多种语言;
    6.集成能力:与Azure其他服务(如Blob存储、队列、SQL数据库、Cosmos DB)无缝集成;
    7.本地开发:支持本地开发、调试,部署到Azure云;
    8.持久化函数:支持长时间运行的无服务器工作流(如订单处理、数据同步);
    9.监控与日志:集成Azure Monitor,实时监控函数执行情况、查看日志;
    10.安全:支持身份验证、授权、加密,保护函数和数据安全;
    代码实现
    前置条件:.NET 8 SDK;Azure Functions Core Tools v4;Azure账户(免费试用即可);需安装以下NuGet包:
    Microsoft.Azure.Functions.Worker:Azure Functions Worker核心包
    Microsoft.Azure.Functions.Worker.Sdk:Azure Functions SDK
    Microsoft.Azure.Functions.Worker.Extensions.Http:HTTP触发扩展
    Microsoft.Azure.Functions.Worker.Extensions.Timer:计时器触发扩展
    Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs:Blob存储触发扩展
    场景1:项目创建与基础结构搭建
    从零创建Azure Functions项目,了解项目结构和核心文件。
    步骤1:创建Azure Functions项目
    1.打开Visual Studio → 新建项目 → 搜索“Azure Functions” → 选择“Azure Functions”模板;
    2.命名项目为AzureFunctionsDemo → 选择.NET 8框架;
    3.选择函数模板:“HTTP触发器” → 授权级别选择“匿名” → 点击“创建”;
    步骤2:项目结构说明
    Functions目录:存放所有函数(如HttpTriggerFunction.cs);
    local.settings.json:本地开发配置(如连接字符串、环境变量);
    host.json:函数应用全局配置(如日志级别、并发设置);
    Program.cs:函数应用启动配置,注册服务、添加中间件;
    步骤3:运行本地函数
    1.点击“调试”按钮,函数应用启动后,控制台会显示函数的URL(如http://localhost:7071/api/HttpTriggerFunction);
    2.用Postman或浏览器访问该URL,传递参数?name=张三,函数会返回Hello, 张三;
    场景2:HTTP触发器函数(创建Web API)
    实现HTTP触发器函数,创建无服务器Web API,支持GET、POST请求。
    步骤1:创建HTTP触发器函数(Functions/HttpTriggerFunction.cs)
    csharp
	using Microsoft.Azure.Functions.Worker;
	using Microsoft.Azure.Functions.Worker.Http;
	using Microsoft.Extensions.Logging;
	
	namespace AzureFunctionsDemo.Functions;
	
	public class HttpTriggerFunction
	{
	private readonly ILogger<HttpTriggerFunction> _logger;
	
	public HttpTriggerFunction(ILogger<HttpTriggerFunction> logger)
	{
	_logger = logger;
	}
	
	// HTTP触发器函数,支持GET和POST请求
	[Function("HttpTriggerFunction")]
	public HttpResponseData Run(
	[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = "hello/{name?}")] HttpRequestData req,
	string? name, // 从路由获取参数
	FunctionContext executionContext)
	{
	_logger.LogInformation("C# HTTP trigger function processed a request.");
	
	// 处理GET请求
	if (req.Method == "GET")
	{
	var response = req.CreateResponse(System.Net.HttpStatusCode.OK);
	response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
	
	string responseMessage = string.IsNullOrEmpty(name)
	? "请在路由中传递name参数,例如:/hello/张三"
	: $"Hello, {name}!这是GET请求返回的消息。";
	
	response.WriteString(responseMessage);
	return response;
	}
	
	// 处理POST请求
	else if (req.Method == "POST")
	{
	var response = req.CreateResponse(System.Net.HttpStatusCode.OK);
	response.Headers.Add("Content-Type", "application/json; charset=utf-8");
	
	// 读取请求体
	string requestBody = new StreamReader(req.Body).ReadToEnd();
	var responseMessage = new
	{
	Message = "POST请求处理成功!",
	RequestBody = requestBody,
	Timestamp = DateTime.Now
	};
	
	response.WriteAsJsonAsync(responseMessage);
	return response;
	}
	
	// 其他请求方法
	else
	{
	var response = req.CreateResponse(System.Net.HttpStatusCode.MethodNotAllowed);
	response.WriteString("只支持GET和POST请求!");
	return response;
	}
	}
	}

[Function("HttpTriggerFunction")]:标记为Azure Functions函数,函数名为HttpTriggerFunction;
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = "hello/{name?}")]:HTTP触发器配置,授权级别为匿名,支持GET和POST请求,路由为/hello/{name?}(name为可选参数);
HttpRequestData req:HTTP请求对象,包含请求方法、头、体、参数等;
FunctionContext executionContext:函数执行上下文,包含函数名称、执行ID、日志等;
场景3:计时器触发器函数(定时任务)
实现计时器触发器函数,执行定时任务(如每天凌晨备份数据库、每小时同步数据)。
步骤1:创建计时器触发器函数(Functions/TimerTriggerFunction.cs)
csharp

	using Microsoft.Azure.Functions.Worker;
	using Microsoft.Extensions.Logging;
	
	namespace AzureFunctionsDemo.Functions;
	
	public class TimerTriggerFunction
	{
	private readonly ILogger<TimerTriggerFunction> _logger;
	
	public TimerTriggerFunction(ILogger<TimerTriggerFunction> logger)
	{
	_logger = logger;
	}
	
	// 计时器触发器函数,每5分钟执行一次
	[Function("TimerTriggerFunction")]
	public void Run(
	[TimerTrigger("0 */5 * * * *")] TimerInfo myTimer, // CRON表达式:秒 分 时 日 月 周
	FunctionContext executionContext)
	{
	_logger.LogInformation("C# Timer trigger function executed at: {time}", DateTime.Now);
	
	// 执行定时任务逻辑,如备份数据库、同步数据
	if (myTimer.ScheduleStatus is not null)
	{
	_logger.LogInformation("Next timer schedule at: {nextTime}", myTimer.ScheduleStatus.Next);
	}
	}
	}

[TimerTrigger("0 */5 * * * *")]:计时器触发器配置,CRON表达式0 */5 * * * *表示每5分钟执行一次;
CRON表达式格式:秒 分 时 日 月 周(如0 0 2 * * *表示每天凌晨2点执行一次);
TimerInfo myTimer:计时器信息对象,包含上次执行时间、下次执行时间等;
场景4:Blob存储触发器函数(文件上传处理)
实现Blob存储触发器函数,当有文件上传到Azure Blob存储时触发函数,处理文件(如解析CSV、压缩图片、提取文本)。
步骤1:创建Blob存储触发器函数(Functions/BlobTriggerFunction.cs)
csharp

	using Microsoft.Azure.Functions.Worker;
	using Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs;
	using Microsoft.Extensions.Logging;
	
	namespace AzureFunctionsDemo.Functions;
	
	public class BlobTriggerFunction
	{
	private readonly ILogger<BlobTriggerFunction> _logger;
	
	public BlobTriggerFunction(ILogger<BlobTriggerFunction> logger)
	{
	_logger = logger;
	}
	
	// Blob存储触发器函数,当有文件上传到input容器时触发
	[Function("BlobTriggerFunction")]
	public void Run(
	[BlobTrigger("input/{name}", Connection = "AzureWebJobsStorage")] string blobContent, // Blob文件内容
	string name, // Blob文件名
	FunctionContext executionContext)
	{
	_logger.LogInformation("C# Blob trigger function processed a blob: {name}", name);
	_logger.LogInformation("Blob content length: {length} characters", blobContent.Length);
	
	// 执行文件处理逻辑,如解析CSV、压缩图片、提取文本
	// 示例:将文件内容转换为大写,保存到output容器
	string processedContent = blobContent.ToUpper();
	// 这里可以使用BlobServiceClient将处理后的内容保存到output容器
	}
	}

[BlobTrigger("input/{name}", Connection = "AzureWebJobsStorage")]:Blob存储触发器配置,监听input容器,当有文件上传时触发;
string blobContent:Blob文件的内容(文本文件),如果是二进制文件,可使用byte[]或Stream;
string name:Blob文件名,通过绑定参数获取;
Connection = "AzureWebJobsStorage":指定Azure存储连接字符串,从local.settings.json中读取;
场景5:队列触发器函数(异步任务处理)
实现队列触发器函数,当有消息发送到Azure队列时触发函数,处理异步任务(如发送邮件、生成报表、处理订单)。
步骤1:创建队列触发器函数(Functions/QueueTriggerFunction.cs)
csharp

	using Microsoft.Azure.Functions.Worker;
	using Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues;
	using Microsoft.Extensions.Logging;
	
	namespace AzureFunctionsDemo.Functions;
	
	public class QueueTriggerFunction
	{
	private readonly ILogger<QueueTriggerFunction> _logger;
	
	public QueueTriggerFunction(ILogger<QueueTriggerFunction> logger)
	{
	_logger = logger;
	}
	
	// 队列触发器函数,当有消息发送到orderqueue队列时触发
	[Function("QueueTriggerFunction")]
	public void Run(
	[QueueTrigger("orderqueue", Connection = "AzureWebJobsStorage")] string myQueueItem, // 队列消息内容
	FunctionContext executionContext)
	{
	_logger.LogInformation("C# Queue trigger function processed a message: {message}", myQueueItem);
	
	// 执行异步任务逻辑,如发送邮件、生成报表、处理订单
	// 示例:解析订单消息,发送通知邮件
	try
	{
	var order = Newtonsoft.Json.JsonConvert.DeserializeObject<Order>(myQueueItem);
	_logger.LogInformation("处理订单:{orderId},客户:{customerName}", order.OrderId, order.CustomerName);
	// 调用邮件服务发送通知
	}
	catch (Exception ex)
	{
	_logger.LogError("处理订单失败:{error}", ex.Message);
	// 可以将失败的消息重新放入队列,或发送到死信队列
	}
	}
	
	// 订单消息模型
	public class Order
	{
	public string OrderId { get; set; } = string.Empty;
	public string CustomerName { get; set; } = string.Empty;
	public decimal TotalAmount { get; set; }
	public DateTime OrderTime { get; set; }
	}
	}

[QueueTrigger("orderqueue", Connection = "AzureWebJobsStorage")]:队列触发器配置,监听orderqueue队列,当有消息发送时触发;
string myQueueItem:队列消息的内容(JSON字符串);
异步任务处理:适合处理耗时的任务,避免阻塞主流程,提高系统响应速度;
场景6:部署到Azure云
将本地开发的函数部署到Azure云,实现无服务器运行。
步骤1:创建Azure函数应用
1.登录Azure门户(https://portal.azure.com);
2.点击“创建资源” → 搜索“函数应用” → 点击“创建”;
3.配置函数应用:
订阅:选择你的Azure订阅;
资源组:创建新的资源组(如AzureFunctionsDemoRG);
函数应用名称:全局唯一名称(如azurefunctionsdemo2026);
发布:选择“代码”;
运行时堆栈:选择“.NET 8”;
区域:选择靠近你的区域(如“东亚”);
操作系统:选择“Windows”;
托管计划:选择“消耗计划”(按需付费,弹性扩展);
4.点击“查看+创建” → “创建”,等待函数应用创建完成;
步骤2:部署函数到Azure
1.在Visual Studio中右键项目 → 选择“发布”;
2.选择“Azure” → “Azure函数应用(Windows)” → 选择刚才创建的函数应用 → 点击“完成”;
3.点击“发布”,等待部署完成;
4.部署完成后,在Azure门户中查看函数应用,测试函数是否正常运行;
逐行讲解
场景2:HTTP触发器核心代码
1.AuthorizationLevel:
Anonymous:不需要身份验证,任何人都可以访问;
Function:需要使用函数密钥访问;
Admin:需要使用管理员密钥访问;
2.Route参数:
Route = "hello/{name?}":自定义路由,{name?}表示可选参数,访问URL为https://<函数应用名称>.azurewebsites.net/api/hello/张三;
3.HttpRequestData:
o包含请求方法、头、体、参数等信息,可通过req.Query获取查询参数,req.Body获取请求体;
场景3:计时器触发器核心代码
1.CRON表达式:
o格式:秒 分 时 日 月 周,支持通配符(*)、范围(-)、间隔(/);
o示例:
0 0 2 * * *:每天凌晨2点执行一次;
0 */5 * * * *:每5分钟执行一次;
0 0 9-17 * * 1-5:工作日9点到17点,每小时执行一次;
2.TimerInfo:
ScheduleStatus.Next:下次执行时间;
ScheduleStatus.Last:上次执行时间;
ScheduleStatus.LastUpdated:上次更新时间;
场景4:Blob存储触发器核心代码
1.Blob绑定参数:
{name}:绑定Blob文件名,可在函数中通过string name获取;
支持路径模式,如input/{folder}/{name},监听input文件夹下的所有子文件夹;
2.Blob内容绑定:
文本文件可绑定到string,二进制文件可绑定到byte[]或Stream;
可绑定到BlobClient,直接操作Blob存储;
基础知识拓展

  1. Azure Functions托管计划
    托管计划 特点 适用场景
    消耗计划 按需付费,弹性扩展,闲置时不收费 低频率、突发请求的场景,如订单通知、定时任务
    高级计划 预留资源,支持VNet集成、冷启动优化 高频率、低延迟的场景,如Web API、实时数据处理
    专用计划(App Service计划) 与App Service共享资源,支持自定义虚拟机 需要与App Service应用集成的场景,或需要自定义配置的场景
  2. 触发器与绑定概念
    触发器:触发函数执行的事件(如HTTP请求、计时器、Blob上传);
    绑定:函数与Azure服务之间的连接,支持输入绑定(获取数据)和输出绑定(发送数据);
    示例:HTTP触发器是输入绑定,队列输出绑定是输出绑定,函数可同时有多个触发器和绑定;
  3. 持久化函数(Durable Functions)
    支持长时间运行的无服务器工作流,如订单处理、数据同步、审批流程;
    核心概念:
    编排器函数:定义工作流的步骤,调用活动函数;
    活动函数:执行具体的任务,如调用API、处理数据;
    实体函数:管理状态的函数,支持并发访问;
  4. 监控与日志
    Azure Monitor:实时监控函数执行情况,查看请求次数、响应时间、错误率;
    Application Insights:集成到函数应用,提供详细的日志、性能分析、异常跟踪;
    函数日志:可在Azure门户中查看函数的执行日志,或通过func logs命令在本地查看;
  5. 最佳实践
    1.函数职责单一:每个函数只做一件事,如处理订单通知、解析CSV文件;
    2.避免长时间运行:消耗计划中函数执行时间限制为10分钟,长时间运行的任务应使用持久化函数;
    3.使用异步代码:异步执行任务,提高函数的并发处理能力;
    4.缓存数据:频繁访问的数据可缓存到内存或Redis,减少外部服务调用;
    5.错误处理:捕获异常,处理失败的请求,可将失败的消息重新放入队列;
    总结
    Azure Functions的核心是事件驱动计算、无服务器维护、按需付费、弹性扩展,让你专注于业务逻辑,不需要管理服务器,降低成本,提高开发效率。关键要点:
    1.多场景触发:支持HTTP、计时器、Blob存储、队列、数据库等多种触发方式;
    2.无服务器维护:Azure自动处理资源分配、扩展、故障恢复;
    3.按需付费:按执行次数和资源使用时间计费,闲置时不收费;
    4.弹性扩展:根据请求数量自动扩展函数实例,支持高并发场景;
    5.集成能力:与Azure其他服务无缝集成,快速构建复杂的无服务器应用;
    比如这个Azure Functions订单通知功能,只有当有新订单时才触发函数执行,每月成本不到10元,而且不需要维护服务器,开发效率提升80%。掌握Azure Functions,你就能用无服务器架构构建所有类型的应用,从简单的定时任务到复杂的企业级系统!

本站原创,转载请注明出处:


相关教程