当前位置: 首页 > 知识库问答 >
问题:

Azure Function作为Web API的性能和定价

金高飞
2023-03-14

我们计划构建一个Web应用程序,我希望有人能帮助我们决定是使用Azure App Service还是Azure Function为客户端提供rest API。我们的要求如下。

    < li >认证和授权 < Li > Azure SQL和Cosmos DB上的CRUD < li >多区域 < li >每月1亿次API调用

起初,我们打算使用Azure应用服务构建后端。但是在研究了Azure Functions的利弊之后,Azure Functions对我们变得更有吸引力。

那么,html" target="_blank">构建一个依赖Azure函数作为REST API提供者的web应用程序是一个好主意吗?

是否有人具有作为REST API提供程序构建、管理和扩展Azure Functions的经验?

共有1个答案

阎渝
2023-03-14

构建一个依赖Azure函数作为REST API提供者的web应用程序是个好主意吗?

看起来你计划使用网络服务或Azure Function来使用REST API。我认为你的决定是完美的。对于Azure Function来说,并不是必须要有网络服务。Azure函数对你来说是最好的选择。你可以实现Web API提供的所有功能。所以如果你的目标只是开发API,那么你可以从Azure Function开始,没有其他选择。实际上它很出色!

是否有人具有作为REST API提供程序构建、管理和扩展Azure Functions的经验?

我正在与Azure Function合作,以实现AI Base Bot与LUIS的集成。根据我的理解,这是一个非常容易维护、响应时间最快的工具,您可以从任何地方构建它。因此,你无疑可以使用Azure函数。

为什么选择Azure功能:

  1. 它是无状态的,不需要任何服务器即可运行
  2. 完全REST,可以从任何地区调用
  3. 可以开发Azure Portal和本地Visual Studio
  4. 性价比高,你可以只支付你用了多少钱
  5. 多语言支持
  6. 轻松授权和身份验证功能
  7. 根据您的消费计划,通话无限制

使用Azure Function做很多事情:

您可以使用Azure功能开发强大的API服务。它有许多出色的功能。请查看此处

授权和认证:

只需在函数应用上集成授权和身份验证即可。甚至可以在每个功能上单独实现它,也可以在完整的应用程序上实现它。它支持大多数流行的身份验证提供程序,例如:

  1. Azure Active Directory
  2. Microsoft标识
  3. 护目镜
  4. 脸书
  5. 推特认证

了解如何实现身份验证:

步骤:1

第二步

Rest函数代码示例:

在这里,我给你一个简单的代码片段开始:虽然它在Azure表存储上,但可以帮助你开发Azure函数和CRUD概念。

您的示例类:

  public class YourSampleClass
    {

        public string PartitionKey { get; set; }
        public string RowKey { get; set; }

    }

表存储类:

 public class TableStorageClass
    {
        public TableStorageClass()
        {

        }
        public TableStorageClass(DynamicTableEntity entity)
        {
            PartitionKey = entity.PartitionKey;
            RowKey = entity.RowKey;

        }

        public string PartitionKey { get; set; }
        public string RowKey { get; set; }


    }

Azure Function V2示例:

public static class FunctionReadFromTableStorage
    {
        [FunctionName("FunctionReadFromTableStorage")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            //Read Request Body
            var content = await new StreamReader(req.Body).ReadToEndAsync();

            //Extract Request Body and Parse To Class
            YourSampleClass objYourSampleClass = JsonConvert.DeserializeObject<YourSampleClass>(content);

            // Validate param because PartitionKey and RowKey is required to read from Table storage In this case , so I am checking here.
            dynamic validationMessage;

            if (string.IsNullOrEmpty(objYourSampleClass.PartitionKey))
            {
                validationMessage = new OkObjectResult("PartitionKey is required!");
                return (IActionResult)validationMessage;
            }
            if (string.IsNullOrEmpty(objYourSampleClass.RowKey))
            {
                validationMessage = new OkObjectResult("RowKey is required!");
                return (IActionResult)validationMessage;
            }


            // Table Storage operation  with credentials
            var client = new CloudTableClient(new Uri("https://YourStorageURL.table.core.windows.net/"),
                      new Microsoft.WindowsAzure.Storage.Auth.StorageCredentials("YourStorageName", "xtaguZokAWbfYG4QDkBjT+YourStorageKey+T/kId/Ng+cl3TfYHtg=="));
            var table = client.GetTableReference("YourTableName");

            //Query filter
            var query = new TableQuery()
            {
                FilterString = string.Format("PartitionKey eq '{0}' and RowKey eq '{1}'", objYourSampleClass.PartitionKey, objYourSampleClass.RowKey)
            };


            //Request for storage query with query filter
            var continuationToken = new TableContinuationToken();
            var storageTableQueryResults = new List<TableStorageClass>();
            foreach (var entity in table.ExecuteQuerySegmentedAsync(query, continuationToken).GetAwaiter().GetResult().Results)
            {
                var request = new TableStorageClass(entity);
                storageTableQueryResults.Add(request);
            }

            //As we have to return IAction Type So converting to IAction Class Using OkObjectResult We Even Can Use OkResult
            var result = new OkObjectResult(storageTableQueryResults);
            return (IActionResult)result;
        }
    }

要记住的一点:

  1. Azure 门户执行的情况下,只需摆脱函数读取从表存储
  2. 您需要以下参考才能执行上述代码
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Microsoft.WindowsAzure.Storage.Table;
using System.Collections.Generic;

邮递员请求模式

函数调用示例:

{
   "PartitionKey": "Your Param According to Table Storage Design" ,
   "RowKey": "Your Param According to Table Storage Design",
   "Directory": "Your Param According to Table Storage Design"
}

请参阅屏幕截图:

邮递员回应:

响应以我自己的表格设计为准

[
    {
        "partitionKey": "Microsoft SharePoint Server",
        "rowKey": "2016"
    }
]

请参阅下面的屏幕截图:

注意:对于宇宙数据库集成,您可以在此处查看。带函数的 Azure SQL 可在此处查看。

 类似资料:
  • 主要内容:计算机系统的结构,操作系统做什么?在计算机系统(包括硬件和软件)中,硬件只能理解机器代码(以和的形式代码),这对于一般的用户来说没有任何意义。 我们需要一个可以充当中介的系统,并管理系统中存在的所有进程和资源。 操作系统可以被定义为用户和硬件之间的接口。 它负责执行所有进程,资源分配,CPU管理,文件管理和许多其他任务。 操作系统的目的是提供一种用户可以方便有效地执行程序的环境。 计算机系统的结构 计算机系统包括: 用户(使用电脑

  • 概览 首先我们了解一下 YODAOS 的运行时:YODAOS 基于 ShadowNode 它采用事件驱动、非阻塞I/O模型;在设计之初,ShadowNode 的接口与 Node.js 兼容,因此在大部分场景下,开发者可以像 Node.js 一样使用 ShadowNode,了解这些有利于开发者更快速的进行 YODAOS 上的应用开发。 YODAOS 开发应用时,需要关注应用的性能与稳定性,包括但不限

  • 我试图添加一个自定义attributes对象类,因为我的一个应用程序只使用SamAccountName。 我发现,它需要以下模式来将其添加到LDAP中。

  • 问题内容: 我已经读过Clojure vs. Scala的各种论述,而我意识到两者都有自己的位置。关于将Clojure和Scala进行比较时,有一些注意事项尚未得到完整的解释: 1.)两种语言中哪一种通常 更快 ?我意识到这从一种语言功能到另一种语言功能都会有所不同,但是对性能进行总体评估会有所帮助。例如:我知道Python字典的速度非常快。但作为一个整体,它是一个 多 比Java慢语。我不想和C

  • 我必须为每个客户端每秒存储大约250个数值,即每小时大约90万个数字。它可能不会是全天的记录(可能每天5-10个小时),但我会根据客户端ID和读取日期对数据进行分区。最大行长约为22-23M,这仍然是可管理的。无论如何,我的方案看起来像这样: 密钥空间的复制因子为2,仅用于测试,告密者为和。我知道复制因子3更符合生产标准。 接下来,我在公司服务器上创建了一个小型集群,三台裸机虚拟化机器,具有2个C