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

от автора

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

Если у вас встанет задача удалённого хранения данных и при этом не писать собственный сервер, то первое, что придёт на ум это инструмент Firebase Realtime Database. Большинство читающих знают, о чём идёт речь, но для остальных поясню. С помощью Firebase Database можно хранить удаленно данные в NoSql-ом виде.


Картинка с сайта firebase


Из плюсов использования:

  • поддерживается Google
  • не нужно писать никакой код, на стороне базы
  • быстрая работа
  • бесплатно до 5Гб
  • интеграция с сервисом Firebase authentication с довольно большим количеством провайдеров авторизации
  • поддержка android, iOs, unity и др.
  • синхронизируется в режиме реального времени: при обновлении данных в базе они обновляются в клиенте

Из минусов:

  • при привышении установленных лимитов по пространству и нагрузке на сервер приходится платить
  • нету возможности кастомизировать под себя структура хранения

ФМП + PostgreSQL

Теперь хочу вам рассказать про альтернативный инструмент, которым мне приходится пользоваться.

Зайду издалека. Где-то у меня имеется поднятый сервер PostreSQL с базой данных. В базе данных у меня есть таблица с фруктами:

Что такое PostreSQL как с ним работать можно почитать тут.

Моя задача, чтобы эта таблица как можно быстрее оказалась на телефоне с наименьшим написанием кода и обеспечения безопасности на каждом этапе.

Вот таблица my_table_fruits в pgAdmin4:

Далее нахожу в дереве pgAdmin4 процедуры. Пишу собственную процедуру на получение таблицы:

Процедура будет иметь название fruits_get_by_color и будет отдавать мне фрукты определённого цвета из моей таблицы my_table_fruits.

После этого перехожу на сервер Форсайт мобильной платформы (далее ФМП). Как развернуть платформу и что для этого нужно можно прочитать в документации. ФМП представляет собой сервер, который имеет коннекторы к серверам баз данных. Может приконнектиться и к нужному нам PostgreSQL. Код писать для этого никакой не нужно. С чем мне приходится работать, так это с панелью администратора через браузер. Вводить необходимые адреса серверов, баз данных. Панель администратора имеет настройки и дерево сред:

Более подробно про настройки также можно прочитать в документации.

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

Создаю новую среду в дереве сред, например назову её Leonid_environment. Внутри среды создаю проект, например Leonid_project. Захожу в проект и создаю там источник данных, в нашем случае PostgreSQL. Ввожу параметры сервера и базы данных, в которой храниться моя таблица:

Захожу внутрь источника данных и жму “Импортировать”. Ввожу в название источника наименование той процедуры, которую ввёл в PostgreSQL, в данном случае fruits_get_by_color. Для мобильного клиента можно придумать другое название, хотя не обязательно. Назову его fruits_get_by_color_for_android:

После нажатия кнопки “Импортировать”, платформа ФМП “увидит” нашу процедуру и параметры, которые мы должны туда передать.

В частности, она увидит, что мы должны передать параметр fruit_color:

После этого необходимо перейти во вкладку “Пользователи API” и создать пользователя. Создал пользователя с логином Leonid и паролем 123123:

Начиная с этого момента можно переходить в Android Studio, чтобы получить эти данные на мобильный телефон.

ФМП + android

Создаю новый проект. Вместе с платформой распространяется фреймворк для работы с ней. Подтягиваю фреймворк в проект File → import module → *.aar

В проекте объявляю ряд констант, в которые вставляю адрес сервера, а также придуманные мной название среды, название проекта, логин, пароль, наименование ресурса из ФМП:

    private static final String MY_URL = "http://mobilefmp.dev.fs.world";     private static final VersionAPI MY_VERSION_API = VersionAPI.V_1;     private static final String MY_ENVIRONMENT = "Leonid_environment";     private static final String MY_PROJECT = "Leonid_project";     private static final String MY_VERSION = "v1";     private static final String MY_LOGIN = "Leonid";     private static final String MY_PASSWORD = "123123";     private static final String MY_RESOURCE = "fruits_get_by_color_for_android";

Обратите внимание, что обращаемся именно к ФМП, а не напрямую к PostgreSQL. Далее необходимо создать объект HyperHive и засетить объявленные переменные:

hyperHive = new HyperHiveState(getApplicationContext())                 .setHostWithSchema(MY_URL)                 .setApiVersion(MY_VERSION_API)                 .setEnvironmentSlug(MY_ENVIRONMENT)                 .setProjectSlug(MY_PROJECT)                 .setVersionProject(MY_VERSION)                 .buildHyperHive();

Затем нужно выполнить авторизацию. Для этого передаём логин и пароль в метод auth():

boolean status = hyperHive.authAPI.auth(MY_LOGIN, MY_PASSWORD, true).execute().isOk();

При получении true можно запрашивать содержимое таблицы, что и сделаем. В объект tableStreamCallParams передадим в виде json-а параметр fruit_color и введём для него значение yellow. Напомню, что мы создавали таблицу фруктов и создавали в PostreSQL процедуру, которая принимает на вход параметр цвета. Это нужно было, чтобы на устройстве ввести данный параметр:

        TableStreamCallParams tableStreamCallParams = new TableStreamCallParams();         String data = "{\"fruit_color\": \"yellow\"}";         tableStreamCallParams.setData(data);         String status = hyperHive.requestAPI.tableStream(MY_RESOURCE, tableStreamCallParams).execute();

После запроса мы обращаемся к серверу ФМП. Сервер ФМП обращается к серверу PostgreSQL. В итоге мы должны получить список желтых фруктов:

Строки stream-ятся в базу SQLite. В данном случае цвета yellow были только banana и lemon. Скорость загрузки закешированных на стороне ФМП данных примерно 10000 строк в секунду при нормальной скорости интернета.

Все описанные мною шаги можно прочесть в документации. Также там есть информация про подключение к iOs и другим операционным системам.

Привожу полный код активити.

Сделал запрос из основного потока и не обработал ошибки, чтобы сократить количество кода.

Функционал ФМП

Функционал ФМП этим не ограничивается. Можно на стороне сервера базы данных создать процедуру не только для получения, но и для создания новых строк в зависимости от переданных значений. Можно передавать массивы значений. Ограничения только внутри самой БД.

Пройдусь широкими шагами по основному функционалу ФМП:

  • кеширование данных на стороне платформы и получение дельты (не всей таблицы, а только изменённых строк)
  • логгирование действий пользователя
  • разграничение доступа по пользователям, группам пользователей, id устройства
  • аутентификация через LDAP
  • интеграция с SMTP, Citrix XenMobile, Sentry
  • подпись данных в центре сертификации КриптоПро
  • файловое хранилище не стороне ФМП
  • локальная БД на стороне ФМП (можно не коннектиться к сторонней БД, а создать БД локально, как в Firebase)
  • коннекторы к Firebase Cloud Messaging, Apple Push Notification и Windows Push Notification. Создание рассылок и шаблонов push-уведомлений

Есть фреймворки под:

  • android
  • iOs
  • UWP
  • WinCE
  • Sailfish, Аврора (российский sailfish)

Есть коннекторы к:

Плюсы и минусы ФМП

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

Плюсы:

  • без написания серверного кода можно приконектиться к серверу базы
  • большое количество коннекторов к другим источникам
  • наличие фреймворков под большинство мобильных операционных систем
  • русскоязычная служба поддержки

Минусы:

  • стоимость
  • ориентация под коммерческого заказчика
  • нету бесплатной пробной версии или периода

Выводы

Сравнение платформы ФМП с Firebase Realtime Database было “притянуто за уши”, т.к. хотелось хоть с чем-то сравнить знакомым android- и iOs-разработчику. На самом деле ФМП имеет несколько другой функционал и цели. Среди конкурентов можно привести SAP Mobile Platform, IBM first mobile platform, Оптимум CDC.

В заключение хочу сказать, что на ФМП стоит обратить внимание, если у вас есть:

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


ссылка на оригинал статьи https://habr.com/ru/post/463437/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *