深入解析AzureFunctions:特性、安全、监控与集成
立即解锁
发布时间: 2025-08-25 00:50:37 阅读量: 1 订阅数: 4 

### 深入解析 Azure Functions:特性、安全、监控与集成
#### 一、Azure Functions 特性概述
Azure Functions 不仅能提供可执行代码供运行时处理,还支持更高级的场景,是快速开发且配置要求低的理想选择。
##### (一)平台特性
Azure Functions 基于 App Service 构建,可使用诸多已知特性,如自定义域名、应用设置以及身份验证/授权等。要访问所有可用的平台特性,可在 Azure 门户中进入函数应用,点击相应标签。其中,函数应用设置是一个特定功能,包含以下重要选项:
1. **每日使用配额(GB - Sec)**:可设置函数应用使用的硬性限制,确保不超过预设配额。
2. **运行时版本**:定义函数应用当前使用的运行时版本。注意,通常无法从 v1 更改为 beta(如 v2),因为新版本可能引入会破坏应用的更改。
3. **函数应用编辑模式**:若通过 CI/CD 管道部署函数,此设置将自动设为只读,保证运行时不通过自动化流程就无法进行更改。
4. **插槽(预览)**:用于执行蓝绿部署,若出现问题可快速回滚。能将新版本作为新实例部署,并立即与现有实例交换。
##### (二)安全
Azure Function 安全是重要话题。默认情况下,函数通过密钥进行安全保护。点击“管理”标签可查看可用密钥。根据函数触发方式不同,有两种类型的密钥:
1. **函数密钥**:专为特定函数设计,仅适用于由 HTTP 请求触发的函数。
2. **主机密钥**:可调用函数应用内的任何函数。
使用函数密钥授权请求有两种方式:
- **查询字符串**:例如 `https://handsonazurefunctionapp.azurewebsites.net/api/HttpTriggerJS1?code=awKhkdPqyQvYUwzn6zle6V4hqk460YwOBs9RyaQUthX/AWGBMjtRIA==`
- **请求头**:在请求头中添加 `x - functions - key` 字段,如
```plaintext
GET /api/HttpTriggerJS1 HTTP/1.1
Host: handsonazurefunctionapp.azurewebsites.net
Content-Type: application/json
x-functions-key: awKhkdPqyQvYUwzn6zle6V4hqk460YwOBs9RyaQUthX/AWGBMjtRIA==
Cache-Control: no-cache
```
##### (三)监控
每个函数的调用和执行都会被监控和保存。点击“监控”标签,可看到包含下一次执行及诊断数据的屏幕。若未看到列表,可能需启用 Application Insights 集成;要访问标准视图,可点击“切换到经典视图”按钮。监控功能有助于快速分析问题,若需更详细的错误和日志,需启用 Application Insights 并使用其功能。
##### (四)Host.json 文件
创建函数时会自动生成 host.json 文件,它是全局配置文件,定义触发器和函数的行为。以下是一个包含多数特性的示例文件:
```json
{
"aggregator": {
"batchSize": 1000,
"flushTimeout": "00:00:30"
},
"applicationInsights": {
"sampling": {
"isEnabled": true,
"maxTelemetryItemsPerSecond" : 5
}
},
"eventHub": {
"maxBatchSize": 64,
"prefetchCount": 256,
"batchCheckpointFrequency": 1
},
"functions": [ "QueueProcessor", "GitHubWebHook" ],
"functionTimeout": "00:05:00",
"healthMonitor": {
"enabled": true,
"healthCheckInterval": "00:00:10",
"healthCheckWindow": "00:02:00",
"healthCheckThreshold": 6,
"counterThreshold": 0.80
},
"http": {
"routePrefix": "api",
"maxOutstandingRequests": 20,
"maxConcurrentRequests": 10,
"dynamicThrottlesEnabled": false
},
"id": "9f4ea53c5136457d883d685e57164f08",
"logger": {
"categoryFilter": {
"defaultLevel": "Information",
"categoryLevels": {
"Host": "Error",
"Function": "Error",
"Host.Aggregator": "Information"
}
}
},
"queues": {
"maxPollingInterval": 2000,
"visibilityTimeout" : "00:00:30",
"batchSize": 16,
"maxDequeueCount": 5,
"newBatchThreshold": 8
},
"serviceBus": {
"maxConcurrentCalls": 16,
"prefetchCount": 100,
"autoRenewTimeout": "00:05:00"
},
"singleton": {
"lockPeriod": "00:00:15",
"listenerLockPeriod": "00:01:00",
"listenerLockRecoveryPollingInterval": "00:01:00",
"lockAcquisitionTimeout": "00:01:00",
"lockAcquisitionPollingInterval": "00:00:03"
},
"tracing": {
"consoleLevel": "verbose",
"fileLoggingMode": "debugOnly"
},
"watchDirectories": [ "Shared" ]
}
```
##### (五)发布
Azure Functions 的发布方式与 App Service 相同。在 Visual Studio 中右键点击函数项目并选择“发布”,会看到与处理 App Services 时类似的界面。可选择创建新的函数应用或使用现有应用。使用现有应用并点击“发布”按钮后,可在特定资源组中找到函数应用,点击“确定”将创建新的发布配置文件并部署整个应用。
#### 二、Azure Functions 中的工作流 - 持久函数
多数情况下,函数保持无状态可使工作更简单,无需担心资源共享和状态存储。但在某些场景,如编排工作流或调度任务时,可利用持久函数的功能。
##### (一)入门
开始使用持久函数无需额外扩展,只需添加名为 `Microsoft.Azure.WebJobs.Extensions.DurableTask` 的 NuGet 包。
##### (二)编排和活动
持久函数的主要元素是编排和活动,它们有显著区别:
| 元素 | 特点 |
| ---- | ---- |
| 编排 | 用于编排不同的活动,应是单线程且幂等的,只能使用非常有限的异步方法,根据内部队列数量进行扩展,控制一个或多个活动的流程。 |
| 活动 | 应包含应用的大部分逻辑,像典型函数一样工作(无编排的限制),可扩展到多个 VM。 |
以下是两种类型函数的代码示例:
```csharp
[FunctionName("Orchestration")]
public static async Task Orchestration_Start([OrchestrationTrigger]
DurableOrchestrationContext context)
{
var payload = context.GetInput<string>();
await context.CallActivityAsync(nameof(Activity), payload);
}
[FunctionName("Activity")]
public static string Activity([ActivityTrigger] DurableActivityContext
context)
{
var payload = context.GetInput<string>();
return $"Current payload is {payload}!";
}
```
##### (三)编排客户端
编排客户端用于启动编排,可对编排执行以下操作:
1. 启动编排
2. 终止编排
3. 获取编排状态
4. 引发事件并传递给编排
以下是客户端的基本代码示例:
```csharp
[FunctionName("Orchestration_Client")]
public static async Task<string> Orchestration_Client(
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "start")]
HttpRequestMessage input,
[OrchestrationClient] DurableOrchestrationClient starter)
{
return await starter.StartNewAsync("Orchestration", await
input.Content.ReadAsStringAsync());
}
```
以下是一个通过传递标识符终止实例的客户端示例:
```csharp
[FunctionName("Terminate")]
public static async Task Terminate(
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route
```
0
0
复制全文
相关推荐










