Облачные функции с использованием нового времени выполнения Java

Одним из основных моментов последнего выпуска Appwrite является добавление четырех новых исполнительных режимов Cloud Function! Java, Kotlin, .NET и C++ теперь являются частью нашего постоянно растущего списка исполнительных сред! 🤯

В этой статье мы рассмотрим написание Cloud Functions с использованием среды выполнения Java. Если вы являетесь разработчиком Android, вы можете создать свое приложение и написать все необходимые облачные функции без необходимости изучать какой-либо новый язык! 🤩

🤔 Новичок в Appwrite?

Appwrite — это open source backend-as-a-service, который абстрагирует все сложности, связанные с созданием современного приложения, предоставляя вам набор REST API для основных потребностей бэкенда. Appwrite обрабатывает аутентификацию и авторизацию пользователей, базы данных реального времени, файловые хранилища, облачные функции, веб-крючки и многое другое! Если чего-то не хватает, вы можете расширить Appwrite, используя ваш любимый язык бэкенда.

📝 Предварительные условия

Прежде чем мы начнем, необходимо выполнить несколько предварительных условий. Если у вас уже есть все необходимые условия, вы можете пропустить следующий раздел.

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

  • 🖥 Экземпляр Appwrite

Если вы еще не установили экземпляр Appwrite, вы можете следовать руководствам по началу работы, чтобы быстро начать работу. Вы можете выбрать между установкой в один клик на DigitalOcean и ручной установкой с помощью Docker.

TL;DR — Для установки Appwrite достаточно выполнить всего одну команду

docker run -it --rm 
    --volume /var/run/docker.sock:/var/run/docker.sock 
    --volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw 
    --entrypoint="install" 
    appwrite/appwrite:0.14.2
Войти в полноэкранный режим Выйти из полноэкранного режима

Как только ваш сервер будет запущен, зайдите в Appwrite Dashboard на публичный IP-адрес вашего сервера (или localhost, если вы установили локально) и создайте новую учетную запись пользователя.

  • 🧑💻 Appwrite CLI

В этом упражнении мы будем использовать Appwrite CLI, так как он делает процесс очень простым. Если у вас установлен Node.js, команда установки будет простой

npm install -g appwrite-cli
Войти в полноэкранный режим Выйти из полноэкранного режима

Если npm вам не подходит, у нас есть множество вариантов установки, которые вы можете найти в руководстве по началу работы с CLI

🏁 Начало работы

Когда все готово, можно приступать! Войдите в Appwrite CLI с помощью следующей команды и используйте для входа учетные данные, которые мы использовали при настройке сервера Appwrite.

appwrite login
? Enter your email test@test.com
? Enter your password ********
✓ Success
Войдите в полноэкранный режим Выйти из полноэкранного режима

Далее нам нужно создать новый проект Appwrite для работы. Мы можем использовать следующую команду для его настройки

appwrite init project
? How would you like to start? Create a new Appwrite project
? What would you like to name your project? My Awesome Project
✓ Success
Войти в полноэкранный режим Выйти из полноэкранного режима

Вы можете дать своему проекту любое имя по своему выбору. В данном случае я буду придерживаться имени по умолчанию. Вы заметите новый файл appwrite.json в текущем каталоге, который хранит всю информацию о вашем проекте.

Пора приступать к написанию нашей функции! Но подождите, нам не нужно начинать с нуля! CLI может настроить все шаблоны за нас с помощью следующей команды

appwrite init function
? What would you like to name your function? java-example
? What runtime would you like to use? Java (java-17.0)
✓ Success 
Войти в полноэкранный режим Выйти из полноэкранного режима

Дайте вашей функции имя и выберите среду выполнения Java 17.0. Это создаст новую функцию Appwrite Function в вашем проекте и установит весь необходимый код. Не стесняйтесь изучить файлы, созданные в каталоге functions/java-example. Вы увидите, что CLI создал простую функцию Java, которая возвращает очень важное сообщение JSON

{
    "areDevelopersAwesome":true
}
Войти в полноэкранный режим Выйти из полноэкранного режима

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

appwrite deploy function
? Which functions would you like to deploy? java-example (6286f6905af1e032e934)
ℹ Info Deploying function java-example ( 6286f6905af1e032e934 )
ℹ Info Ignoring files using configuration from appwrite.json
✓ Success Deployed java-example ( 6286f6905af1e032e934 )
Вход в полноэкранный режим Выход из полноэкранного режима

Команда appwrite deploy function упаковывает ваш исходный код, загружает его на сервер Appwrite и инициирует процесс сборки. В это время устанавливаются все зависимости функции и создается файл .jar для вашей функции.

Вы можете перейти на панель Appwrite Dashboard, чтобы проследить за ходом развертывания.

После завершения развертывания вы можете выполнить свою функцию, нажав кнопку Execute Now.

Первое выполнение приводит к тому, что мы называем холодным запуском. По сути, это первый раз, когда создается среда выполнения, поэтому он занимает немного больше времени. Как вы можете видеть, первое выполнение заняло около 331 мс, а последующие — около 4 мс. Теперь, когда мы имеем представление о полном рабочем процессе, мы можем начать возиться с кодом и написать несколько классных функций.

🧮 Ответ на самый фундаментальный вопрос в математике

Как следует из названия, мы собираемся написать облачную функцию для ответа на один из самых фундаментальных вопросов математики.

Является ли данное число четным или нечетным? Я знаю, о чем вы думаете… Это так просто! Зачем мне нужна облачная функция? Я могу просто написать

class Main {
    public static void main(String[ ] args) {
        int x = 12;
        System.out.println( x%2 == 0 ); // true
        System.out.println( (x/2) * 2 == x ); // true
        System.out.println( (x & 1) == 0 ); // true
        System.out.println( ( x >> 1) << 1  == x ); // true
    }
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Но подождите! Мы выходим на новый уровень. Мы собираемся определить, является ли наше число четным или нечетным, используя один из самых сложных и хорошо написанных API! API isEven.

Шутки в сторону, этот пример призван проиллюстрировать, как вы можете делать вызовы API из вашей облачной функции, что позволит вам создать все, что вы захотите.

Во-первых, откройте папку java-example в вашей любимой IDE. Давайте начнем с чистого холста и очистим наш файл src/Index.java, чтобы

import java.util.Map;
import java.util.HashMap;

public RuntimeResponse main(RuntimeRequest req, RuntimeResponse res) throws Exception {
    Map<String, Object> data = new HashMap<>();
    data.put("message", "Hello World!");
    return res.json(data);
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Чтобы легче работать с объектами JSON, мы воспользуемся популярной библиотекой gson. Включите следующую зависимость в файл deps.gradle.

dependencies {
    implementation 'com.google.code.gson:gson:2.9.0'
}
Вход в полноэкранный режим Выход из полноэкранного режима

Далее напишем код для чтения и разбора числа, переданного в качестве аргумента этой функции.

import java.util.Map;
import java.util.HashMap;
import com.google.gson.Gson;

final Gson gson = new Gson();

public RuntimeResponse main(RuntimeRequest req, RuntimeResponse res) throws Exception {

    String payloadString = req.getPayload() == null || req.getPayload().isEmpty() 
        ? "{}" 
        : req.getPayload();

    Map<String, Object> payload = gson.fromJson(payloadString, Map.class);

    String number = "2";
    if (payload.containsKey("number") && payload.get("number") != null) {
        number = payload.get("number").toString();
    }

    Map<String, Object> data = new HashMap<>();
    data.put("message", "Hello World!");
    return res.json(data);
}
Вход в полноэкранный режим Выход из полноэкранного режима

Давайте проанализируем код, который мы только что написали. Из документации к функции мы видим, что payload доступен через объект request и представляет собой строку JSON, которую необходимо преобразовать в объект JSON для дальнейшего разбора. Если payload пуст, мы заменяем его пустым объектом JSON.

Затем мы извлекаем number, который был передан функции, и по умолчанию используем число 2, если оно пустое. Мы также импортируем библиотеку gson и создадим ее экземпляр.

Далее выполним вызов API с помощью собственного HTTP-клиента.

import java.util.Map;
import java.util.HashMap;
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import com.google.gson.Gson;

final Gson gson = new Gson();

public RuntimeResponse main(RuntimeRequest req, RuntimeResponse res) throws Exception {

    String payloadString = req.getPayload() == null || req.getPayload().isEmpty() 
        ? "{}" 
        : req.getPayload();

    Map<String, Object> payload = gson.fromJson(payloadString, Map.class);

    String number = "2";
    if (payload.containsKey("number") && payload.get("number") != null) {
        number = payload.get("number").toString();
    }

    URL url = new URL("https://api.isevenapi.xyz/api/iseven/" + number);
    HttpURLConnection con = (HttpURLConnection) url.openConnection();
    con.setRequestMethod("GET");
    con.getResponseCode();

    BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
    String inputLine;
    StringBuilder responseString = new StringBuilder();
    while ((inputLine = in.readLine()) != null) {
        responseString.append(inputLine);
    }
    in.close();
    con.disconnect();

    Map<String, Object> response = gson.fromJson(responseString.toString(), Map.class);

    return res.json(response);
}
Вход в полноэкранный режим Выход из полноэкранного режима

Потрясающе! Мы готовы к тестированию нашей функции! Если вы помните инструкцию, все, что нам нужно сделать, это развернуть нашу функцию.

appwrite deploy function
? Which functions would you like to deploy? java-example (6286f6905af1e032e934)
ℹ Info Deploying function java-example ( 6286f6905af1e032e934 )
ℹ Info Ignoring files using configuration from appwrite.json
✓ Success Deployed java-example ( 6286f6905af1e032e934 )
Войти в полноэкранный режим Выход из полноэкранного режима

Теперь вы можете перейти в консоль Appwrite и выполнить функцию со следующей полезной нагрузкой.

Перейдите на вкладку Logs, чтобы проверить статус и ответ функции.

Отлично! Похоже, нам все-таки удалось решить одну из самых насущных проблем в математике! Не говоря уже о том, что API также поставляется с множеством причудливых объявлений!

На этом мы заканчиваем этот учебник. Не стесняйтесь изменять функцию по своему вкусу и играть с API. Если вы застряли или вам нужна помощь, мы всегда готовы помочь. Просто зайдите на каналы #support на нашем Discord-сервере 😊

📚 Ресурсы

Вот несколько удобных ссылок для получения дополнительной информации

  • Руководство по внесению вклада в Appwrite
  • Appwrite Github
  • Документация по функциям
  • Примеры облачных функций

Оцените статью
Procodings.ru
Добавить комментарий