Эта статья участвовала в приказе о созыве Haowen, нажмите, чтобы просмотреть:Двойные заявки на внутреннюю и внешнюю стороны, призовой фонд в 20 000 юаней ждет вас, чтобы бросить вызов!
Это 106-я оригинальная статья без воды.Если вы хотите получить больше оригинальных статей, выполните поиск в общедоступном аккаунте и подпишитесь на нас~ Эта статья была впервые опубликована в блоге Zhengcaiyun:Serverless Custom (Container) Runtime
задний план
Мы знаем, что 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.
(2) Используйте команду для вызова функции развертывания для проверки
$ fun invoke -e "hello,my custom runtime"
Успешный вывод означает, что наша пользовательская среда выполнения готова! Он может напрямую запускать код TS, который мы написали.
Внедрение пользовательской среды выполнения контейнера
Проблема рабочей среды 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. Создайте изображение и загрузите его
Точно так же сначала нужно сделать две приготовления:
-
1) Установите и запустите Докер
-
2) Используйте службу изображения с облачным контейнером AlibabaСоздайте пространство имен и хранилище зеркалХранение нашего пользовательского изображения
Затем сначала напишите файл 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
После того, как проверка пройдена, наконец, загрузите изображение:
# 上传镜像
$ docker push $IMAGE_NAME
После успешной загрузки вы можете увидеть наше изображение в сервисе облачных изображений Alibaba. Вы можете использовать его позже!
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
После успешного развертывания переходим на платформу FC для тестирования.
потому что мыtemplate.yaml
Настроенный триггер — это триггер http, поэтому мы нажимаем кнопку «Выполнить» для отладки и обнаруживаем, что он работает нормально, а возвращаемый результат — время выполнения: Node v16.1.0, что указывает на то, что наша настраиваемая среда выполнения контейнера также была успешно реализовано!
резюме
Custom Runtime снимает ограничения платформы FAAS на язык; Custom Container Runtime позволяет разработчикам упаковывать код приложений и работающие среды в контейнеры в зависимости от доставки, оптимизировать работу разработчиков, повышать эффективность разработки и доставки.
Пользовательские (контейнерные) среды выполнения позволяют нашим разработчикам использовать Serverless с более высокой степенью свободы, и с их помощью мы можем переносить наши веб-приложения одним щелчком мыши без модификации кода.
использованная литература
Создание Deno Runtime для Alibaba Cloud Serverless
Пользовательское описание среды выполнения
Function Compute поддерживает образы контейнеров, ускоряя бессерверные процессы приложений.
Пользовательская среда выполнения — выход за пределы языка облачных функций
Рекомендуемое чтение
Возможности Vite и частичный анализ исходного кода
Изучите неизменяемость за 15 минут
работы с открытым исходным кодом
- Zhengcaiyun интерфейсный таблоид
адрес с открытым исходным кодомwww.zoo.team/openweekly/(На главной странице официального сайта таблоида есть группа обмена WeChat)
Карьера
ZooTeam, молодая, увлеченная и творческая команда, связанная с отделом исследований и разработок продукции Zhengcaiyun, базируется в живописном Ханчжоу. В настоящее время в команде более 40 фронтенд-партнеров, средний возраст которых составляет 27 лет, и почти 30% из них — инженеры полного стека, настоящая молодежная штурмовая группа. В состав членов входят «ветераны» солдат из Ali и NetEase, а также первокурсники из Чжэцзянского университета, Университета науки и технологий Китая, Университета Хандянь и других школ. В дополнение к ежедневным деловым связям, команда также проводит технические исследования и фактические боевые действия в области системы материалов, инженерной платформы, строительной платформы, производительности, облачных приложений, анализа и визуализации данных, а также продвигает и внедряет ряд внутренних технологий. Откройте для себя новые горизонты передовых технологических систем.
Если вы хотите измениться, вас забрасывают вещами, и вы надеетесь начать их бросать; если вы хотите измениться, вам сказали, что вам нужно больше идей, но вы не можете сломать игру; если вы хотите изменить , у вас есть возможность добиться этого результата, но вы не нужны; если вы хотите изменить то, чего хотите достичь, вам нужна команда для поддержки, но вам некуда вести людей; если вы хотите изменить установившийся ритм, это будет "5 лет рабочего времени и 3 года стажа работы"; если вы хотите изменить исходный Понимание хорошее, но всегда есть размытие того слоя оконной бумаги.. , Если вы верите в силу веры, верьте, что обычные люди могут достичь необыкновенных вещей, и верьте, что они могут встретить лучшего себя. Если вы хотите участвовать в процессе становления бизнеса и лично способствовать росту фронтенд-команды с глубоким пониманием бизнеса, надежной технической системой, технологиями, создающими ценность, и побочным влиянием, я думаю, что мы должны говорить. В любое время, ожидая, пока вы что-нибудь напишете, отправьте это наZooTeam@cai-inc.com