Firebase

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 18:15, 27 июня 2018.
Firebase, Inc.
Subsidiary
Industry Mobile backend as a service, Mobile application development
Founded September 2011 (2011-09)[1]
Founder Джеймс Тэмплин, Эндрю Ли[2]
Headquarters Сан-Франциско, United States[3]
Area served
Global
Products Программное обеспечение
Parent Google

Firebase — американская компания, поставщик облачных услуг, основанная в 2011 году Эндрю Ли и Джеймсом Тэмплином[4], и поглощённая в 2014 году корпорацией Google[5].

Прошла два раунда инвестиций: в мае 2012 года получила $1,4 млн от Flybridge Capital Partners, Greylock Partners, NEA, в июне 2013 года привлекла $5,6 миллионов от Union Square Ventures и Flybridge Capital Partners[6].

Основной сервис — облачная СУБД класса NoSQL, позволяющая разработчикам приложений хранить и синхронизировать данные между несколькими клиентами[7][8][9]. Поддержаны особенности интеграции с приложениями под операционные системы Android и iOS, реализовано API для приложений на JavaScript, Java, Objective-C и Node.js, также возможно работать напрямую с базой данных в стиле REST из ряда JavaScript-фреймворков, включая AngularJS, React, Ember.js и Backbone.js[10]. Предусмотрено API для шифрования данных[11].

Среди других услуг, предоставлявшихся компанией — запущенный 13 мая 2014 года хостинг для хранения статических файлов (таких как CSS, HTML, JavaScript), обеспечивающий доставку через CDN и сервис аутентификации клиента с использованием кода только на стороне клиента с поддержкой входа через Facebook, GitHub, Twitter и Google (Firebase Simple Login)[12].

Кроме этого, компанией выпущен под лицензией MIT веб-редактор кода Firepad, обеспечивающий одновременную совместную работу нескольким пользователям с одним документом, который стал основой редакторов Stash Realtime Editor фирмы Atlassian и Koding[13][14]. Ещё один свободный проект компании — бесплатный мессенджер Firechat, также выпущенный под лицензией MIT[15].

Особенности

Синхронизация в реальном времени для данных JSON

База данных Firebase Realtime представляет собой облачную базу данных NoSQL, которая позволяет хранить и синхронизировать данные между вашими пользователями в режиме реального времени.

Совместно работать с устройствами

Синхронизация в реальном времени позволяет пользователям получать доступ к своим данным с любого устройства: веб-или мобильным, и это помогает вашим пользователям сотрудничать друг с другом.

Создание безсерверных приложений

База данных Realtime поставляется с мобильными и веб-SDK, поэтому вы можете создавать приложения без необходимости серверов. Вы также можете выполнить код бэкэнд, который реагирует на события, инициируемые вашей базой данных, используя Cloud Function for Firebase.

Оптимизирован для автономного использования

Когда ваши пользователи переходят в автономный режим, SDK базы данных Realtime использует локальный кэш на устройстве для обслуживания и сохранения изменений. Когда устройство подключается к сети, локальные данные автоматически синхронизируются.

Сильная пользовательская безопасность

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

Недостатки

Выбирать решение для хранения данных нужно исходя из природы самих данных. Firebase имеет свои недостатки:

  • его область применения намного меньше, чем у NoSQL-решения;
  • Firebase сильно ограничивает вас при выборке данных и при необходимости записать данные в несколько мест одновременно;
  • далеко не со всеми структурами данных удобно работать в Firebase.

Приступая к работе

Для примера будет использовать Android устройство.

RealtimeFirebase

Установка

Для начало нужно включить плагин google-services и репозиторий Google Maven. В файл build.gradle прописываем:

buildscript {
    // ...
    dependencies {
        // ...
        classpath 'com.google.gms:google-services:4.0.1' // google-services plugin
    }
}

allprojects {
    // ...
    repositories {
        // ...
        maven {
            url "https://maven.google.com" // Google's Maven repository
        }
    }
}

Затем в вашем файле Gradle (обычно это app/build.gradle) добавьте apply pluginстроку внизу файла, чтобы включить плагин Gradle:

apply plugin: 'com.android.application'

android {
  // ...
}

dependencies {
  // ... 
compile 'com.google.firebase:firebase-core:16.0.0'
compile 'com.google.firebase:firebase-database:16.0.1'
compile 'com.google.firebase:firebase-functions:16.0.1'
compile 'com.google.firebase:firebase-storage:16.0.1'

}

apply plugin: 'com.google.gms.google-services'

Чтобы открыть Firebase Assistant в Android Studio:

  • Нажмите Tools > Firebase, чтобы открыть окно Assistant.
  • Нажмите, чтобы развернуть одну из перечисленных функций (например, Google Analytics), затем нажмите на предоставленную ссылку на учебное пособие (например, Log an Analytics event).
  • Нажмите кнопку Connect to Firebase , чтобы подключиться к Firebase и добавить в свой код необходимый код.

Добавление данных в базу данных

Добавим кол-во детей в базу данных. Инициализируем переменную myRef. После чего в child() прописываем путь куда именно в базу данных мы должны положить значение:

DatabaseReference myRef = FirebaseDatabase.getInstance().getReference();
myRef.child("users").child(*номер телефона*).child("Array").child("childSize").setValue("1");

Удаление данных из базы данных

Для того, чтобы удалить данные из базы данных, нужно ветке, которую мы хотим удалить, присвоить значение null. В данном примере мы удаляем все данные пользователя:

DatabaseReference myRef = FirebaseDatabase.getInstance().getReference();
myRef.child("users").child(*номер телефона*). setValue(null);

Так же можно удалить данные через CloudFunction, но об этом будет ниже.

Получение данных из базы данных

Для получения данных из бд, нужно установить Listener, который будет в фоне запрашивать и получать данные.

  • Listener addListenerForSingleValueEvent будет уничтожен сразу после окончания выполнения кода, который находится в функции onDataChange.
  • Listener addValueEventListener нужно будет самостоятельно уничтожить, иначе произойдет утечка памяти. Преимущество данного Listener является то, что если данные будут изменены в базе данных во время работы экрана, то пользователь тоже получит обновлённые данные.

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

DatabaseReference myRef = FirebaseDatabase.getInstance().getReference();
myRef.child("users").child(*номер телефона*).child("Array").addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        try {
            if (dataSnapshot.hasChild("name")) {
                Array array = dataSnapshot.getValue(Array.class);
                editors[0].putString("name", array.name);            }
               }
        }catch (Exception e){}
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
});

В данном коде используется класс Array.

public class Array {
    public String name; 

    @Exclude
    public Map<String, Object> toMap() {
        HashMap<String, Object> result = new HashMap<>();
        result.put("name", name); 
        return result;
    }
}

Создание базы данных

Для того, чтобы протестировать приложение и найти слабы места в коде, нужно создать базу данных с большим объемом данных. Тут есть несколько вариантов реализации данной задачи.

  • Так как база данных NOSQL, то можно на сторонних сервисах или с помощью своего скрипта собрать JSON файл, который в последствии импортируется в базу данных. Для этого нужно зайти в свою базу данных и кликнуть на импортировать из файла JSON.

Firebase json import.png

  • С помощью CloudFunction так же можно заполнить данные. В данном случаем после запроса на удаление данных пользователя создается копия данных пользователя в новой ветке (*номер телефона*del). По аналогии можно заполнить данными бд.
exports.deleteNumber = functions.https.onCall((data, context) => {

	const number = data.number;

	if (number.length === 10) {

		admin.database().ref('/users/' + number).once("value", function(snapshot){
    		const numberPlusDel = snapshot.val(); 
			return admin.database().ref('/users/' + number + 'del').set(numberPlusDel);
		}).then(() => {
			return admin.database().ref('/users/' + number).set(null);
		}).catch(exception => {
    		console.log('Error!: ' + exception)
		});

	} else 
		return { number: "true" }
	
});

Защита от удаления данных

Для того, чтобы защитить базу данных от ее полного удаления в случае, если была допущена ошибка в коде, нужно добавить защиту. Реализовать это можно через CloudFunction. В данном примере, получая запрос на удаление ветки “users”, происходит полная перезапись данных в бд. К сожалению нельзя отловить запрос на удаление ветки и отменить его.

exports.stopDelete = functions.database.ref('/users/').onDelete((change, context) =>{

		var numberUsers = change.val();
		return change.ref.parent.child('users').set(numberUsers);
});

CloudFunction

Установка

Облачные функции запускают Node v6.14.0. Нужно установить CLI Firebase через npm: npm install -g firebase-tools

Для инициализации вашего проекта:

  • Запуск firebase login для входа в систему через браузер и аутентификация инструмента firebase.
  • Перейдите в каталог проекта Firebase.
  • Выполнить firebase init functions. Инструмент дает вам возможность устанавливать зависимости с npm.

Для этого примера ваш проект должен импортировать модули облачных функций и административные SDK с помощью require операторов Node. Добавьте в index.js файл следующие строки:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

Эти строки загружают модули firebase-functions и firebase-admin модули и инициализируют admin экземпляр приложения, из которого могут быть сделаны изменения в базе данных Realtime.

Чтобы развернуть функции нужно прописать: firebase deploy --only functions

Удаление данных из базы данных через CloudFunction

В развертываемой функции нужно прописать код для удаления данных. Тут мы во время удаления данных делаем копию ветки с новым названием:

exports.deleteNumber = functions.https.onCall((data, context) => {

	const number = data.number;

	if (number.length === 10) {

		admin.database().ref('/users/' + number).once("value", function(snapshot){
    		const numberPlusDel = snapshot.val(); 
			return admin.database().ref('/users/' + number + 'del').set(numberPlusDel);
		}).then(() => {
			return admin.database().ref('/users/' + number).set(null);
		}).catch(exception => {
    		console.log('Error!: ' + exception)
		});

	} else 
		return { number: "true" }
	
});

В самом приложении мы должны добавить запрос на удаление данных:

private Task<String> DeleteData() {
    Map<String, Object> data = new HashMap<>();
    data.put("number", number);

    return FirebaseFunctions.getInstance()
            .getHttpsCallable("deleteNumber")
            .call(data)
            .continueWith(new Continuation<HttpsCallableResult, String>() {
                @Override
                public String then(@NonNull Task<HttpsCallableResult> task) throws Exception {
                    String result = (String) task.getResult().getData();

                    return result;
                }
            });
}

Для получение результата о выполнении функции, нужно добавить Listener

DeleteData()
        .addOnCompleteListener(new OnCompleteListener<String>() {
            @Override
            public void onComplete(@NonNull Task<String> task) {
                if (task.isComplete()) {
                    //Что должно произойти после выполнения функции
                }
            }
        });

Обработчик событий базы данных

Любое изменение в базе данных можно отловить и обработать. Для этого CloudFunction предлагает несколько функций:

  • onCreate. Запускается, когда документ записывается в первый раз.
  • onUpdate. Запускается, когда документ уже существует и изменяется любое значение.
  • onDelete. Вызывается при удалении документа с данными.
  • onWrite. Срабатывает , когда onCreate, onUpdate или onDelete срабатывает.

В данном примере используется onDelete для блокирования удаления данных из бд.

exports.stopDelete = functions.database.ref('/users/').onDelete((change, context) =>{

		var numberUsers = change.val();
		return change.ref.parent.child('users').set(numberUsers);
});

Удаление файлов из Storage используя облачные функции

Для удаления файлов, нужно в функции указать путь до файла:

const filePath = 'Posts/thumbnail.jpg'
const bucket = gcs.bucket('postsapp-12312')
const file = bucket.file(filePath)
const pr = file.delete()

Storage

Загрузка файлов происходит через консоль вашей базы данных:

Firebase storage 1.png

После того, как файл был загружен, firebase создает ссылку:

Firebase storage 2.png

Прокси сервис

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

Запуск и развертывание

Установите зависимости и выполните:

npm install
node index . JS

Развертывание на Apigee Edge

Чтобы развернуть этот API-прокси на Edge, убедитесь, что apigeetool установлен на вашем компьютере.

apigeetool deploynodeapp -n apigee-firebase-nodejs-express-ap
i -d . -m index.js -o $YOUR_ORG -e test -b /apigee-firebase-nodejs-express-api -u $ae_username -p $
ae_password -V

Запуск

apiKey={GET_FROM_FIREBASE_CONSOLE}
authDomain={GET_FROM_FIREBASE_CONSOLE} 
databaseURL={GET_FROM_FIREBASE_CONSOLE} 
projectId={GET_FROM_FIREBASE_CONSOLE} messagingSende
rId={GET_FROM_FIREBASE_CONSOLE} node index.js

Примечания

  1. "Firebase - CrunchBase". CrunchBase. Retrieved June 11, 2014. 
  2. "Firebase - AngelList". Retrieved Jun 11, 2014. 
  3. "Contact Us". Firebase, Inc. 
  4. Metz. "‘Firebase’ Does for Apps What Dropbox Did for Docs". 
  5. Tamplin, James. "Firebase is Joining Google!". Firebase, Inc. Retrieved October 21, 2014. 
  6. Darrow, Barb (June 6, 2013). "Firebase gets $5.6M to launch its paid product and fire up its base". Retrieved June 11, 2014. 
  7. Melendez, Steven (May 27, 2014). "Sometimes You're Just One Hop From Something Huge". Retrieved June 11, 2014. 
  8. Farr, Christina (February 13, 2013). "Firebase’s scalable backend makes it ’10 times easier’ to build apps". Retrieved June 12, 2014. 
  9. Marshall, Matt (August 29, 2013). "Firebase is building a Dropbox for developers". Retrieved June 12, 2014. 
  10. "Firebase Integrations". , Inc. Retrieved June 12, 2014. 
  11. Darrow, Barb (DEC. 18, 2012). "Firebase secures its real-time back-end service". Retrieved June 12, 2014.  Check date values in: |date= (help)
  12. "Firebase Simple Login Overview". Firebase, Inc. Retrieved June 12, 2014. 
  13. Metz, Cade (04.09.13). "How to Build Your Own Google Docs (Without Google)". Retrieved June 12, 2014.  Check date values in: |date= (help)
  14. "Firepad - An open source collaborative code and text editor". , Inc. Retrieved June 12, 2014. 
  15. "Firechat - open source realtime chat built on Firebase". Firebase, Inc. Retrieved June 12, 2014. 

Ссылки