1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/drinkjava2-myserverless

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

MyServerless: краткое описание

MyServerless изначально назывался GoSqlGo. Это название отражало основную идею проекта — возможность писать SQL непосредственно на фронтенде. Позже, когда стало понятно, что проект развивается в направлении serverless-архитектуры, было решено переименовать его в MyServerless.

В отличие от традиционных serverless-сервисов, MyServerless предполагает разделение разработки и развёртывания. На этапе разработки исходный код пишется на фронтенде, а на этапе развёртывания с помощью специальных инструментов переносится на бэкенд. Такой подход обеспечивает дополнительную безопасность проекта.

Использование

Проект основан на реальном примере ReactMRP. Этот проект полностью реализован на фронтенде и находится в стадии разработки. В настоящее время реализованы модули входа и управления пользователями.

Работа с MyServerless разделена на две части: бэкенд и фронтенд. Для запуска обоих сервисов необходимо одновременно запустить оба сервера.

  • Бэкенд: для запуска бэкенда MyServerless необходимо выполнить команду run-server.bat в каталоге backend проекта ReactMRP. После запуска сервер автоматически откроет браузер по адресу http://localhost:8001.

  • Фронтенд: для запуска фронтенда необходимо выполнить следующие команды:

    • npm install (только при первом запуске);
    • run_npm_start.bat. После запуска сервер автоматически откроет браузер по адресу http://localhost:3000.

Сборка и публикация

Процесс сборки и публикации включает два этапа:

  1. Запуск команды go-backend.bat в бэкенд-каталоге ReactMRP для переноса исходного кода и SQL на бэкенд с целью обеспечения безопасности.

  2. Выполнение команды 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 с кодом, данными и сообщением.

  • Каждому методу можно добавить префикс, чтобы изменить тип возвращаемого значения. Существует четыре варианта каждого метода:

    • $java(#xxxx return 123;): асинхронный метод, который возвращает {code:200, data:123, msg:""}. Значение должно быть получено в методе then обещания.
    • data$java(#xxxx return 123;): асинхронный метод, который возвращает значение поля data объекта JSON, то есть 123. Значение должно быть получено в методе then обещания.
    • sync$java(#xxxx return 123;): синхронный блокирующий метод, который возвращает {code:200, data:123, msg:""}.
    • syncData$java(#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-документацию при упаковке приложения. Подробности можно найти в комментариях к файлу.

Безопасность

Безопасность — это главное. Вот что нужно сделать:

  1. В период разработки используйте учётную запись с правами разработчика для входа. Это позволит вам писать SQL и Java на фронтенде и отправлять их на бэкенд для динамической компиляции и выполнения. Проект требует создания класса, реализующего интерфейс TokenSecurity. Этот класс будет проверять токен, метод ID и права пользователя перед выполнением. Пример такого класса — ProjectTokenSecurity.

  2. Для каждого метода в период разработки назначьте уникальный метод ID. Например, my.$executeSql(#ReadUser drop table tb_user if exists);. Метод ReadUser требует наличия прав ReadUser для выполнения. Такой подход позволяет точно контролировать выполнение каждого метода. Методы без прав доступа должны начинаться с префикса public. Если метод ID не указан, система присваивает ему имя default.

  3. Перед публикацией проведите проверку имён методов, чтобы убедиться, что требуемые права соответствуют содержанию кода. Например, если метод с именем ReadUser предназначен для удаления таблицы, необходимо изменить код или метод ID.

  4. Перед публикацией используйте инструмент упаковки MyServerless для извлечения фронтенд-SQL и Java-кода на бэкенд. Таким образом, исходный код не будет доступен на фронтенде во время работы приложения, и конфигурация будет настроена на отказ от динамического выполнения.

  5. Методы также могут быть реализованы в традиционном режиме разделения фронтенда и бэкенда. Пример этого подхода можно увидеть в PublicBackend$TokenLogin. Проверка прав всё равно осуществляется по методу ID.

Что касается безопасности MyServerless, вы можете попробовать войти в ReactMRP с учётными записями developer, admin и guest, чтобы понять, как работает система. За исключением developer, остальные учётные записи не имеют права на динамическое выполнение фронтенд-кода. Также приглашаем всех желающих найти уязвимости в системе безопасности MyServerless. Хотя теоретически они не должны существовать.

Это всё, что я хотел сказать о MyServerless. Если у вас остались вопросы, вы можете запустить ReactMRP и изучить бэкенд, чтобы получить более полное представление о проекте.

История создания

И последнее, я хочу показать вам картинку, которая объясняет, почему я решил создать этот проект. У меня было два предсказания. Первое — что в 2017 году люди будут заменены роботами. К сожалению, это предсказание не сбылось. Второе предсказание — эта картинка. Как предсказатель, я сам реализовал своё второе предсказание, но это не так уж плохо. Потому что это предсказание просто и не имеет временных ограничений, ха-ха. origin

Связанные проекты | Related Projects

Будущее | Futures

Если вам интересен MyServerless, пожалуйста, поставьте лайк.

Лицензия | License

Apache 2.0

Обо мне | About Me

Github
Gitee

微信:yong99819981(для добавления в группу оставьте сообщение «drinkjava2 open source technology group»)

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

MyServerless (оригинальное название GoSqlGo) — это упрощённая версия Serverless-сервиса, которая позволяет фронтенду напрямую писать SQL и код для серверной части в HTML или JavaScript. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/drinkjava2-myserverless.git
git@api.gitlife.ru:oschina-mirror/drinkjava2-myserverless.git
oschina-mirror
drinkjava2-myserverless
drinkjava2-myserverless
master