azure - 如何在 Azure(而不是 AWS 亚马逊)上构建无服务器网站

标签 azure aws-lambda azure-functions serverless-framework serverless-architecture

如何在 Azure 上构建无服务器网站,作为“自动扩展、按执行付费、事件驱动的应用程序”?

有大量关于如何在 AWS 上构建无服务器架构网站的好例子 Amazon,例如https://zanon.io/posts/building-serverless-websites-on-aws-tutorial 它使用 S3 来处理 HTML 和 JS,使用 Lambda 来处理 REST API,使用 Simple DB 来处理数据。

微软拥有类似于AWS Lambda的Azure Functions,但它是“无服务器计算”,而不是“无服务器网站”。我可以使用 Azure Functions 创建“无服务器 REST API”,但是用于网站、数据库等的 HTML、JS、CSS 又如何呢?

我尝试了 Azure 应用服务,但它缺少“仅按使用量付费”选项,因为所有计划都按月付款,以及用于数据库的 Azure SQL。而且应用服务似乎并不是为了托管无服务器架构网站而构建的,更多的是为了可以轻松部署到那里的经典 ASP.NET 网站。

此外,还有一个流行的库 https://github.com/serverless/serverless他们甚至提到了 Azure:“使用 AWS Lambda、Azure Functions、Google CloudFunctions 等”,但没有一个示例如何将其用于 Azure,所有文档均适用于 Amazon AWS。

谢谢!

最佳答案

这是一个有趣的问题,答案是你当然可以使用Azure功能构建一个网站。您可以创建一个 http 触发器,该触发器返回您包含在函数中的静态 html 文件。如果需要,您可以将 Javascript 或 jQuery 逻辑添加到该文件中。为了获得更多功能,您可以创建更多用作 API 的函数,您可以从 html 文件中查询这些函数。 API 可以例如利用 Azure 存储,您可以廉价地将数据存储在表或 blob 中。

使用此模式,理论上您可以在无服务器架构上构建复杂的 Web 应用程序。然而,我猜您可能会发现它使用起来有点麻烦,因为工具还不是很好。另一方面,您永远不需要考虑托管/扩展,所以这是一个很大的优点。

为了证明我的理论,我实现了一个带有两个 c# http 触发函数的小型函数应用程序:一个用于提供 html 文件,另一个用于返回数字的 api。它只是为了证明这一点而快速拼凑在一起,所以如果代码困惑,我深表歉意。

HttpTriggerCSharp1:

using System.Net;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.IO;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req,    TraceWriter log)
{
log.Info("C# HTTP trigger function processed a request.");

var response = new HttpResponseMessage(HttpStatusCode.OK);
var stream = new FileStream(@"d:\home\site\wwwroot\HttpTriggerCSharp1\index.html", FileMode.Open);
response.Content = new StreamContent(stream);
response.Content.Headers.ContentType = new    MediaTypeHeaderValue("text/html");
return response;
}

HttpTriggerCSharp2:

using System.Net;

public static async Task<int> Run(HttpRequestMessage req, TraceWriter log)
{
    return 42;
}

index.html: (请注意,您必须将 index.html 文件添加到函数文件集合中)

<html>
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
</head>
<body>
<script type="text/javascript">
    $(document).ready(function() {
        var original = $("#testDiv").text();
        $("#testDiv").text(original + " - jQuery added this!");
        $("#testButton").click(ButtonClick);
    });

    var i = 0;
    function ButtonClick() {
        i++;
        var result = i + i;
        $.ajax("https://testfunctionwebsite.azurewebsites.net/api/HttpTriggerCSharp2").done(function(a,b) {
            var queryResult = a;
            $("#ajaxResult").text("Result from api:" + queryResult);
        });
        $("#ajaxResult").text(result);

    }
</script>
<div id="testDiv">
Hello functional world!
</div>

<div>
<button id="testButton">Get some values</button><br>
<div id="ajaxResult"></div>
</div>
</body>
</html>

您可以尝试一下:https://testfunctionwebsite.azurewebsites.net/api/HttpTriggerCSharp1

关于azure - 如何在 Azure(而不是 AWS 亚马逊)上构建无服务器网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41789192/

相关文章:

azure - 如何使 Azure Function 代码在 Azure ARM json 模板中可读

azure - 如何通过azure使用现有数据?

linux - Azure Linux B1s VM - 已安装 Jenkins 服务器,但主页未打开

asp.net-mvc-3 - Azure ACS + 表单值存储

json - AWS Lambda 函数 - 无法调用更新事物影子

azure 函数 - 当 eventhub 中的新事件时触发,将其写入 cosmos db - 不起作用,为什么?

unit-testing - 在使用 Linq 查询的单元测试中模拟 IDocumentQuery

amazon-ec2 - 不带自动伸缩的 ECS 集群

Json解析映射key

azure - 是否可以从 Azure Function 停止/启动 Azure ARM 虚拟机?