Serverless Custom (Container) Runtime

Node.js внешний интерфейс Serverless

            Serverless Custom (Container) Runtime

Эта статья участвовала в приказе о созыве Haowen, нажмите, чтобы просмотреть:Двойные заявки на внутреннюю и внешнюю стороны, призовой фонд в 20 000 юаней ждет вас, чтобы бросить вызов!

Это 106-я оригинальная статья без воды.Если вы хотите получить больше оригинальных статей, выполните поиск в общедоступном аккаунте и подпишитесь на нас~ Эта статья была впервые опубликована в блоге Zhengcaiyun:Serverless Custom (Container) Runtime

雪霁.png

задний план

Мы знаем, что Serverless можно понимать какServerless = FaaS + BaaS. В бессерверных приложениях для кода бизнес-логики на стороне сервера разработчики используютфункцияреализуется в видеFaaS(Функция как услуга). (Статьи, связанные с бессерверными технологиями, см. в группеГоворя о моем понимании FaaS с Alibaba Cloud FC)

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

Если взять в качестве примера Alibaba Cloud Function Compute FC, вот список поддерживаемых языков разработки:

Поддерживаемые языки Рабочая среда
Node.js Node.js 6.10 (время выполнения = nodejs6),
Node.js 8.9.0 (время выполнения = nodejs8),
Node.js 10.15.3 (время выполнения = nodejs10)
Node.js 12.16.1 (время выполнения = nodejs12)
Python Python 2.7 (время выполнения = python2.7)
Python 3.6 (время выполнения = python3)
PHP PHP 7.2.7 (Runtime = php7.2)
Java Java OpenJDK 1.8.0 (время выполнения = java8)
C# .NET Core 2.1 (среда выполнения = dotnetcore 2.1)
Go Go Custom Runtime
Ruby Ruby Custom Runtime
PowerShell PowerShell Custom Runtime
TypeScript TypeScript Custom Runtime
F# F# Custom Runtime
C++ C++ Custom Runtime
Lua Lua Custom Runtime
Dart Dart Custom Runtime
Другие языки Custom Runtime

Видно, что для наших фронтенд-инженеров, если мы хотим использовать платформу Alibaba Cloud FC, мы не можем использовать Node.js и TypeScript по своему желанию. Поскольку Node.js поддерживает только четыре версии в таблице, а TypeScript сама платформа FC не поддерживает его вообще. Поэтому, чтобы использовать другие версии Node.js и TypeScript, вам нужна специальная среда выполнения.

Так что же такое пользовательская среда выполнения?

концепция

Среда выполнения ( Runtime ) относится к среде, от которой зависит код функции во время выполнения, включая любую библиотеку, пакет кода, фреймворк или платформу. Пользовательская среда выполнения полностьюЦикл выполнения для пользовательских функцийтерритория.

Платформа FaaS реализует среду выполнения пользовательских функций за счет открытости и поддерживает использование в соответствии с потребностями.Любая версия любого языка разработкинаписать функцию.

эффект

Согласно официальной документации Alibaba Cloud, основанной на Custom Runtime, мы можем добиться двух вещей:

  • Настройте среду выполнения персонализированных языков (таких как Go, Lua, Ruby) и младшие версии различных языков (таких как Python 3.7, Node.js 14), чтобы создать собственную среду выполнения.
  • Миграция в один кликСуществующие веб-приложения или веб-проекты, основанные на традиционной разработке, могут быть перенесены на функциональную вычислительную платформу без каких-либо изменений.

Внедрение пользовательской среды выполнения

В этой статье в качестве примера реализации пользовательской среды выполнения будет использоваться Alibaba Cloud FC. Другие платформы, такие как Tencent Cloud SCF, имеют примерно те же принципы и процессы.

Принцип работы

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

сейчасTypescriptПриложение в Node становится все более и более обширным, поэтому я буду реализовывать среду выполнения TypeScript, которая может запускать TS-код.

Шаги

Готов к работе

Чтобы играть в бессерверные приложения быстрее и качественнее, вам необходимо установить один из сервисов Alibaba Cloud.FunTools, который представляет собой инструмент для поддержки бессерверного развертывания приложений, который может помочь нам удобно управлять такими ресурсами, как вычисление функций, шлюз API и служба журналов. Это помогает нам с файлом конфигурации ресурсов (template.yml)Разрабатывать, строить, внедрятьдействовать.

Процесс установки и настройки выглядит следующим образом:

(1) Установка:

// 安装命令
$ npm install @alicloud/fun -g

// 执行 fun --version 检查安装是否成功
$ fun --version

3.6.21

(2) После установки используйтеfun configкоманда для настройки информации об учетной записи (документ конфигурации), следуйте инструкциям, чтобы настроить идентификатор учетной записи, идентификатор ключа доступа, секрет ключа доступа и имя региона по умолчанию.

После завершения настройки сначала создайте проект TypeScript custom-runtime-typescript локально и установите связанные зависимости.

npm i typescript ts-node @types/node

Затем начните процесс разработки пользовательской среды выполнения и шаг за шагом создайте собственную пользовательскую среду выполнения.

1. Создайте HTTP-сервер с портом прослушивания

  • Следует отметить, что эта служба должна контролировать0.0.0.0:CAPortили*:CAPortПорт, по умолчанию 9000. При использовании127.0.0.1:CAPortпорт, что приведет к тайм-ауту запроса

Напишите файл server.ts HTTP-сервера с TS следующим образом:

Примечание. Перед разработкой конкретной логики функции обычно подтверждается, является ли разработанная функция функцией события или функцией HTTP.

import * as http from 'http';

// 创建一个 HTTP Server
const server = http.createServer(function (req: http.IncomingMessage, res: http.ServerResponse): void {
  var rid = req.headers["x-fc-request-id"];
  console.log(`FC Invoke Start RequestId: ${rid}`);
  
  var rawData = "";
  req.on('data', function (chunk) {
    rawData += chunk;
  });
  
  req.on('end', function () {
    // 处理业务逻辑 ……
    console.log(rawData);
    
    res.writeHead(200);
    res.end(rawData);
    console.log(`FC Invoke End RequestId: ${rid}`);
  });
});

server.timeout = 0; // never timeout
server.keepAliveTimeout = 0; // kee palive, never timeout

// 启动 HTTP 服务并监听 0.0.0.0:9000 端口
server.listen(9000, '0.0.0.0', function () {
  console.log('FunctionCompute typescript runtime inited.');
});


После завершения написания можно протестировать, успешно ли запущена служба локально, и запустить приведенный выше код через установленную в проекте команду ts-node:

# 启动 HTTP 服务

$ ./node_modules/.bin/ts-node server.ts

После запуска проверьте команду curl в другом терминале:

$ curl 0.0.0.0:9000 -X POST -d "hello world" -H "x-fc-request-id:123" 

hello world

Если сервис запустился нормально, значит, он может обработать бизнес-логику после получения HTTP-запроса, а затем вернуть результат обработки на платформу FaaS в виде HTTP-ответа.

2. Создайте исполняемый файл начальной загрузки, который запускает целевой сервер.

Когда Function Compute запускает пользовательскую среду выполнения в холодном состоянии, она по умолчанию вызывает файл начальной загрузки для запуска пользовательского HTTP-сервера. Затем этот HTTP-сервер принимает на себя все запросы от системы вычисления функций.

  • bootstrap — это загрузочный файл входа во время выполнения, который сообщает FaaS, как запустить пользовательскую среду выполнения. Когда пользовательская среда выполнения загружает функцию, она всегда извлекает файл начальной загрузки с тем же именем и выполняет программу для запуска пользовательской среды выполнения.
  • bootstrap требует 777 или 755 прав на исполняемый файл
  • Если это сценарий оболочки, обязательно добавьте#!/bin/bash

Создайте загрузочный файл следующим образом:

#!/bin/bash
./node_modules/.bin/ts-node server.ts

3. Напишите файл конфигурации ресурса template.yaml

Напишите файл конфигурации ресурсов template.yaml для развертывания в Function Compute в текущем каталоге:

ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
  custom-runtime: # 服务名称
    Type: 'Aliyun::Serverless::Service' 
    Properties:
      Description: 'helloworld'
    custom-runtime-ts: # 函数名称
      Type: 'Aliyun::Serverless::Function' 
      Properties:
        Handler: index.handler # Handler 在此时没有实质意义,填写任意的一个满足函数计算 Handler 字符集约束的字符串即可, 例如 index.handler
        Runtime: custom # custom 代表自定义运行时
        MemorySize: 512
        CodeUri: './'

4. Разверните, вызовите тест, завершите

(1) Использованиеfun deploy -y Команда развертывает все ресурсы нашей пользовательской среды выполнения и код бизнес-логики в облаке Alibaba.

image-20210505220309647

(2) Используйте команду для вызова функции развертывания для проверки

$ fun invoke -e "hello,my custom runtime"  

image-20210505220520916

Успешный вывод означает, что наша пользовательская среда выполнения готова! Он может напрямую запускать код TS, который мы написали.

image-20210505223345696

Внедрение пользовательской среды выполнения контейнера

Проблема рабочей среды TS может быть решена с помощью Custom Runtime, но проблема, которую некоторые версии платформ Node не поддерживают, не может быть решена таким же образом. Поскольку Node устанавливается глобально, это зависит от системной среды.

Платформа FC уже придумала для нас решения подобных проблем, предоставив нам возможность Custom Container Runtime (пользовательская среда выполнения контейнеров). Платформа FaaS имеет эту возможность, потому что ее основной принцип реализацииДокер-контейнер, поэтому он использует контейнерную технологию,Упакуйте наш код приложения и среду выполнения в виде образа Docker., чтобы сохранить целостность окружающей среды. Постройте один раз, бегайте везде.

Принцип работы

Как работает пользовательская среда выполнения контейнеровCustom Runtimeв основном то же самое:

  • Прежде чем система вычислений функций инициализирует экземпляр среды выполнения, она будет играть роль службы функции, получит временное имя пользователя и пароль ивытащить изображение.
  • После успешного извлечения запустите настроенный HTTP-сервер в соответствии с указанной командой запуска Command, параметром Args и портом CAPort (по умолчанию 9000).
  • Затем этот HTTP-сервер принимает на себя все запросы от системы вычислений функций, в том числе от вызовов функций событий и вызовов функций HTTP.

Давайте настроим среду выполнения контейнера Node v16.1.0.

Шаги

1. Пользовательский HTTP-сервер

Этот шаг такой же, как и в пользовательской среде выполнения, с использованием Node.js Express для настройки службы HTTP server.js, методы GET и POST, соответственно, направляют к другому обработчику:

// server.js 文件
'use strict';

const express = require('express');

// Constants
const PORT = 9000;
const HOST = '0.0.0.0';

// HTTP 函数调用
const app = express();
app.get('/*', (req, res) => {
  res.send(`Hello FunctionCompute, http function, runtime is : Node ${process.version}\n`);
});

// 事件函数调用
app.post('/invoke', (req, res) => {
  res.send(`Hello FunctionCompute, event function,runtime is : Node ${process.version}\n`);
});

// 启动 HTTP 服务并监听 9000 端口
var server = app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);

server.timeout = 0; // never timeout
server.keepAliveTimeout = 0; // keepalive, never timeout

Запустите сервис и протестируйте его локально:

# 启动 HTTP 服务
$ node server.js
# 新开一个终端,通过 curl 命令测试
$ curl http://0.0.0.0:9000
Hello FunctionCompute, http GET, this runtime is : Node v11.5.0     # 这是我本地的 Node 版本,后面在自定义容器中会输出 v16.1.0                 

Проверка пройдена.

2. Создайте изображение и загрузите его

Точно так же сначала нужно сделать две приготовления:

Затем сначала напишите файл Dockerfile, затем создайте образ, содержащий среду выполнения и код приложения версии, указанной в Node, и, наконец, загрузите его в собственный репозиторий образов.

(Студенты, которым это нужно, могут сначала прочитать эту статьюКак докеризировать веб-приложение Node.js)

(1) Напишите Dockerfile:

# 基于基础镜像 node:16.1.0-alpine3.11 构建我们自己的镜像
FROM node:16.1.0-alpine3.11

# 设置容器工作目录
WORKDIR /usr/src/app

# 将 package.json 和 package-lock.json 都拷贝到工作目录
COPY package*.json ./

# 安装依赖
RUN npm install

# 将当前目录下的所有文件拷贝到容器工作目录中
COPY . .

# 暴露容器 8080 端口
EXPOSE 8080

# 在容器中启动应用程序
ENTRYPOINT [ "node", "server.js" ]

(2) Установите и запустите Docker, войдите в сервис Alibaba Cloud Image, соберите и загрузите:

# 登录
$ sudo docker login --username=xxx registry.cn-hangzhou.aliyuncs.com

После успешного входа сначала создайте образ Docker:

# 指定ACR镜像地址:其中 my_serverless 为你自己的容器命名空间;nodejs 为你自己的镜像仓库名称;v16.1.0 为镜像版本号
$ export IMAGE_NAME="registry.cnhangzhou.aliyuncs.com/my_serverless/nodejs:v16.1.0"

# 构建镜像
# -t 给镜像取名字打标签,通常 name:tag 或者 name 格式
$ docker build -t $IMAGE_NAME .

Перезапустите контейнер и откройте браузер локальноhttp://localhost:9000/Посмотрите, нормально ли он отвечает, чтобы убедиться, что наш пользовательский образ может успешно работать:

# 启动容器: 将容器的 9000 端口映射到主机的 9000 端口
$ docker run -p 9000:9000 -d $IMAGE_NAME
image-20210514150709489

После того, как проверка пройдена, наконец, загрузите изображение:

# 上传镜像
$ docker push $IMAGE_NAME  

После успешной загрузки вы можете увидеть наше изображение в сервисе облачных изображений Alibaba. Вы можете использовать его позже!

image-20210509153919228

3. Определите шаблон.yaml

Создаватьtemplate.yamlФайлы следующие:

ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
  CustomContainerRuntime: # 服务名称
    Type: 'Aliyun::Serverless::Service'
    Properties:
      Policies:
        - AliyunContainerRegistryReadOnlyAccess
      InternetAccess: true
    nodejs-express-http: # 函数名称
      Type: 'Aliyun::Serverless::Function'
      Properties:
        Description: 'HTTP function powered by nodejs express'
        Runtime: custom-container # 表示自定义容器
        Timeout: 60
        CAPort: 9000 # 注意!这里Custom Container Runtime使用的监听端口一定要和HTTP Server监听的端口保持一致,否则会出现错误
        Handler: not-used
        MemorySize: 1024
        CodeUri: ./   # Root directory for the function or the Dockerfile path
        CustomContainerConfig: # 容器镜像配置
          # Sample image value: registry-vpc.cn-shenzhen.aliyuncs.com/fc-demo/nodejs-express:v0.1  使用同地域的VPC镜像地址加速
          Image: 'registry.cn-hangzhou.aliyuncs.com/my_serverless/nodejs:v16.1.0'
          Command: '[ "node"]'
          Args: '["server.js"]'
      Events:
        http-trigger-test:
          Type: HTTP
          Properties:
              AuthType: ANONYMOUS
              Methods: ['GET', 'POST', 'PUT']
4. Тест развертывания
# 使用命令部署到 FC 
$ fun deploy -y
image-20210509163842880

После успешного развертывания переходим на платформу FC для тестирования.

потому что мыtemplate.yamlНастроенный триггер — это триггер http, поэтому мы нажимаем кнопку «Выполнить» для отладки и обнаруживаем, что он работает нормально, а возвращаемый результат — время выполнения: Node v16.1.0, что указывает на то, что наша настраиваемая среда выполнения контейнера также была успешно реализовано!

image-20210509163945647

резюме

Custom Runtime снимает ограничения платформы FAAS на язык; Custom Container Runtime позволяет разработчикам упаковывать код приложений и работающие среды в контейнеры в зависимости от доставки, оптимизировать работу разработчиков, повышать эффективность разработки и доставки.

Пользовательские (контейнерные) среды выполнения позволяют нашим разработчикам использовать Serverless с более высокой степенью свободы, и с их помощью мы можем переносить наши веб-приложения одним щелчком мыши без модификации кода.

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

what-is-runtime

Создание Deno Runtime для Alibaba Cloud Serverless

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

забавный инструмент

Function Compute поддерживает образы контейнеров, ускоряя бессерверные процессы приложений.

Пользовательская среда выполнения — выход за пределы языка облачных функций

Рекомендуемое чтение

Возможности Vite и частичный анализ исходного кода

Как я использую git на работе

Изучите неизменяемость за 15 минут

работы с открытым исходным кодом

  • Zhengcaiyun интерфейсный таблоид

адрес с открытым исходным кодомwww.zoo.team/openweekly/(На главной странице официального сайта таблоида есть группа обмена WeChat)

Карьера

ZooTeam, молодая, увлеченная и творческая команда, связанная с отделом исследований и разработок продукции Zhengcaiyun, базируется в живописном Ханчжоу. В настоящее время в команде более 40 фронтенд-партнеров, средний возраст которых составляет 27 лет, и почти 30% из них — инженеры полного стека, настоящая молодежная штурмовая группа. В состав членов входят «ветераны» солдат из Ali и NetEase, а также первокурсники из Чжэцзянского университета, Университета науки и технологий Китая, Университета Хандянь и других школ. В дополнение к ежедневным деловым связям, команда также проводит технические исследования и фактические боевые действия в области системы материалов, инженерной платформы, строительной платформы, производительности, облачных приложений, анализа и визуализации данных, а также продвигает и внедряет ряд внутренних технологий. Откройте для себя новые горизонты передовых технологических систем.

Если вы хотите измениться, вас забрасывают вещами, и вы надеетесь начать их бросать; если вы хотите измениться, вам сказали, что вам нужно больше идей, но вы не можете сломать игру; если вы хотите изменить , у вас есть возможность добиться этого результата, но вы не нужны; если вы хотите изменить то, чего хотите достичь, вам нужна команда для поддержки, но вам некуда вести людей; если вы хотите изменить установившийся ритм, это будет "5 лет рабочего времени и 3 года стажа работы"; если вы хотите изменить исходный Понимание хорошее, но всегда есть размытие того слоя оконной бумаги.. , Если вы верите в силу веры, верьте, что обычные люди могут достичь необыкновенных вещей, и верьте, что они могут встретить лучшего себя. Если вы хотите участвовать в процессе становления бизнеса и лично способствовать росту фронтенд-команды с глубоким пониманием бизнеса, надежной технической системой, технологиями, создающими ценность, и побочным влиянием, я думаю, что мы должны говорить. В любое время, ожидая, пока вы что-нибудь напишете, отправьте это наZooTeam@cai-inc.com