使用VS Code开发一款基于.NET Core和SQL数据库的Azure Function应用程序

我真的很喜欢微软近年来的策略,通过使用VS Code,.Net Core和Azure云使开发变得更容易。这篇文章详细介绍了在Mac笔记本电脑上使用VS Code开发一款基于.NET Core和SQL数据库的Azure Function应用程序并将其部署到Azure云的过程。在本文的结尾,你可以找到示例项目的GitHub仓库链接。

安装VS Code拓展

我们要做的第一件事是配置我们的开发环境,即设置好VS Code。因此,你应该安装这2个插件:Azure Functions Extension 以及NuGet Package Manager。

通过使用Azure Functions Extension,我们可以直接在VS Code内快速的创建、调试、管理以及部署我们的serverless应用程序。

通过使用NuGet Package Manager Extension,我们可以在VS Code内方便的添加package。

由于我们将会使用.NET Core 3.1以及依赖注入开发我们的.NET Azure Functions app,因此我们需要一些安装一些额外的Nuget pacakge。

依赖注入以及EntityFramework Core

为VS Code安装好这些拓展之后,接下来我们将使用Azure Functions Extension来创建Azure Functions 工程。

通过使用Azure Functions Extension,我们可以选择将要使用的编程语言以及function的模版。现在我们创建好了我们的工程。

从Azure Functions 2.x开始,Azure Functions对依赖注入提供了支持,并且Azure Functions中的依赖注入实现基于.NET Core的依赖注入功能。

为了使用依赖注入,我们必须安装以下2个Nuget package:

  • Microsoft.Azure.Functions.Extensions
  • Microsoft.NET.Sdk.Functions

因此,我们可以使用之前安装好的NuGet Package Manager Extension来添加它们。将这2个package添加好之后,你可以在工程的.csproj文件中发现对应的引用对象已经被添加好了。

现在我们可以来创建Startup类并且在Configure方法中配置我们需要的service(需要注意的是,和 http:// ASP.NET Core不同,service的设置不是在ConfigureServices方法中)。

[assembly: FunctionsStartup(typeof(UserCRUD.FuncApp.Startup))]
namespace UserCRUD.FuncApp
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            var connectionString = 
                Environment.GetEnvironmentVariable("SqlServerConnection");
            builder.Services.AddDbContext(x =>
            {
                x.UseSqlServer(connectionString
                , options=>options.EnableRetryOnFailure());
            });

            builder.Services.AddTransient();

        }
    }
}

如你在上面的代码中所见,我们从环境变量中获取了SqlServerConnection字符串,而这个值可以在工程的local.settings.json文件中设置来进行本地测试,也可以在Azure云上的Azure Functions面板中设置以供上线使用。

另外需要注意的一点是,我们添加了FunctionsStartup assembly属性来指明在启动中需要使用的类型名。

接下来,我们将EntityFramework Core引入我们的应用程序。由于我们使用的是.Net Core 3.1,因此应注意,从3.0开始 http:// ASP.NET Core共享框架不包括EF Core或任何EF Core data provider。因此,我们应该通过Nuget Package Manager添加这些package(EF Core和SqlServer provider)。

  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.SqlServer

现在,我们获得了应用程序所需的所有package。

代码逻辑相对简单,下面是显示数据库中所有用户实体的函数示例。

namespace UserCRUD.Function
{
    public class ListHttpTrigger
    {
        private ICRUDService _service;
        public ListHttpTrigger(ICRUDService service)
        {
            _service = service;
        }

        [FunctionName("list")]
        public async Task Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "list")] HttpRequest req, 
            ILogger log)
        {
            var user = await _service.ListAsync();
            return new OkObjectResult(user);
        }
    }
}

如你在上面的代码中看到的,我们正在使用构造函数注入将ICRUDService服务注入到HTTP触发的函数中。并且该服务使用EF Core从我们的数据库中读取用户列表。

但是,到目前为止,我们尚未设置Azure SQL数据库。接下来,我们将设置Azure SQL数据库并将Functions应用程序与数据库连接。

创建Azure SQL 数据库

现在,让我们在Azure云平台上创建Azure SQL数据库服务。但是在创建新资源之前,我们应该先创建一个资源组。 然后,你可以在Azure门户上找到“创建资源”按钮并创建一个Azure SQL服务,SQL部署选项应该是SQL数据库。

创建Azure SQL数据库服务之后,我们应该为serverless function 应用程序配置数据库。

首先是数据库的计算等级(Compute tier),你可以在“Settings/Configure” 部分找到它。这里我们选择Serverless,这意味着将基于使用的vCore每秒自动调整计算资源的计费。

第二个是我们数据库的防火墙设置。这是因为来自Internet和Azure的连接尝试必须先通过防火墙,然后才能到达我们的服务器或数据库。微软提供了一个显示流程的图表。

你可以在SQL Server的“安全性”部分找到“防火墙和虚拟网络”按钮。并且我们需要设置允许Azure服务和资源访问该服务器。

第三件事是,我们应该创建一个表,该表将用于我们的Azure Functions应用程序。

为了在数据库中创建表,我们可以使用Query editor打开一个使用SQL的编辑器。

现在,我们已经在Azure云平台上设置好了Azure数据库。

在本地运行或将它发布到Azure云平台

正如我在“依赖注入以及EntityFramework Core”部分所述,我们可以在local.settings.json文件中设置数据库连接字符串以进行本地测试,也可以在Azure云平台的Azure Functions面板中设置以供上线使用。

因此,在我们可以在本地运行应用程序或将其发布给公众之前,我们应该做的第一件事就是从数据库中获取连接字符串。

然后,将连接字符串复制并粘贴到项目中local.settings.json文件中的Values集合中。这是因为在本地进行开发时,应用程序设置来自文件中的Values集合。

如你所见,此文件仅用于本地测试,并且不包含在git版本控制中。现在,借助VS Code Azure Function Extension,我们可以在本地运行我们的Function应用程序。

现在我们可以使用Postman将GET请求发送到localhost:7071/api/list以检索我之前创建的用户列表。

但是,如果我们要将Function应用程序推送到Azure云以进行公共访问,则必须在Azure 云的Azure Function App页面中设置连接字符串。

因为我们在代码中使用 GetEnvironmentVariable 从设置中获取连接字符串。在本地和Azure环境中,GetEnvironmentVariable(“ ”)用来检索应用程序设置(app setting)的值。因此,我们可以在“设置/配置”面板的“应用程序设置(app setting)”部分中进行设置供线上使用。

你可以通过以下网址尝试一个简单的function: http:// api.jiadongchen.com/api /list

由于仅用于演示目的,因此我选择的Azure服务计划会出现冷启动问题,这意味着在Function应用闲置了几分钟后,下一个请求可能会增加从0扩展到1的延迟。 所以保持耐心。

示例项目可以在这里找到:

https://github.com/chenjd/AzureFunction.UserCRUD github.com

感谢阅读,希望有所帮助。