С телефона в облака: Azure Mobile Services. С чего начать?
Автор: Анастасия Белокурова, .NET Developer DataArt.
Я расскажу, как и зачем использовать облачную систему Azure Mobile Services для ваших мобильных приложений. Для этого мы разберем небольшое приложение, на примере которого увидим, как это всё работает, затронем и практику, и теорию.
Но перед этим давайте вспомним, каковы преимущества облачных технологий и какое отношение эти технологии имеют к мобильным устройствам.
Преимущества облачных технологий
Термин «облачные вычисления» появился достаточно давно, но его значение немного менялось. Сначала облачными вычислениями называли просто распределенные вычисления. Но сейчас облачная платформа — большой набор удобных сервисов, которые вы можете использовать для решения своих задач.
Итак, почему же облака? Они предоставляют следующие преимущества вашему приложению:
- Масштабируемость.
- Надежность.
- Большой выбор сервисов.
Представьте, что вы запускаете небольшой интернет-магазин — сначала просто хотите проверить, будет ли он вообще востребован. Бюджет у вас небольшой. Поэтому вы пишете небольшое веб-приложение и размещаете его на своем компьютере, который не выключаете на ночь. К вашему сайту есть доступ извне, и он может выдержать, допустим, 10 пользователей одновременно. Со временем ваш сайт становится популярным, и вам уже нужно, чтобы он выдерживал 100 пользователей одновременно. Но ваш компьютер не способен справиться с такой нагрузкой. И тут вы начинаете думать, не превратить ли мне мою квартиру в серверную?… Нет, это ужасно неудобно! Тогда вы покупаете сервера, предоставляемые хостингом. Теперь ваш сайт поддерживает 100 запросов в минуту и даже тысячу. Наконец в какой-то момент вы понимаете, что выходите на глобальный рынок, т. к. у вас очень много пользователей, круглосуточно, и сервера, которые вы купили, уже не справляются.
Тут мы подходим к первому преимуществу облачных платформ — они предоставляют масштабируемость практически всего практически в любой момент времени. И это делается очень просто, быстро и удобно: вам остается думать только о разработке, а не о размещении и нагрузке. Это первое преимущество.
Второе. Допустим, у вас успешный проект со множеством посетителей и пользователей, размещенный на серверах. И тут на ваши серверы падает метеорит или еще что-нибудь такое происходит. А на них хранились вообще все данные вашего проекта… Между тем, большая часть облачных платформ поддерживает репликацию: вы выбираете регион, в котором будет размещаться приложение, но при этом оно автоматически будет дублироваться на серверах в каком-то другом регионе. Поэтому облачные провайдеры всегда надежно хранят ваши данные: они обещают, что в форс-мажорных ситуациях они будут восстановлены минут за 20. Такой надежной защиты данных вы никогда не достигнете, если будете хранить свои данные в одном месте.
Третье, тоже очень важное преимущество: сейчас большая часть облачных провайдеров предоставляет множество сервисов- велосипедов, которыми можно пользоваться. Это код, который мы можем использовать в каждом проекте. Поэтому мы можем не писать каждый раз один и тот же код, не строить одну и ту же архитектуру — многое из этого нам предоставляется. Мы можем воспользоваться этим и думать только о том специфическом, что нужно для конкретного проекта.
Мобильные устройства и облачные технологии
Как мобильные устройства связаны с облаками?
Многие мобильные приложения работают только с подключенным интернетом. Поэтому они могут использовать логику, которая находится не на телефоне, а размещена где-то на серверах — это позволяет экономить ресурсы устройства.
Стоит отметить, что сейчас наблюдается тенденция к росту использования мобильных устройств в повседневной жизни — у одного человека может быть даже несколько таких устройств. И, конечно же, удобно, если данные между всеми этими мобильными устройствами синхронизируются. Если все наши устройства, например, от Apple — с этим нет никаких проблем. Но что делать, если у наших устройств разные ОС? Отдельно писать приложения для каждой из ОС? Это неудобно! И где хранить общие данные? Таким образом, можно выделить следующий список проблем:
- Необходим запуск на разных платформах.
- Неудобно писать одно приложение для разных платформ.
- Доступ к данным нужен из других приложений.
Облачные технологии помогают решить эти проблемы. Давайте рассмотрим решение на примере Azure Mobile Services.
Создаем приложение с помощью Azure Mobile Services
Приложение, которое мы рассмотрим, — список задач. Это простейшее приложение, которое вы можете скачать, зайдя на Azure Portal. В этом приложении можно создавать задачи, удалять их и переименовывать. Приложение включает в себя базовую функциональность для работы с сервисами Azure.
Нам нужно, чтобы это приложение работало на разных устройствах с разными ОС, и чтобы всё синхронизировалось. Посмотрим на примере списка задач, как написать мобильное приложение с использованием Azure Mobile Services при помощи PhoneGap. PhoneGap — фреймворк, который позволяет писать код один раз, а затем компилировать его для нескольких платформ. Другими словами, вам не нужно писать нативные приложения для каждой ОС.
Кроме PhoneGap, для разработки такого приложения понадобятся:
- SQL Azure — база, в которой будут храниться все ваши данные. Этот сервис работает независимо от Mobile Services, но в Mobile Services присутствует функциональность, которая позволяет удобней работать с SQL Azure.
- SDK: Android SDK, Visual Studio Express for Windows Phone 8 и/или Xcode — в зависимости от того, для какой платформы вы разрабатываете. Я вам покажу разработку на Visual Studio.
Чтобы решить стоящие перед нами задачи, нужно создать сервис Azure Mobile. Для этого нам нужно зайти на Azure Portal, и нажать «создать мобильный сервис» (compute>mobile service>create):
Что важно в мобильном сервисе? Его URL, база данных, с которой он будет работать (без нее мобильный сервис мы создать не можем), регион (место, где будут размещены ваши данные) и язык, на котором вы будете писать сервисную логику. Я, например, выбрала Node.js для этого приложения (также можно выбрать .NET).
После создания сервиса вы заходите на портал:
Здесь вы видите ваш сервис. Заходите в него и видите следующую «стартовую страницу»:
Тут можно выбрать одну из платформ, которую вы будете использовать для представления (UI) вашего приложения. То есть следующим шагом вы будете скачивать уже готовый проект со всеми нужными подключёнными библиотеками на нужном языке, с которыми вы будете дальше работать.
Конечно, можно создавать окружение в других средах, можно писать вообще с нуля, но удобнее будет скачать отсюда. Здесь можно скачать нативные приложения для Android, iOS или Windows, или просто HTML-приложение. Xamarin и PhoneGap — фреймворки, предоставляющие возможность кроссплатформенной разработки. Они отличаются тем, что в Xamarin вы пишете на .NET, а в PhoneGap — на JS;, а затем вы просто компилируете код и запускаете приложение на нужной вам платформе.
Выбрав PhoneGap, вы видите такую вот небольшую пошаговую инструкцию:
Здесь перечислены нужные инструменты. На втором шаге вы должны создать таблицу для базового приложения — это будет таблица в базе данных, ассоциированная с вашим мобильным сервисом. Затем вы скачиваете приложение и можете им пользоваться. Всё!
Немного теории
А теперь я расскажу о том, как это всё работает.
Любое подобное приложение, которое работает с данными, будет иметь следующую структуру:
Конечно, ваше приложение может быть сложнее, но оно в любом случае включает эти части: представление (единственное, что будет размещено на устройстве), базу данных (с которой работает приложение) и серверную логику (то, что будет передавать данные из базы представлению). На схеме видно, что за базу данных и серверную логику отвечает Azure. Серверная логика у вас уже изначально написана Azure -— вы можете ее лишь немного видоизменять в соответствии с вашими потребностями.
Что еще предоставляет Azure, кроме хранения данных и логики?
- Аутентификация. Она осуществляется, в том числе, с помощью популярных соцсетей, т. ч. вы можете не писать для нее логику сами.
- Сервис уведомлений (push notifications), который показывает пользователю уведомления на его мобильном устройстве, если он в сети.
- Планировщик задач. Он нужен, например, чтобы ваше приложение, допустим, раз в неделю показывало пользователям какие-либо уведомления (в случае интернет-магазина это может быть информация о скидках).
База данных
Что касается базы данных, это — SQL-база. Вы можете писать к ней какие угодно запросы, и там есть индексация, которая вам нужна.
Очень приятная вещь — динамическая схема, которая позволяет вам не строить полностью все таблицы. Допустим, в вашем приложении предусмотрены четыре колонки в таблице, а туда ввели еще какие-то данные, для которых колонки не предусмотрены. Ничего страшного — всё добавится!
Базой данных легко можно управлять со всех возможных порталов и приложений, предназначенных для этого. Это может быть Azure Portal (считывание и удаление), SQL Portal (Silverlight), SQL Management Studio (Windows) и REST API.
REST API
REST API прилагается не только для работы с базой данных, но и к сервису вообще. Это единственный механизм взаимодействия с сервисами Azure, который есть у нашего смартфона. Все запросы будут идти через HTTP (хотя, надо сказать, сейчас уже появляются мобильные сервисы, позволяющие работать офлайн). Запросы будут выглядеть так:
Базовый адрес состоит из следующих элементов: [ваше название сервиса].azure-mobile.net/tables/[имя таблицы].
Колонки в todoitem
Еще немного поговорим о базе данных.
В любой таблице есть колонки «id», «создан», «обновлен», «версия» и «удален». Эти колонки, за исключением «id», мы не получаем из базы данных по умолчанию, когда получаем элемент. Они используются для определения времени создания и т. д. Главное — помнить, что они есть, и не создавать что-то лишнее. Также есть две колонки («text» и «complete»), созданные с помощью динамической схемы.
А вот пример наполнения таблицы (какой тип данных используется в каждой колонке, вы можете увидеть на изображении выше):
Колонка »_deleted» — реализация механизма «мягкого удаления». Т. е., когда вы удаляете какую-то запись, вы удаляете ее мнимо: она остается в таблице, но пользователи не будут ее видеть, а, если она понадобится, вы сможете ее быстро восстановить. Если же вам все-таки нужно совсем удалять запись при действии удаления, можно написать для этого свою реализацию — она пишется очень просто. Или же можно удалять запись вручную, если это какой-нибудь этап тестирования.
Серверная логика
Для мобильных сервисов поддерживаются два языка серверной логики: .NET Web API и Node.js.
Node.js предоставляет по умолчанию настроенные SQL-таблицы. Запросы к таблицам скрыты — мы не пишем сам запрос.
.NET Web API предоставляет все возможности, которые есть при разработке обычных серверных приложений. Можно даже подключать NoSQL-базы данных: MongoDB и Table Storage.
Пример реализации
Самое удобное, что есть в мобильных сервисах — это то, что вам не нужно никакого окружения, никакой среды, чтобы писать серверную логику. Вот, например, скриншот с портала:
Вы выбираете таблицу, выбираете вкладку «script» и видите готовые сценарии для четырех операций: вставки, обновления, удаления и получения. По умолчанию, сценарий сводится к «request.execute». То есть мы получаем наш item, пользователя, совершающего эти действия, и объект, который отвечает за этот запрос. Здесь написана логика для валидации: она происходит уже здесь, а, если не проходит, отправляем особый объект «statusCodes» и некое сообщение, а «execute» не выполняем.
И вот я написала на портале этот код, сохранила его, и мое приложение, которое работает через интернет (я его не перекомпилировала и не изменяла), будет работать исходя из этой новой логики.
Что еще можно сделать с облачным сервисом?
Давайте еще раз посмотрим на «стартовую страницу» нашего сервиса:
Здесь есть вкладка «Data» — работа с базой данных. Там вы увидите список таблиц и сможете создать новые. В самой таблице вы увидите данные, которые в ней находятся. А в разделе «Script» увидите, какие сейчас есть операции для работы с таблицей.
Следующая вкладка — «API». Мы можем написать свой API, если нам недостаточно простых функций создания, обновления и удаления, если у нас есть, например, какое-то более сложное взаимодействие между несколькими таблицами.
Есть «Scheduler» — планировщик задач.
«Push» — создание уведомлений.
«Identity» — можно настроить механизм аутентифакции в приложении. Все данные для идентификации будут в объекте «user», который вы видели на скриншоте.
«Scale» — возможности масштабирования сервиса: можно менять количество ресурсов, которые выделяются под обслуживание ваших сервисов, настраивать количество push-уведомлений и т. д.
Что касается языков, сейчас вы можете писать приложения на .NET, Node.js, Java, PHP и Python, размещать их в Azure и взаимодействовать со всеми предоставляемыми сервисами.
Azure, конечно, не бесплатен, однако для учащихся существует программа DreamSpark, которая предоставляет многие возможности бесплатно. Есть также пробная подписка на месяц.
В целом, работать с Azure Mobile Services очень удобно и просто: все изменения вносятся на лету (по крайней мере, в случае Node.js) и ничего не нужно перекомпилировать. Код можно быстро изменить с любого устройства. Это идеальный вариант для простых приложений и для прототипов. А вот для сложных проектов вряд ли подходит — однажды мы столкнемся с ограничениями, которые будет довольно трудно обойти.
Напоследок хочу отметить, что с момента написании статьи Microsoft Azure успел представить новый сервис, Azure Mobile Apps, который в будущем предназначен заменить Azure Mobile Services. Но это — тема следующей статьи.