MyServerless: краткое описание
MyServerless изначально назывался GoSqlGo. Это название отражало основную идею проекта — возможность писать SQL непосредственно на фронтенде. Позже, когда стало понятно, что проект развивается в направлении serverless-архитектуры, было решено переименовать его в MyServerless.
В отличие от традиционных serverless-сервисов, MyServerless предполагает разделение разработки и развёртывания. На этапе разработки исходный код пишется на фронтенде, а на этапе развёртывания с помощью специальных инструментов переносится на бэкенд. Такой подход обеспечивает дополнительную безопасность проекта.
Использование
Проект основан на реальном примере ReactMRP. Этот проект полностью реализован на фронтенде и находится в стадии разработки. В настоящее время реализованы модули входа и управления пользователями.
Работа с MyServerless разделена на две части: бэкенд и фронтенд. Для запуска обоих сервисов необходимо одновременно запустить оба сервера.
Бэкенд: для запуска бэкенда MyServerless необходимо выполнить команду run-server.bat в каталоге backend проекта ReactMRP. После запуска сервер автоматически откроет браузер по адресу http://localhost:8001.
Фронтенд: для запуска фронтенда необходимо выполнить следующие команды:
Сборка и публикация
Процесс сборки и публикации включает два этапа:
Запуск команды go-backend.bat в бэкенд-каталоге ReactMRP для переноса исходного кода и SQL на бэкенд с целью обеспечения безопасности.
Выполнение команды npm run build для создания пакета публикации и его загрузка на рабочий сервер.
Методы
После импорта файла myserverless.js во фронтенд можно вызывать следующие методы для выполнения операций на бэкенде:
$java(String, Object...) — выполнение Java-кода на бэкенде. Первый параметр — это код на Java, последующие параметры — аргументы. Внутри кода можно использовать $1, $2 и т. д. для ссылки на аргументы.
$javaTx(String, Object...) — аналогично предыдущему методу, но с возможностью открытия транзакции. Если возникает исключение, транзакция автоматически откатывается.
$qryString(String, Object...), $qryObject(String, Object...), $qryArray(String, Object...), $qryArrayList(String, Object...), $qryTitleArrayList(String, Object...), $qryMap(String, Object...), $qryMapList(String, Object...), $qryEntity(String, Object...), $qryEntityList(String, String, Object...), $executeSql(String, Object...) — аналогичные методы для работы с данными и выполнения SQL-запросов.
Обратите внимание на следующие моменты:
Все методы используют специальные кавычки, которые позволяют использовать многострочный текст.
Методы не являются частью MyServerless, они настраиваются индивидуально для каждого проекта. Подробности можно найти в классе InitConfig и шаблонах методов в src/main/resources/template.
Каждый метод должен иметь уникальный идентификатор метода (ID). Идентификаторы могут повторяться, но используются для настройки прав доступа. Пример определения метода с идентификатором ReadUserAmount:
$java('#ReadUserAmount
import abc.DemoUser;
return new DemoUser().loadById($1).getAmount();
', 123);
По умолчанию методы выполняются асинхронно и возвращают объект JSON с кодом, данными и сообщением.
Каждому методу можно добавить префикс, чтобы изменить тип возвращаемого значения. Существует четыре варианта каждого метода:
#xxxx return 123;
): асинхронный метод, который возвращает {code:200, data:123, msg:""}. Значение должно быть получено в методе then обещания.#xxxx return 123;
): асинхронный метод, который возвращает значение поля data объекта JSON, то есть 123. Значение должно быть получено в методе then обещания.#xxxx return 123;
): синхронный блокирующий метод, который возвращает {code:200, data:123, msg:""}.#xxxx return 123;
): синхронный блокирующий метод, который возвращает значение поля data объекта JSON, то есть 123.Пример использования MyServerless во фронтенде:
import * as my from "@/myserverless/myserverless.js"
export function tableList(query) {
return my.data$java(`#public
Map m=(Map) $1;
Object[] sql=new Object[]{" from sample where 1=1 ",
noBlank(" and title like ?","%",m.get("title"),"%"),
notBlank(" and star=?", m.get("star")),
notBlank(" and status=?", m.get("status"))
};
List items=DB.qryMapList("select * ",sql, pagin((int)m.get("pageNumber"), (int)m.get("pageSize")));
int total=DB.qryIntValue("select count(*) ",sql);
m.clear();
m.put("items", items);
m.put("total", total);
return m;
`, query);
}
Этот пример демонстрирует использование метода tableList для динамического запроса данных из базы данных. Метод принимает запрос в качестве аргумента и выполняет SQL-запрос, используя данные из запроса. Результат запроса возвращается в виде объекта Map, содержащего список элементов и общее количество записей. В корне проекта (в каталоге resources) есть конфигурационный файл myserverless.properties, который позволяет выполнять настройку, например, задавать каталог deploy, определять этап разработки или производства, а также решать, создавать ли API-документацию при упаковке приложения. Подробности можно найти в комментариях к файлу.
Безопасность — это главное. Вот что нужно сделать:
В период разработки используйте учётную запись с правами разработчика для входа. Это позволит вам писать SQL и Java на фронтенде и отправлять их на бэкенд для динамической компиляции и выполнения. Проект требует создания класса, реализующего интерфейс TokenSecurity. Этот класс будет проверять токен, метод ID и права пользователя перед выполнением. Пример такого класса — ProjectTokenSecurity.
Для каждого метода в период разработки назначьте уникальный метод ID. Например, my.$executeSql(#ReadUser drop table tb_user if exists
);. Метод ReadUser требует наличия прав ReadUser для выполнения. Такой подход позволяет точно контролировать выполнение каждого метода. Методы без прав доступа должны начинаться с префикса public. Если метод ID не указан, система присваивает ему имя default.
Перед публикацией проведите проверку имён методов, чтобы убедиться, что требуемые права соответствуют содержанию кода. Например, если метод с именем ReadUser предназначен для удаления таблицы, необходимо изменить код или метод ID.
Перед публикацией используйте инструмент упаковки MyServerless для извлечения фронтенд-SQL и Java-кода на бэкенд. Таким образом, исходный код не будет доступен на фронтенде во время работы приложения, и конфигурация будет настроена на отказ от динамического выполнения.
Методы также могут быть реализованы в традиционном режиме разделения фронтенда и бэкенда. Пример этого подхода можно увидеть в PublicBackend$TokenLogin. Проверка прав всё равно осуществляется по методу ID.
Что касается безопасности MyServerless, вы можете попробовать войти в ReactMRP с учётными записями developer, admin и guest, чтобы понять, как работает система. За исключением developer, остальные учётные записи не имеют права на динамическое выполнение фронтенд-кода. Также приглашаем всех желающих найти уязвимости в системе безопасности MyServerless. Хотя теоретически они не должны существовать.
Это всё, что я хотел сказать о MyServerless. Если у вас остались вопросы, вы можете запустить ReactMRP и изучить бэкенд, чтобы получить более полное представление о проекте.
И последнее, я хочу показать вам картинку, которая объясняет, почему я решил создать этот проект. У меня было два предсказания. Первое — что в 2017 году люди будут заменены роботами. К сожалению, это предсказание не сбылось. Второе предсказание — эта картинка. Как предсказатель, я сам реализовал своё второе предсказание, но это не так уж плохо. Потому что это предсказание просто и не имеет временных ограничений, ха-ха.
Если вам интересен MyServerless, пожалуйста, поставьте лайк.
微信:yong99819981(для добавления в группу оставьте сообщение «drinkjava2 open source technology group»)
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )