15、深入探索Azure:静态Web应用、容器化与无服务器计算

深入探索Azure:静态Web应用、容器化与无服务器计算

1. 静态Web应用配置

在Azure上配置静态Web应用时,会生成一个唯一的URL,创建静态Web应用资源时需输入应用名称,不过这只是用于管理的名称。配置完成后,可访问生成的域名。例如,成功在静态Web应用上配置Blazor应用后,服务器端仅负责提供文件,客户端下载并在本地执行所有操作。这里展示的Blazor应用示例由GitHub在Ubuntu构建主机上使用.NET 6编译。除了Blazor,Azure静态Web应用还支持多种前端框架,如Angular、Vue、React,以及像Gatsby这样的静态站点生成器。完整的支持框架列表可查看:https://docs.microsoft.com/en-us/azure/static-web-apps/front-end-frameworks 。

2. 容器化Web应用

Web应用支持另一种托管模式,即可以将应用作为Docker容器进行部署。以下是关于Docker的详细介绍:
- Docker简介 :Docker是基于containerd运行时构建的一组工具,用于创建容器化应用。容器是虚拟机的演进,虚拟机模拟完整的硬件设备,而容器处于操作系统级别。容器将软件、库和配置捆绑在一起,可在特定操作系统上运行,是一个完全隔离、自配置的工作单元,运行在Docker主机的底层操作系统之上。与虚拟机相比,容器的开销更小,因此在一个物理设备上可以运行更多的容器。
- 容器化应用的优势 :使用容器化应用可以简化很多工作。例如,从一个云主机迁移到另一个云主机(如从Amazon AWS迁移到Microsoft Azure)非常容易,无需对应用进行配置更改;更新应用也很简单,只需重启容器即可。不过,大部分工作在于将应用进行容器化设置。
- 容器化应用的必要组件 :要使应用在Docker容器中运行,需要以下组件:
- Docker文件:描述入口点、端口和配置。
- Docker镜像:一个准备好启动和使用的容器化应用。
- Docker注册表:类似于包存储库(如NuGet、NPM等),用于存储要部署的容器镜像。
- Docker运行时。
- Docker运行器:从Docker注册表拉取镜像并将其部署到Docker运行时的系统。

3. 对MVC示例应用进行容器化

以下是将MVC示例应用进行容器化的具体步骤:
1. 安装Docker Desktop :从官网https://hub.docker.com/editions/community/docker-ce-desktop-windows 下载安装程序。安装程序将引导完成WSL2的安装,并确保安装了正确的更新,之后会安装Docker和Docker Desktop。Docker Desktop是Docker的Windows版本,提供了配置Docker的UI和CLI,最重要的是它将Docker引擎连接到Visual Studio进行调试。
2. 添加Docker支持 :安装Docker Desktop后,打开解决方案,右键单击要容器化的项目,选择“添加” > “Docker支持”。选择Linux容器,Visual Studio将生成一个Docker文件,该文件包含在容器中构建和运行基于.NET 6的应用所需的所有指令。
3. 调试容器化应用 :添加Docker文件后,Visual Studio会将Docker显示为新的调试目标。选择Docker作为调试目标后,每次启动“构建”命令时,Visual Studio会根据Dockerfile的指令构建应用。启动应用进行调试时,Docker Desktop中会启动一个容器,调试器将附加到该容器。首次操作时,可能会弹出一些命令行窗口,这是Docker工具正在下载该项目所需的正确镜像。
4. 上传容器到注册表 :为了能够部署容器,需要将其上传到容器存储库。Docker有一个公共存储库Docker Hub,也可以使用Azure的Azure Container Registry(ACR)创建私有容器注册表。
- 创建ACR实例 :通过Azure门户创建ACR实例,实例名称很重要,在上传容器的命令中需要使用 .azurecr.io域名。
- 构建容器 :使用Docker CLI构建容器时,如果使用Visual Studio生成的Dockerfile会报错,原因是该文件用于Visual Studio工具的调试和集成,Docker工具内部使用的相对路径假设Docker文件位于解决方案级别,而Visual Studio将其放在项目级别。最快的解决方法是复制Docker文件并将其复制到解决方案级别。确保命令行位于解决方案目录,然后使用以下命令构建容器:

docker build . -t dotnetsix.azurecr.io/mvcdemo
- **认证并推送容器**:由于ACR实例是私有的,需要先对Azure和ACR进行认证。安装Azure CLI后,使用以下命令进行认证:
az login
az acr login --name dotnetsix.azurecr.io

认证成功后,使用以下命令将容器镜像推送到注册表:

docker push dotnetsix.azurecr.io/mvcdemo
- **部署到Azure Web应用**:最后,创建一个新的Azure Web应用实例,选择Docker而不是代码。向导会连接到ACR实例,读取镜像和标签列表,Azure将创建一个新实例,从ACR拉取镜像并创建容器。需要注意的是,首次访问基于Docker的Web应用可能需要一些时间,因为容器需要生成和启动。

以下是容器化流程的mermaid流程图:

graph LR
    A[安装Docker Desktop] --> B[添加Docker支持]
    B --> C[调试容器化应用]
    C --> D[创建ACR实例]
    D --> E[构建容器]
    E --> F[认证并推送容器]
    F --> G[部署到Azure Web应用]
4. Azure Functions:无服务器计算

Azure Functions是Azure上实现无服务器计算的服务。无服务器计算意味着代码可以在云端运行,无需担心服务器维护、操作系统更新、扩展、容器等传统的工作开销。虽然实际上仍然使用服务器来运行代码,但可以直接构建并部署代码,这就是无服务器计算的由来。
- Azure Functions的触发方式 :Azure Functions通过触发器调用,触发器类似于事件,可以来自不同的地方。例如,HTTP触发器通过对函数端点进行HTTP请求来调用,类似于REST调用;还有许多触发器来自其他Azure资源,如Blob触发器在将Blob添加到Blob存储容器时触发,服务总线队列触发器在服务总线接收到消息时触发。
- 编写Azure Functions :Azure Functions可以使用不同的语言(如JavaScript和C#)和不同的IDE(如Visual Studio Code和Visual Studio 2022)编写。这里以在Visual Studio 2022中使用C#编写为例。Azure Functions有两种模式:
- 进程内模式 :默认情况下,Azure Function与Functions运行时在同一进程中运行,这意味着包含函数代码的类库在Functions进程运行的同一运行时上执行。目前Azure Functions运行时基于.NET 6,这种模式没有问题,但在.NET 5发布时曾是一个问题。
- 进程外模式 :为了解决上述问题,引入了进程外函数支持,函数可以在自己的进程中运行,拥有自己的独立运行时。对于.NET 6,可以选择.NET 6(进程内)或.NET 6(隔离,进程外)。

5. 示例Azure Function代码分析

以下是一个默认的Azure Function示例代码:

[FunctionName("Function1")]
[OpenApiOperation(operationId: "Run", tags: new[] { "name" })]
[OpenApiSecurity("function_key", SecuritySchemeType.ApiKey, Name = "code", 
In = OpenApiSecurityLocationType.Query)]
[OpenApiParameter(name: "name", In = ParameterLocation.Query, Required = 
true, Type = typeof(string), Description = "The **Name** parameter")]
[OpenApiResponseWithBody(statusCode: HttpStatusCode.OK, contentType: "text/
plain", bodyType: typeof(string), Description = "The OK response")]
public async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] 
HttpRequest req)
{
    string name = req.Query["name"];
    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic data = JsonConvert.DeserializeObject(requestBody);
    name = name ?? data?.name;
    string responseMessage = $"Hello, {name}. This HTTP triggered function 
executed successfully.";
    return new OkObjectResult(responseMessage);
}

代码解释:
- 属性部分 [FunctionName("Function1")] 为函数命名,该名称用于Swagger UI和Azure门户。其他属性用于根据OpenAPI规范描述函数,以便Swagger UI可以提供良好的体验。
- HttpTrigger属性 :配置函数的触发器,将函数注册为具有特定动词(如GET和POST)的HTTP端点。
- 函数逻辑 :从请求中获取参数,处理请求体,生成响应消息并返回。

6. 将书籍服务移植到Azure Functions

以下是将书籍服务移植到Azure Functions的详细步骤和代码示例:
1. 添加启动对象 :由于进程内函数默认没有启动类,需要添加Microsoft.Azure.Functions.Extensions NuGet包,然后创建一个启动对象来配置依赖注入。

[assembly: FunctionsStartup(typeof(FunctionsDemo.Startup))]
namespace FunctionsDemo;
public class Startup : FunctionsStartup
{
    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddSingleton<IBookCatalogService, 
BookCatalogService>();
    }
}
  1. 定义函数类 :在函数类中注入 IBookCatalogService
public class BookFunctions
{
    private readonly IBookCatalogService _bookCatalogService;
    public BookFunctions(IBookCatalogService bookCatalogService)
    {
        _bookCatalogService = bookCatalogService;
    }
}
  1. 添加具体函数
    • 获取所有书籍列表
[FunctionName("FetchBooks")]
[OpenApiOperation(operationId: "FetchAll", tags: new[] { "Books" })]
[OpenApiResponseWithBody(statusCode: HttpStatusCode.OK, contentType: 
"application/json", bodyType: typeof(Book[]), Description = "A list of books")]
public async Task<IActionResult> Run([HttpTrigger("get", Route = "books")] 
HttpRequest req)
{
    Book[] books = await _bookCatalogService.FetchBookCatalog();
    return new OkObjectResult(books);
}
- **根据ID获取特定书籍**:
[FunctionName("FetchBookByID")]
[OpenApiOperation(operationId: "FetchBookByID", tags: new[] { "Books" })]
[OpenApiParameter("id", Description = "The ID of a specific book",  
Type = typeof(int))]
[OpenApiResponseWithBody(statusCode: HttpStatusCode.OK, contentType: 
"application/json", bodyType: typeof(Book), Description =  
"A specific book")]
public async Task<IActionResult> FetchBookById([HttpTrigger("get",  
Route = "books/{id:int}")] HttpRequest req, int id)
{
    Book book = await _bookCatalogService.FetchBookById(id);
    return new OkObjectResult(book);
}
- **创建新书**:
[FunctionName("AddBook")]
[OpenApiOperation(operationId: "AddBook", tags: new[] { "Books" })]
[OpenApiRequestBody("application/json", typeof(Book), Required = true)]
[OpenApiResponseWithBody(statusCode: HttpStatusCode.Created, contentType: 
"application/json", bodyType: typeof(Book), Description = "A newly 
added book")]
public async Task<IActionResult> AddBook([HttpTrigger("post", Route = 
"books")] HttpRequest req)
{
    var book = await JsonSerializer.DeserializeAsync<Book>(req.Body);
    await _bookCatalogService.AddBook(book);
    return new CreatedResult($"/books/{book.Id}", book);
}
7. 部署Azure Functions

可以直接从Visual Studio 2022部署Azure Functions,具体步骤如下:
1. 选择发布目标 :右键单击项目,选择“发布”,在向导的第一步指定要发布到Azure。
2. 选择函数类型 :在第二步选择要创建的Azure Function运行的操作系统(Windows或Linux)或容器。这里选择Windows-based Function。
3. 创建新函数 :点击“+”号开始创建新函数,函数名称在Azure中必须唯一。计划类型有三种选项:Consumption、Premium和Dedicated(App Service),不同的选择会影响扩展、每个实例的资源以及对高级功能(如虚拟网络连接)的支持。更多信息可查看https://docs.microsoft.com/en-us/azure/azure-functions/functions-scale 。此外,Azure Functions需要一个存储账户,因为它们依赖存储来管理触发器和日志记录。
4. 跳过API管理步骤 :创建函数后,进入API管理步骤,由于这超出了本文的范围,可以选择“跳过此步骤”以启用“创建”按钮。
5. 发布函数 :完成所有步骤后,点击“发布”按钮,Visual Studio将创建Azure资源并将函数推送到云端。

以下是部署Azure Functions的mermaid流程图:

graph LR
    A[选择发布目标] --> B[选择函数类型]
    B --> C[创建新函数]
    C --> D[跳过API管理步骤]
    D --> E[发布函数]

通过以上步骤,可以在Azure上成功配置静态Web应用、对应用进行容器化并部署Azure Functions,实现无服务器计算。希望这些内容对大家有所帮助。

深入探索Azure:静态Web应用、容器化与无服务器计算

8. 操作总结与对比

为了更清晰地展示上述各项操作的关键信息,我们整理了以下表格:
|操作类型|关键步骤|主要注意事项|
| ---- | ---- | ---- |
|静态Web应用配置|生成唯一URL,输入应用名称,可购买自定义域名|应用名称仅用于管理|
|容器化应用|安装Docker Desktop,添加Docker支持,调试应用,上传容器到注册表|使用Visual Studio生成的Dockerfile构建容器可能报错,需复制到解决方案级别|
|Azure Functions编写|选择模式,编写代码,配置依赖注入|进程内和进程外模式有差异,进程内函数需额外配置启动对象|
|Azure Functions部署|选择发布目标,选择函数类型,创建新函数,跳过API管理步骤,发布函数|函数名称需唯一,不同计划类型影响功能和资源|

9. 常见问题解答

在实际操作过程中,可能会遇到一些常见问题,下面为大家解答:
- :在使用Visual Studio生成的Dockerfile构建容器时为什么会报错?
- :因为该文件用于Visual Studio工具的调试和集成,Docker工具内部使用的相对路径假设Docker文件位于解决方案级别,而Visual Studio将其放在项目级别。解决方法是复制Docker文件并将其复制到解决方案级别。
- :Azure Functions的进程内和进程外模式有什么区别?
- :进程内模式下,Azure Function与Functions运行时在同一进程中运行,代码与运行时版本紧密耦合;进程外模式下,函数可以在自己的进程中运行,拥有自己的独立运行时,可避免运行时版本的问题。
- :部署Azure Functions时,不同的计划类型有什么影响?
- :计划类型有Consumption、Premium和Dedicated(App Service)三种。不同的选择会影响扩展、每个实例的资源以及对高级功能(如虚拟网络连接)的支持。更多信息可查看https://docs.microsoft.com/en-us/azure/azure-functions/functions-scale 。

10. 技术拓展思考

虽然我们已经详细介绍了Azure上的静态Web应用配置、容器化应用和Azure Functions的使用,但在实际应用中,还可以考虑以下拓展方向:
- 自动化部署 :可以使用CI/CD工具(如Azure Pipelines、GitHub Actions等)实现容器化应用和Azure Functions的自动化部署,提高部署效率和准确性。
- 多环境管理 :在开发、测试和生产环境中,可以使用不同的配置和资源,通过环境变量等方式进行管理,确保应用在不同环境中的稳定性。
- 安全优化 :对于Azure Functions,除了使用默认的安全机制(如函数密钥),还可以考虑使用Azure API Management进行更高级的安全管理,如身份验证、授权、限流等。

11. 总结与展望

通过本文的介绍,我们深入了解了在Azure上配置静态Web应用、对应用进行容器化以及使用Azure Functions实现无服务器计算的详细步骤和技术要点。从静态Web应用的简单配置,到容器化应用的复杂构建和部署,再到Azure Functions的灵活编写和发布,每一个环节都有其独特的技术细节和操作要求。

在未来的云计算发展中,Azure作为一个强大的云平台,将继续提供更多的功能和服务。静态Web应用将更加便捷地支持各种前端框架,容器化技术将进一步简化应用的部署和管理,Azure Functions将在无服务器计算领域发挥更大的作用。希望大家能够掌握这些技术,在实际项目中灵活运用,创造出更高效、更稳定的应用系统。

以下是整个操作流程的综合mermaid流程图,展示了从静态Web应用配置到Azure Functions部署的完整过程:

graph LR
    A[静态Web应用配置] --> B[容器化应用]
    B --> C[Azure Functions编写]
    C --> D[Azure Functions部署]
    B1[安装Docker Desktop] --> B2[添加Docker支持]
    B2 --> B3[调试容器化应用]
    B3 --> B4[上传容器到注册表]
    C1[选择模式] --> C2[编写代码]
    C2 --> C3[配置依赖注入]
    D1[选择发布目标] --> D2[选择函数类型]
    D2 --> D3[创建新函数]
    D3 --> D4[跳过API管理步骤]
    D4 --> D5[发布函数]

通过以上内容,我们全面地了解了Azure上的多种应用操作和技术,希望能为大家在云计算领域的实践提供有价值的参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值