Развертывание веб-приложения с использованием Java Servlet API
Узнайте, как с помощью serverless-технологий и Java Servlet API создать небольшое веб-приложение для управления списком задач.
Чтобы создать веб-приложение:
- Подготовьте облако к работе.
- Подготовьте окружение.
- Создайте бакет Yandex Object Storage.
- Создайте базу данных YDB.
- Создайте функции Yandex Cloud Functions.
- Создайте API-шлюз.
- Протестируйте приложение.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVEилиTRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость ресурсов поддержки веб-приложения входят:
- Плата за количество запросов к API-шлюзу и исходящий трафик (см. тарифы Yandex API Gateway).
- Плата за операции с YDB и хранение данных (см. тарифы Yandex Managed Service for YDB).
- Плата за количество вызовов функции, вычислительные ресурсы, выделенные для выполнения функции, и исходящий трафик (см. тарифы Cloud Functions).
Подготовьте окружение
-
Создайте сервисный аккаунт и назначьте ему роль
editorна ваш каталог. -
Склонируйте репозиторий
c проектом:git clone https://github.com/yandex-cloud-examples/yc-serverless-servlet -
Добавьте содержимое склонированного локального репозитория
yc-serverless-servletв ZIP-архивservlet.zip. Архив потребуется позднее для создания функций Yandex Cloud Functions.
Создайте бакет Object Storage
Создайте бакет и загрузите в него файл index.html:
- В консоли управления
выберите каталог, в котором хотите создать бакет. - Выберите сервис Object Storage.
- Нажмите кнопку Создать бакет.
- На странице создания бакета:
- Введите имя бакета в соответствии с правилами именования.
- При необходимости ограничьте максимальный размер бакета.
- В полях Доступ на чтение объектов, Доступ к списку объектов и Доступ на чтение настроек выберите
Ограниченный. - Выберите класс хранилища по умолчанию.
- Нажмите кнопку Создать бакет для завершения операции.
- Выберите созданный бакет.
- Нажмите кнопку Загрузить и выберите в папке с проектом файл
src/main/resources/index.html. - Выберите класс хранилища для файла и нажмите кнопку Загрузить.
Создайте базу данных Managed Service for YDB
-
Создайте базу данных в режиме Serverless:
Консоль управления-
В консоли управления
выберите каталог, в котором создали бакет. -
Выберите сервис Managed Service for YDB.
-
Нажмите кнопку Создать базу данных.
-
Введите Имя базы. Требования к имени:
- длина — от 2 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
-
В блоке Тип базы данных выберите
Serverless. -
Нажмите кнопку Создать базу данных.
-
Дождитесь запуска базы данных. В процессе создания база будет иметь статус
Provisioning, а когда станет готова к использованию, статус изменится наRunning. -
Выберите созданную БД.
-
В блоке Соединение найдите поле Эндпоинт и сохраните его значение. Оно понадобится при создании функций.
-
-
Создайте таблицу с именем
Tasks:Консоль управленияCLI-
В консоли управления
выберите каталог, в котором создали базу данных. -
Выберите сервис Managed Service for YDB.
-
На странице Базы данных выберите базу.
-
Чтобы открыть корневую директорию базы, перейдите на вкладку Навигация.
-
Для создания запроса к базе в правом верхнем углу нажмите кнопку Новый SQL-запрос. Откроется страница Запрос.
-
В поле Запрос введите:
CREATE TABLE Tasks ( TaskId Utf8, Name Utf8, Description Utf8, CreatedAt Datetime, PRIMARY KEY (TaskId) ); -
Нажмите кнопку Выполнить.
Выполните запрос:
ydb -e grpcs://<YDB_эндпоинт> -d <имя_БД> \ scripting yql -s \ "CREATE TABLE Tasks ( TaskId Utf8, Name Utf8, Description Utf8, CreatedAt Datetime, PRIMARY KEY (TaskId) );" -
Создайте функции Cloud Functions
Создайте функцию для каждого сервлета:
- В консоли управления
перейдите в каталог, в котором создали бакет и базу данных. - Выберите сервис Cloud Functions.
- Нажмите кнопку Создать функцию.
- Введите имя
add-taskи описание функции. - Нажмите кнопку Создать.
- В блоке Редактор выберите среду выполнения
java21, выключите опцию Добавить файлы с примерами кода и нажмите кнопку Продолжить. - Подготовьте код функции. Для этого в поле Способ выберите
ZIP-архив. - В поле Файл нажмите кнопку Прикрепить файл и выберите созданный ранее архив
servlet.zip. - В поле Точка входа введите
yandex.cloud.examples.serverless.todo.AddTaskServlet. - В поле Таймаут установите значение
10. - В поле Сервисный аккаунт укажите аккаунт, созданный при подготовке окружения.
- Добавьте переменные окружения:
ENDPOINT— введите первую часть сохраненного при создании базы данных YDB значения поля Эндпоинт (часть между вхождениямиgrpcs://и/?database=). Например,ydb.serverless.yandexcloud.net:2135.DATABASE— введите вторую часть сохраненного при создании базы данных YDB значения поля Эндпоинт (часть после вхождения/?database=). Например,/ru-central1/r1gra875baom********/g5n22e7ejfr1********.
- Нажмите кнопку Сохранить изменения.
- На странице Обзор включите опцию Публичная функция.
- Повторите шаги 3-14 и создайте функцию с именем
list-tasksи точкой входаyandex.cloud.examples.serverless.todo.ListTasksServlet. - Повторите шаги 3-14 и создайте функцию с именем
delete-taskи точкой входаyandex.cloud.examples.serverless.todo.DeleteTaskServlet.
-
Создайте функцию с именем
add-task:yc serverless function create --name=add-taskРезультат:
id: d4ejb1799eko******** folder_id: aoek49ghmknn******** created_at: "2021-03-08T14:07:32.134Z" name: add-task log_group_id: eolm8aoq9vcp******** http_invoke_url: https://functions.yandexcloud.net/d4ejb1799eko******** status: ACTIVE -
Создайте версию функции
add-task:yc serverless function version create \ --function-name=add-task \ --runtime java21 \ --entrypoint yandex.cloud.examples.serverless.todo.AddTaskServlet \ --memory 128m \ --execution-timeout 10s \ --source-path ./servlet.zip \ --environment DATABASE=<имя_БД>,ENDPOINT=<YDB_эндпоинт>Где:
--function-name— имя функции, версию которой вы хотите создать.--runtime— среда выполнения.--entrypoint— точка входа, указывается в формате<имя_файла_с_функцией>.<имя_обработчика>.--memory— объем RAM.--execution-timeout— максимальное время выполнения функции до таймаута.--source-path— путь к созданному ранее ZIP-архивуservlet.zipс кодом функции и необходимыми зависимостями.--environment— переменные окружения в форматеkey=value.
Результат:
done (1s) id: d4evvn8obisa******** function_id: d4ejb1799eko******** ... tags: - $latest log_group_id: ckg3qh8h363p******** -
Сделайте функцию публичной:
yc serverless function allow-unauthenticated-invoke add-taskРезультат:
done (1s) -
Повторите шаги 1-3 и создайте функцию с именем
list-tasksи точкой входаyandex.cloud.examples.serverless.todo.ListTasksServlet. -
Повторите шаги 1-3 и создайте функцию с именем
delete-taskи точкой входаyandex.cloud.examples.serverless.todo.DeleteTaskServlet.
Воспользуйтесь API методами create, createVersion и setAccessBindings для ресурса Function.
Создайте API-шлюз
Для обеспечения взаимодействия между сервисами создайте API-шлюз:
-
В консоли управления
выберите каталог, в котором создали бакет, базу данных и функции. -
Выберите сервис API Gateway.
-
Нажмите кнопку Создать API-шлюз.
-
Введите имя шлюза и описание.
-
В поле Спецификация добавьте спецификацию:
openapi: 3.0.0 info: title: ToDo list version: 1.0.0 paths: /: get: x-yc-apigateway-integration: type: object-storage bucket: <бакет> object: index.html presigned_redirect: false service_account: <сервисный_аккаунт> operationId: static /add: post: x-yc-apigateway-integration: type: cloud-functions function_id: <идентификатор_add-task> operationId: addTask /list: get: x-yc-apigateway-integration: type: cloud-functions function_id: <идентификатор_list-tasks> operationId: listTasks /delete: delete: x-yc-apigateway-integration: type: cloud-functions function_id: <идентификатор_delete-task> operationId: deleteTaskГде:
bucket— имя бакета, в котором лежит файлindex.html.service_account— идентификатор сервисного аккаунта, созданного при подготовке окружения.- Блок
/add, параметрfunction_id— идентификатор функцииadd-task. - Блок
/list, параметрfunction_id— идентификатор функцииlist-tasks. - Блок
/delete, параметрfunction_id— идентификатор функцииdelete-task.
-
Нажмите кнопку Создать.
-
Сохраните следующую спецификацию в файл
todo.yaml:openapi: 3.0.0 info: title: ToDo list version: 1.0.0 paths: /: get: x-yc-apigateway-integration: type: object-storage bucket: <бакет> object: index.html presigned_redirect: false service_account: <сервисный_аккаунт> operationId: static /add: post: x-yc-apigateway-integration: type: cloud-functions function_id: <идентификатор_add-task> operationId: addTask /list: get: x-yc-apigateway-integration: type: cloud-functions function_id: <идентификатор_list-tasks> operationId: listTasks /delete: delete: x-yc-apigateway-integration: type: cloud-functions function_id: <идентификатор_delete-task> operationId: deleteTaskГде:
bucket— имя бакета, в котором лежит файлindex.html.service_account— идентификатор сервисного аккаунта, созданного при подготовке окружения.- Блок
/add, параметрfunction_id— идентификатор функцииadd-task. - Блок
/list, параметрfunction_id— идентификатор функцииlist-tasks. - Блок
/delete, параметрfunction_id— идентификатор функцииdelete-task.
-
Создайте API-шлюз:
yc serverless api-gateway create \ --name todo-list \ --spec=todo.yaml \ --description "simple todo list"Результат:
done (41s) id: d5delqeel34q******** folder_id: b1g86q4m5vej******** created_at: "2021-03-08T14:07:32.134Z" name: todo-list description: simple todo list status: ACTIVE domain: d5dm1lba80md********.i9******.apigw.yandexcloud.net log_group_id: ckg2hdmevnvc********
Проверьте работу приложения
Чтобы открыть приложение, перейдите по ссылке, указанной в поле Служебный домен созданного API-шлюза.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: