Бессерверное ядро 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 необходимо запустить экземпляр для запуска моего кода.