18、Azure Functions 最佳实践:代码复用、应用迁移与功能标志实现

Azure Functions 最佳实践:代码复用、应用迁移与功能标志实现

1. 使用类库在 Azure Functions 中共享代码

在 Azure 函数开发中,我们可以通过类库来共享代码,提高代码的复用性和性能。具体步骤如下:
1. 准备使用共享方法 :在 Azure 函数中使用 GetReusableFunctionOutput 共享方法,将 HTTP 触发器的代码替换为:

#r "../bin/Reusability.dll"
using Utilities;
public static async Task Run(HttpRequest req, ILogger log)
{
    log.LogInformation(Helper.GetReusableFunctionOutput());
}
  1. 运行应用 :运行应用后,在日志中会看到相应的消息。
  2. 重复操作 :对第二个 Azure 函数 ReusableMethodCaller2 重复添加引用和实用程序库命名空间的步骤。

如果只在一个函数中使用共享代码,需要将 bin 文件夹和 .dll 文件添加到所需的 Azure 函数文件夹中。使用类库的另一个主要优点是可以提高性能,因为它们已经编译好,随时可以执行。

2. 使用 PowerShell 将 C# 控制台应用程序迁移到 Azure Functions

许多业务应用程序目前托管在私有云或本地数据中心,可通过以下方法快速迁移到 Azure:
- 提升并转移到基础设施即服务(IaaS)环境 :此方法较为直接,可完全控制创建的虚拟机,无需更改应用程序代码,但成本较高。
- 转换为平台即服务(PaaS)兼容环境 :该方法可能较为复杂,需要根据应用程序对第三方库的依赖情况进行代码更改,但成本效益高。

下面介绍使用 PowerShell 将现有 C# 控制台应用程序迁移到 Azure Functions 定时器触发器的具体步骤:

2.1 开发控制台应用程序
  1. 创建项目 :使用 Visual Studio 创建一个新的 .NET Framework 控制台应用程序,命名为 BackgroundJob
  2. 创建 UserRegistration :在 BackgroundJob 项目中创建一个新类 UserRegistration ,并将默认代码替换为:
using System;
namespace BackgroundJob
{
    class UserRegistration
    {
        public static void RegisterUser()
        {
            Console.WriteLine("Register User method of UserRegistration has been called.");
        }
    }
}
  1. 创建 OrderProcessing :创建一个新类 OrderProcessing ,并将默认代码替换为:
using System;
namespace BackgroundJob
{
    class OrderProcessing
    {
        public static void ProcessOrder()
        {
            Console.WriteLine("Process Order method of OrderProcessing class has been called");
        }
    }
}
  1. 修改 Program.cs 文件 :将 Program.cs 文件中的现有代码替换为:
using System;
namespace BackgroundJob
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Main method execution has been started");
            Console.WriteLine("======================================");
            UserRegistration.RegisterUser();
            OrderProcessing.ProcessOrder();
            Console.WriteLine("======================================");
            Console.WriteLine("Main method execution has been completed");
        }
    }
}

构建应用程序以创建 .exe 文件,建议在生产环境中以发布模式部署。

2.2 创建 Azure 函数应用
  1. 创建函数应用 :使用 PowerShell 6 创建一个新的函数应用,在创建时选择 PowerShell Core 作为运行时堆栈。
  2. 添加定时器触发器
    • 导航到 Functions 刀片并点击 Add
    • 在新函数刀片中选择 Timer trigger 模板。
    • 在详细信息视图中提供名称和计划,然后点击 Create function 创建定时器触发器函数。
2.3 上传控制台应用程序可执行文件
  1. 打开应用服务编辑器 :点击 App Service Editor
  2. 创建 bin 文件夹 :在新浏览器标签中,右键点击 BackgroundJob 文件夹,创建一个名为 bin 的新文件夹。
  3. 上传文件 :上传 .exe 文件及其他依赖项。
  4. 调用 .exe 文件 :导航到定时器触发器的 Code / Test 窗口,添加代码以调用 BackgroundJob.exe

从现在起,定时器触发器将每五分钟运行一次。

3. 使用应用配置在 Azure Functions 中实现功能标志

在企业项目中,通常会有多个大型应用程序,每个应用程序都有自己的应用设置存储。为了解决配置管理的问题,Azure 提供了应用配置服务,可将配置项外部化,实现动态管理功能而无需部署代码。具体步骤如下:

3.1 创建应用配置服务
  1. 导航到 Azure 门户 :点击 Create a resource ,搜索 App Configuration ,然后点击 Create 按钮。
  2. 配置服务 :在 App Configuration 刀片中提供名称,选择定价层,然后点击 Create 按钮。
3.2 创建配置键和功能管理键
  1. 创建键值对
    • 导航到 Configuration explorer 刀片,点击 Key-value 按钮。
    • 在新刀片中创建键值对,点击 Apply 保存。
  2. 创建功能标志
    • 导航到 Feature manager 刀片,点击 Add
    • 在新刀片中选择 On 并提供键,点击 Apply 创建功能标志。
3.3 开发 Azure 函数 HTTP 触发器
  1. 开发 HTTP 触发器
    • 打开 Visual Studio,创建一个名为 DisplayGreeting 的 HTTP 触发器,确保类为非静态。
    • 安装以下 NuGet 包:
Install-Package Microsoft.Extensions.Configuration.AzureAppConfiguration
Install-Package Microsoft.FeatureManagement
Install-Package Microsoft.Azure.Functions.Extensions
- 导航到 `App Configuration`,复制只读密钥选项卡中的连接字符串。
- 打开 `local.settings.json` 配置文件,创建一个名为 `AppConfigurationConnectionString` 的连接字符串,并粘贴复制的连接字符串。
  1. 加载功能标志和键值对 :创建一个名为 Startup 的新类,将默认代码替换为:
using System;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.FeatureManagement;
[assembly: FunctionsStartup(typeof(FeatureFlags.Startup))]
namespace FeatureFlags
{
    class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
            configurationBuilder.AddAzureAppConfiguration(options =>
            {
                options.Connect(Environment.GetEnvironmentVariable("AppConfigurationConnectionString"))
                       .UseFeatureFlags();
            });

            IConfiguration configuration = configurationBuilder.Build();
            builder.Services.Configure<Settings>(configuration.GetSection("CookbookApp:Settings"));
            builder.Services.AddFeatureManagement(configuration);
        }
    }
}

同时,添加一个名为 Settings 的新类:

namespace FeatureFlags
{
    public class Settings
    {
        public string Greeting { get; set; }
    }
}
  1. 注入功能标志和键值对
    • DisplayGreeting 类中创建以下变量:
private readonly IFeatureManagerSnapshot _featureManagerSnapshot;
private readonly Settings _settings;
private readonly IConfiguration _configuration;
- 添加以下命名空间:
using Microsoft.FeatureManagement;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options;
- 添加构造函数并注入依赖项:
public DisplayGreeting(IFeatureManagerSnapshot featureManagerSnapshot, IOptionsSnapshot<Settings> settings, IConfiguration configuration)
{
    _featureManagerSnapshot = featureManagerSnapshot;
    _settings = settings.Value;
    _configuration = configuration;
}
  1. 访问功能标志和键值对
    • 从 HTTP 触发器定义中移除 Static 关键字。
    • 添加代码获取 TurnOnGreeting 功能标志的状态:
bool featureEnabled = await _featureManagerSnapshot.IsEnabledAsync("TurnOnGreeting");
- 检索键值配置 `Greeting` 的值:
if (featureEnabled)
{
    return new OkObjectResult($"Hello, {name}. {_settings.Greeting}");
}
else
{
    return new OkObjectResult($"Hello, {name}.");
}

完整的 HTTP 触发器代码如下:

[FunctionName("DisplayGreeting")]
public async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
    ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");
    string name = req.Query["name"];
    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic data = JsonConvert.DeserializeObject(requestBody);
    name = name ?? data?.name;
    bool featureEnabled = await _featureManagerSnapshot.IsEnabledAsync("TurnOnGreeting");
    if (featureEnabled)
    {
        return new OkObjectResult($"Hello, {name}. {_settings.Greeting}");
    }
    else
    {
        return new OkObjectResult($"Hello, {name}.");
    }
}

当功能标志打开时,会显示问候语 Happy Learning ;关闭时则不显示。应用配置服务还有其他功能,如比较配置、导入和导出键、重新加载或刷新配置更改等。

通过上述方法,我们可以提高 Azure 应用程序的性能,将服务从本地迁移到 Azure,并实现灵活的配置管理。

以下是迁移 C# 控制台应用程序到 Azure Functions 的流程图:

graph LR
    A[创建 .NET Framework 控制台应用程序] --> B[创建定时器触发器函数]
    B --> C[上传控制台应用程序可执行文件]
    C --> D[调用 .exe 文件]
    D --> E[定时器触发器定期运行]

以下是使用应用配置实现功能标志的流程图:

graph LR
    A[创建应用配置服务] --> B[创建配置键和功能管理键]
    B --> C[开发 Azure 函数 HTTP 触发器]
    C --> D[加载功能标志和键值对]
    D --> E[注入功能标志和键值对]
    E --> F[访问功能标志和键值对]

Azure Functions 最佳实践:代码复用、应用迁移与功能标志实现

4. 技术点分析
4.1 代码复用的优势与原理

代码复用通过类库的方式,将可复用的代码封装在 .dll 文件中。这样做的好处主要体现在以下两个方面:
- 提高开发效率 :开发人员无需重复编写相同的代码,直接引用类库中的方法即可,大大节省了开发时间。
- 提升性能 :类库是已经编译好的代码,在运行时可以直接执行,减少了编译时间,从而提高了应用程序的整体性能。

在 Azure Functions 中使用类库,需要将 .dll 文件放置在 bin 文件夹中,并在函数代码中添加引用。例如:

#r "../bin/Reusability.dll"
using Utilities;

这种方式使得代码的组织更加清晰,便于维护和扩展。

4.2 应用迁移的选择与考虑因素

将 C# 控制台应用程序迁移到 Azure Functions 时,有两种主要的迁移方式:提升并转移到 IaaS 环境和转换为 PaaS 兼容环境。
| 迁移方式 | 优点 | 缺点 | 适用场景 |
| — | — | — | — |
| 提升并转移到 IaaS 环境 | 无需更改应用程序代码,可完全控制虚拟机 | 成本较高,资源利用率可能较低 | 应用程序依赖复杂,难以进行代码修改 |
| 转换为 PaaS 兼容环境 | 成本效益高,只需支付执行时间费用 | 可能需要进行大量代码更改,依赖处理复杂 | 应用程序相对简单,易于进行代码重构 |

在选择迁移方式时,需要综合考虑应用程序的复杂度、依赖关系以及成本等因素。

4.3 功能标志的作用与实现机制

功能标志是一种非常有用的工具,它可以在不部署新代码的情况下动态控制应用程序的功能。通过 Azure 的应用配置服务,我们可以将功能标志和配置项外部化,实现灵活的配置管理。
- 外部化配置 :将应用程序的配置项存储在应用配置服务中,多个应用程序可以共享这些配置,方便统一管理和修改。
- 动态管理功能 :通过更改功能标志的状态,可以实时控制应用程序的某些功能是否可用,无需重新部署代码。

在实现功能标志时,我们需要创建应用配置服务,添加配置键和功能标志,并在 Azure 函数中加载和使用这些配置。例如:

bool featureEnabled = await _featureManagerSnapshot.IsEnabledAsync("TurnOnGreeting");

通过这种方式,我们可以根据不同的需求动态控制应用程序的行为。

5. 总结与展望

通过本文介绍的方法,我们可以在 Azure Functions 中实现代码复用、应用迁移和功能标志的管理,从而提高应用程序的性能和可维护性。
- 代码复用 :使用类库可以将可复用的代码封装起来,提高开发效率和性能。
- 应用迁移 :根据应用程序的特点选择合适的迁移方式,将本地应用程序迁移到 Azure,实现云化部署。
- 功能标志 :利用应用配置服务实现功能标志的动态管理,灵活控制应用程序的功能。

未来,随着 Azure 服务的不断发展和完善,我们可以进一步探索更多的最佳实践和技术应用。例如,结合 Azure 的其他服务,如 Azure Monitor 进行性能监控和优化,使用 Azure DevOps 实现自动化部署和持续集成等。同时,随着云计算技术的不断进步,我们也可以期待更加高效、便捷的开发和运维方式。

希望本文能够帮助读者更好地理解和应用 Azure Functions 的最佳实践,提升开发和运维能力。

以下是代码复用、应用迁移和功能标志实现的整体流程图:

graph LR
    A[代码复用:创建类库] --> B[应用迁移:选择迁移方式]
    B --> C[功能标志:创建应用配置服务]
    C --> D[开发 Azure 函数并使用类库、配置]
    D --> E[应用程序运行与维护]

通过这个流程图,我们可以清晰地看到整个过程的关键步骤和顺序,有助于我们更好地规划和实施项目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值