Бессерверное ядро ​​ASP.NET в облаке Alibaba

Если вы не знакомы с термином бессерверные вычисления, вот выдержка с веб-сайта Microsoft Azure:

Понимая определение бессерверных вычислений, важно отметить, что серверы по-прежнему выполняют код. Название без сервера происходит от того факта, что задачи, связанные с предоставлением инфраструктуры и управлением, невидимы для разработчика. Этот подход позволяет разработчикам уделять больше внимания бизнес-логике и повысить ценность ядра бизнеса. Бессерверные вычисления помогают командам повысить производительность и быстрее выводить продукты на рынок, а также позволяют организациям лучше оптимизировать ресурсы и сосредоточиться на инновациях.

На практике это означает, что разработчики могут сосредоточиться на написании кода. Больше не нужно беспокоиться о задачах системного администратора, таких как установка исправлений, установка программного обеспечения, настройка сервера и т. д. Это также дешевле в эксплуатации, а масштабирование становится проблемой, которую должен решить облачный провайдер.

Function Compute — это бессерверная платформа Alibaba Cloud. Я никогда не пользовался Alibaba Cloud (как и мой нынешний работодатель), но я заметил, что в своей ленте LinkedIn все чаще используют его, поэтому решил попробовать.

Для тех, кто не знаком с Alibaba Cloud — это китайский AWS.

Вот мой опыт настройки простого API (построенного в ядре ASP.NET) на вычислении функций Alibaba Cloud (далее я буду называть его просто FC).

Полный пример кода доступен на GitHub здесь.

«Функционализация» ядра ASP.NET

Одна из вещей, которые мне сразу понравились в FC, заключалась в том, насколько легко было взять существующее решение ASP.NET Core и обновить его на всю жизнь в качестве экземпляра FC.

Для демонстрационных целей я написал простой API с набором методов GET и POST.

Вот как выглядит мое решение:

ВАЖНО! Убедитесь, что решение создано как ASP.NET Core версии 2.1. Это единственная поддерживаемая версия ASP.NET Core на FC!

TestController.cs

using Microsoft.AspNetCore.Mvc;
namespace JordanDemoApi.Controllers
{
    [Route("")]
    public class TestController : Controller
    {
        [HttpGet("testget1")]
        public IActionResult TestGet()
        {
            return Ok();
        }
[HttpGet("testget2")]
        public IActionResult TestGet2([FromQuery]string name)
        {
            return Ok($"Hello {name}");
        }
[HttpPost("testpost1")]
        public IActionResult TestPost([FromBody]TestModel message)
        {
            return Ok(message);
        }
[HttpPost("testpost2")]
        public IActionResult TestPost2([FromQuery]string message)
        {
            return Ok(message);
        }
    }
public class TestModel
    {
        public string Message { get; set; }
    }
}

Чтобы этот API работал в FC, мне нужно сделать следующее:

  • Установите следующие пакеты:
    Aliyun.Serverless.Core
    Aliyun.Serverless.Core.Http
  • Создайте класс удаленной точки входа. Именно это дает FC связь с решением ASP.NET Core.

FcRemoteEntrypoint.cs

using Aliyun.Serverless.Core.Http;
using Microsoft.AspNetCore.Hosting;
namespace JordanDemoApi
{
    public class FcRemoteEntrypoint : FcHttpEntrypoint
    {
        protected override void Init(IWebHostBuilder builder)
        {
            builder.UseStartup<Startup>();
        }
    }
}

Подготовьте сборку релиза для развертывания

Весь этот раздел можно автоматизировать с помощью Cake или скриптов, но в демонстрационных целях я делаю это вручную.

Выполнить сборку релиза

dotnet publish -c Release

Создайте ZIP-файл опубликованных артефактов

Этот zip-файл будет использоваться для развертывания в FC на следующих этапах.

Настройка вычисления функции

Я мог бы задокументировать, как это сделать через Terraform на более позднем этапе, но сейчас я расскажу, как это сделать через портал.

Создание функциональной компьютерной службы

Согласно документации:

Служба — это объект, который помогает вам организовывать ресурсы и управлять ими в Function Compute. Все функции службы используют одни и те же конфигурации, такие как авторизация службы и конфигурации ведения журналов. Одна служба может иметь несколько функций, и функции могут совместно использовать ресурсы службы, такие как Logstore и роль службы. Услуга дает следующие преимущества:

– Помогает лучше организовать бизнес-компоненты.
› Служба может представлять собой приложение. Функции, используемые для одного и того же приложения, могут быть объединены в одну службу.
› Ресурсы не могут использоваться совместно службами. То есть сервисы независимы друг от друга.

- Помогает вам управлять ресурсами в виде услуг.

Создать функцию

Функция — это объект, который система использует для планирования и выполнения. Функции должны быть связаны с сервисами. Все функции службы совместно используют свойства службы, такие как авторизация службы и конфигурации ведения журналов.

После создания функции вам будет представлен URL-адрес для запуска функции.

Это сработало?

Теперь мы готовы к тестированию с помощью Curl или Postman.

Из приведенных ниже результатов мы действительно можем подтвердить, что это работает!

Hello jordanjordan@DESKTOP-JDM888:~$ curl 'https://5404968205390777.ap-southeast-2.fc.aliyuncs.com/2016-08-15/proxy/jordan_function/demo-function/testget2?name=jordan' -i
HTTP/1.1 200 OK
Access-Control-Expose-Headers: Date,x-fc-request-id,x-fc-error-type,x-fc-code-checksum,x-fc-invocation-duration,x-fc-max-memory-usage,x-fc-log-result,x-fc-invocation-code-version
Content-Disposition: attachment
Content-Length: 12
Content-Type: text/plain; charset=utf-8
X-Fc-Code-Checksum: 3249765457102152236
X-Fc-Invocation-Duration: 2
X-Fc-Invocation-Service-Version: LATEST
X-Fc-Max-Memory-Usage: 57.02
X-Fc-Request-Id: 6627f832-e4f1-4192-b131-1ee1ccd82c12
Date: Mon, 16 Sep 2019 04:37:21 GMT
Hello jordan
jordan@DESKTOP-JDM888:~$ curl -X POST 'https://5404968205390777.ap-southeast-2.fc.aliyuncs.com/2016-08-15/proxy/jordan_function/demo-function/testpost2?message=hello' -i
HTTP/1.1 200 OK
Access-Control-Expose-Headers: Date,x-fc-request-id,x-fc-error-type,x-fc-code-checksum,x-fc-invocation-duration,x-fc-max-memory-usage,x-fc-log-result,x-fc-invocation-code-version
Content-Disposition: attachment
Content-Length: 5
Content-Type: text/plain; charset=utf-8
X-Fc-Code-Checksum: 3249765457102152236
X-Fc-Invocation-Duration: 2
X-Fc-Invocation-Service-Version: LATEST
X-Fc-Max-Memory-Usage: 57.51
X-Fc-Request-Id: 090cc437-4602-4408-916e-18bb1e8ab025
Date: Mon, 16 Sep 2019 04:41:07 GMT
hello

Время отклика было довольно приличным. Тестируя с Postman, я получил время отклика от 37 мс до 200 мс.

Я предполагаю, что задержка возникает, когда Alibaba Cloud необходимо запустить экземпляр для запуска моего кода.

использованная литература

https://www.alibabacloud.com/help/doc-detail/112379.html?spm=a2c5t.11065259.1996646101.searchclickresult.6b4a7183od7UGV#h2-handlers-with-an-http-trigger4

https://github.com/therealjordanlee/AlibabaCloudFunction