SMB Chmura Obliczeniowa Michail Mokkas
Chmura obliczeniowa Model udostępniający zasoby (serwery, dane, aplikacje) w sieci Stwarza iluzję nieskończonych zasobów dostępnych na żądanie Umożliwia naliczanie opłat za korzystanie z ww. zasobów (nie płacimy za niewykorzystane zasoby)
Historia 1950 – mainframe-thin client: użytkownicy mogli korzystać ze współdzielonych zasobów (głównie CPU) 1960 – wiele spekulacji na temat przyszłości obliczeniowej, głównie bazujące na małej ilości „mainframeów” i dużej „dumb terminals”. Pomysł, że cały świat mógłby wykorzystywać tylko 15 centrali danych. 2000 - Amazon usprawniła swoje centra danych używające tylko 10% pojemności, by zostawić miejsce na okresowe zawahania. Powstał pierwszy wzór architektury chmury obliczeniowej. Wystartował Amazon Web Services (AWS). 2008 – Eucalyptus: pierwsza kompatybilna z AWS API platforma do tworzenia środowisk chmur obliczeniowych. Rusza także Google App Engine (beta). Obecnie - szeroka dostępność wydajnych sieci i tanich komputerów oraz urządzeń przechowujących dane jak i ekspansja wirtualizacji sprzętowej oraz architektury bazującej na usługach przyczyniły się do szybkiego rozwoju chmury obliczeniowej
Jak działa Komunikacja z usługami a nie ze szczególnym urządzeniem/sprzętem Przeniesienie wszystkich świadczeń usług IT na serwer Umożliwienie stałego dostępu do nich Szybkość procesów wynika z mocy obliczeniowej serwera http://www.cloudproviderusa.com/wp-content/uploads/2012/09/website-cloud-vs-traditional-smallcopy.jpeg
Dlaczego na mobilne? Pozwala na zlecenie bardziej złożonych obliczeń zewnętrznej usłudze oszczędzając w ten sposób własne zasoby systemowe Umożliwia przetrzymywanie oraz udostępnianie dużej ilości danych, nie zapełniając lokalnych nośników Udostępnia dodatkowe usługi, które mogą wspomagać naszą aplikację
Rodzaje Rodzaje wdrożeniowe chmur (według NIST): Prywatne (private) Wspólnotowe (community) Publiczne (public) Hybrydowe (hybrid)
Prywatne Infrastruktura chmury działająca jedynie dla pojedynczej organizacji Może być zarządzana przez tę organizację lub osobę trzecią i być hostowana wewnętrznie lub zewnętrznie Korzystają z niej jednostki biznesowe (działy) firmy Może ułatwić procesy biznesowe, jednak jest potrzebne zaangażowanie w jej poprawne wdrożenie Zwykle nie posiada elementu finansowego, z którego chmury słyną
Wspólnotowe Infrastruktura chmury wykorzystywana jest przez wspólnoty lub organizacje, które posiadają wspólne cele/misje Jest zarządzana przez kombinację organizacji wchodzących w skład wspólnoty lub osobę trzecią.
Publiczne Zasoby sprzętowe nie są dedykowane pod poszczególnych klientów korzystających z usług firmy dostarczającej chmurę Klient określa, jakie parametry go interesują i płaci dokładnie za to, co zamówił Klient także może w każdej chwili zwiększyć lub zmniejszyć zasoby w dzierżawionym przez siebie środowisku Zmiany zostaną zastosowane natychmiast, bez potrzeby zatrzymywania pracujących aplikacji i maszyn wirtualnych
Hybrydowe Połączenie dwóch lub więcej z poprzednich Część usług i infrastruktury klienta pracuje w chmurze publicznej a inna część w prywatnej lub wspólnotowej
Modele Istnieje wiele klasyfikacji chmur obliczeniowych Najpopularniejsze to: IaaS (Infrastructure as a Service) PaaS (Platform as a Service) SaaS (Software as a Service) NaaS (Network as a Service)
Hoteling/Kolokacja Udostępniane nam jest miejsce w serwerowni, prąd, klimatyzacja i dostęp do internetu My kupujemy sprzęt, zabezpieczenia, system operacyjny, oprogramowanie oraz aplikacje My także tym wszystkim zarządzamy Płacimy jedynie za dzierżawę miejsca w serwerowni
IaaS Dostarcza klientowi infrastrukturę informatyczną (sprzęt oraz serwisowanie) My dostarczamy system operacyjny, oprogramowanie oraz aplikacje Najczęściej wykorzystuje się maszyne wirtualną, którą dostawca może przenosić na mniej obciążone fizycznie serwery Płacimy za faktycznie zużytą moc obliczeniową serwerów Przykłady: Amazon EC2 oraz Azure Virtual Machines
PaaS Dostajemy gotowy i dostosowany do naszych potrzeb komplet aplikacji Nie martwimy się o system operacyjny a jedynie zajmujemy się pisaniem i utrzymaniem aplikacji Klient ma dostęp do interfejsu poprzez program kliencki (zazwyczaj przeglądarkę) Płacimy za zużycie zasobów (czas procesora, miejsce na dysku, liczbę zapytań i transfer danych) Przykłady: Google AppEngine, Microsoft Azure
SaaS Mamy zapewniony sprzęt, system operacyjny oraz finalną aplikację My korzystamy tylko z funkcjonalności danej aplikacji Nie mamy wpływu na rozwój aplikacji Zwykle wiąże się z opłatą każdego użytkownika za miesiąc jej użytkowania Przykład: Google Apps, SkyDrive, Hotmail
NaaS Zapewnia nam usługi związane z transportem sieciowym Zazwyczaj wiąże się z wirtualizacją sieci i ich dzierżawą poprzez wykorzystanie protokołów, jak np. OpenFlow
XaaS X = jakakolwiek usługa Usług przybywa RaaS (Research as a Service) CaaS (Communication as a Service) SaaS (Storage as a Service)
Zarządzanie chmurą Chmura wymaga adaptacyjnych narzędzi zarządzającyh oraz monitorujących, które poradzą sobie w tym dynamicznym środowisku Wymagane jest użycie specyficznych parametrów do pracy z komponentami chmury (np. sprzęt pośredniczący), które często są niewidoczne dla klientów Zarządzanie opłatą za dostęp do zasobów i usług stanowi istotne wyzwanie dla publicznych chmur
Zalety Zwiększone możliwości Zwiększona wydajność Mniejsze koszty Łatwa skalowalność Pozwala skupić się na bardziej kreatywnych aspektach naszej pracy http://www.webhostingspree.com/cloud/images/cloud_dir.png
Wady Bezpieczeństwo danych Obawy dotyczące dostępności danych i aplikacji Uzależnienie od dostawcy usług chmury obliczeniowej
GAE Google App Engine: platforma chmury obliczeniowej wykorzystywana do hostowania aplikacji webowych na serwerach Google’a Oferuje możliwość skalowania wymaganych zasobów dla potrzeb działających w niej usług/aplikacji Jest to platforma jako usługa (PaaS)
Wspierane języki Aktualnie można pisać aplikacje w językach: Python (w tym framework Django i inne) Java (w tym Java Server Pages i inne) PHP Go W przyszłości ma ich być więcej Ewentualnie można skorzystać z opcji “Custom Runtime”, który umożliwia pisanie w dowolnym języku wspierającym żądania HTTP
Restrykcje Otrzymujemy wgląd (read-only) do systemu plików na App Engine App Engine może wykonywać polecenia otrzymane wyłącznie za pośrednictwem zapytań HTTP Aplikacje Javowe mogą korzystać tylko z części listy wszystkich klas dostępnych w standradowej edycji JRE http://strona.pl -> http://www.strona.pl
GAE Datastore Służy do przechowywania danych po stronie serwerowej Korzystamy z języka podobnego do SQL, zwanym GQL, który niestety nie obsługuje odpowiednika „join” Możemy korzystać z interfejsu Twig Object Datastore, co umożliwi asynchroniczne i nie blokujące wykonywanie zapytań Alternatywnie można korzystać z Google Cloud SQL (wspiera Java DataBase Connectivity - interfejs programowania łączący do baz danych za pomocą języka SQL; odpowiednik ODBC)
Google Cloud Endpoints Umożliwia proste i zautomatyzowane generowanie bibliotek służących do sprawnej komunikacji pomiędzy aplikacją frontendową i backendową Ponadto mamy możliwość korzystania z uwierzytelniania Oauth 2.0
Google Cloud Messaging for Android Usługa umożliwiająca przesyłanie danych z serwera do aplikacji frontendowych na urządzeniach Android Wiadomości mogą ważyć do 4 KB Przykłady wiadomości: (notyfikacje o nowej wersji oprogramowania, wiadomość komunikatora) W 2017 r. została zastąpiona Firebase Cloud Messaging.
Zależności Stworzyć moduł backendowy W settings.gradle dodać: ustawić localhost:8080 w run configuration W settings.gradle dodać: include ‘:apka’, ‘:backend’ W build.gradle:apka dodać do dependencies: compile project(path: ‘:backend’, configuration: ‘android-endpoints’) W build.gradle:backend dodać: endpoints{ getClientLibsOnBuild = true getDsicoveryDocsOnBuild = true } Na koniec: “Sync Project with Gradle Files”
Projekt: Frontend Frontend (aplikacja na Android): File -> New -> Android Application Project Reszta jak zwykle ;)
Projekt: Backend Backend (aplikacja po stronie chmury): Dodajemy jako nowy moduł File > New > New Module... > Google Cloud Module API Key oraz Project Number otrzymujemy z Google API console (można pozostawić puste na razie)
Entity Struktura, która odzwierciedla element przechowywany w Datastore (wiersz) Nasza klasa entity musi być oznakowana: @Entity Ponieważ Datastore nie posiada kolumn, posiadają one atrybuty (pola naszego entity) Dla przykładu - Entity osoba posiada Entity Kind = Osoba, Entity Key = PESEL oraz atrybuty: imię, nazwisko, wzrost itd.
Entity: Person (backend) Przy wykorzystaniu Key potrzebne jest dodanie do wygenerowanego end-pointa kawałek kodu sprawdzający czy nie jest on Null.
Entity: Person (backend) Należy kliknąć prawym przyciskiem myszy na klasę Person i następnie wybrać Google -> Generate Cloud Endpoint from Java Class Uzyskamy w ten sposób automatycznie wygernerowaną klasę PersonEndpoint wraz z metodami potrzebnymi do korzystania z DataStore
Przetestowanie projektu W MainActivity.java umiesczamy:
Odpalenie lokalnie Należy wybrać Run > Edit Configurations > + > App Engine DevAppServer Następnie w edytorze wyznaczyć konfiguracji nazwę oraz podać moduł “backendowy”, który powinien odpalać Na koniec należy wybrać “synchronize with build.gradle configuration”
Uruchomienie Zaczynamy od backendowego projektu: Run as -> Web Application Po ukończeniu uruchamiania app engineu możemy odpalić aplikację androidową Jeżeli wybraliśmy lokalne odpalenie app engine, musimy odpalić aplikację w emulatorze
Rezultat Wystarczy wejść na jedną z poniższych stron: localhost:8888/_ah/admin localhost:8888/_ah/admin/datastore localhost:8000/datastore Uzyskamy wgląd do entites, które znajdują się w bazie danych Przed odpaleniem frontendu będzie pusta, po odpaleniu doda Entity Kind: Person Po kliknięciu List Entities będziemy mogli zobaczyć nowy rekord z atrybutem name, jaki dodaliśmy
Rezultat kont. 1
Przykład - MyBean.java
Przykład - MyEndpoint.java Można automatycznie wygenerować MyBeanEndpoint na podstawie klasy MyBean.java . (opcja: Generate Cloud Endpoint from Java Class)
Przykład - WEB-INF: index.html
Rezultat Po odpaleniu backendu i skierowaniu przeglądarki na adres: localhost:8080.
API Explorer Naprowadzając przeglądarkę na localhost:8080/ah_/api mamy możliwość przejrzenia metod w naszym API.
Przykład: request - response Dane są przesyłane w formacie JSON.
Pobranie danych z DataStore Za odbieranie danych w naszym projekcje frontendowym odpowiedzialna jest klasa: collectionResponsePerson.java Można ją znaleźć w paczce wygenerowanych klas endpoint-libs/libpersonendpoint... Ma za zadanie przetworzenie (przeparsowanie oraz zserializowanie) obiektu w formacie JSON przesyłanego poprzez endpoint (za pośrednictwem HTTP)
Pobr. danych z DS kont. 1 Więcej na ten temat: https://github.com/GoogleCloudPlatform/gradle-appengine-templates/tree/master/HelloEndpoints
Objectify Jest to biblioteka usprawniająca wymianę danych poprzez API, które zostało specjalnie zaprojektowane pod Google App Engine datastore. Pozwala na zapisanie, odzyskanie, usunięcie oraz odpytywanie naszych własnych typów objektów. Przykład: Aby skorzystać z objectify należy dopisać do dependencies: compile ‘com.googlecode.objectify:objectify:5.0.3’
Dodawanie danych poprzez skrypt Istnieje możliwość skorzystania z gotowego skryptu do zapełnienia naszego DataStore’a danymi: Wystarczy uruchomić i podać plik csv jako arg1 oraz nazwę encji jako arg2 Przykładowy plik csv dla encji Person:
Dodawanie danych kont.1 Do pliku web.xml w projekcie backendowym dodajemy:
Dodawanie danych kont. 2 Dodatkowo musimy dorobić plik bulkloader.yaml :
Sprawdzenie danych Po uruchomieniu skryptu powinniśmy otrzymać następujący rezultat:
Postawienie na chmurze Google
Zmiany (z lokalnej wersji) W skrypcie należy zmienić url na: http://naszeAppID.appspot.com/remote_api W backendowym projekcie w pliku appengine-web.xml: <application>naszeAppID</application> W frontendowym projekcie należy zmienić w pliku CloudEndpointUtils.java wartość LOCAL_ANDROID_RUN z true na false Uruchamiamy backendowy projekt za pomocą opcji Deploy to App Engine, następnie uruchamiamy frontendową aplikację (jak zwykle)
Infrastruktura
Search API GAE dysponuje Search API Przydatne do wyszukiwania danych dotyczących elementów naszej implementacji, które z kolei są opisane w specjalnym modelu do indeksowania dokumentów posiadających strukturę Użytkownik wpisuje słowo kluczowe (może być częścią nazwy lub opisu) a w rezultacie otrzymuje elementy pasujące Dodatkowo umożliwia wyszukiwanie geolokalizacyjne obiektów bez konieczności pisania własnego rozwiązania
Task Queues W przypadku, gdy musimy wykonać jakieś dodatkowe czynności w związku z nadesłanym zapytaniem i są one czasochłonne, możemy wykorzystać usługi Task Queue, aby zakoleikować te zadania i wykonać je asynchronicznie Dodatkowe rezultaty mogą być przesłane w późniejszym terminie (GAE decyduje kiedy) Alternatywnie nasz kod może na żądanie odpytywać i odbierać rezultaty z zaległych zadań
Scheduled Tasks Poza przetwarzaniem zapytań od mobilnych klientów synchronicznie (Google Cloud Endpoints) oraz asynchronicznie (Task Queues), nasz kod po stronie GAE może co jakiś czas wykonywać pewne zaplanowane zadania Do planowania zadań wykorzystujemy usługę Cron Service Przykładem zastosowania może być co kilkuminutowa aktualizacja listy najlepszych graczy naszej gry
Cron Service (przykład)
Mail API Aplikacje App Engine mogą przesyłać wiadomości email w imieniu administratorów aplikacji lub uzytkowników posiadających konto Google Pliki appengine-web.xml oraz web.xml Dodatkowo potrzebna jest klasa MailHandlerServlet
Mail API (wysyłanie)
Przykład: Projekt GAE (frontend i backend) Frontend rejestruje się do backendu Możliwość wysyłania wiadomości do podłączonych urządzeń poprzez usługę Google Cloud Messaging for Android
Przykład kont. 1 Należy wpisać API key oraz numer projektu: API key można uzyskać po uruchomieniu Google Cloud Messaging for Android pod adresem: https://console.developers.google.com/project/<nasz projekt>/apiui/api Następnie należy wybrać tab Credentials i stworzyć nowy klucz Public API access lub OAuth Numer projektu widoczny jest w tabie overview (lewy górny róg).
Przykład kont. 2 Przestawiamy LOCAL_ANDROID_RUN z false na true (znajduje się w projekcie frontendowym w klasie: CloudEndpoints) Startujemy backend jako web service Uruchamiamy frontend jako aplikację androidową na emulatorze Jeżeli nie wpisaliśmy API key podczas tworzenia projektu, mamy możliwość jego dodania i modyfikacji w klasie MessageEndpoint (wartość API_KEY)
Działanie
Działanie kont. 1
Więcej na temat GAE https://developers.google.com/eclipse/docs/endpoints-androidconnected-gae https://cloud.google.com/developers/articles/mobile-application-solutions https://cloud.google.com/developers/articles/how-to-build-mobile-app-with-app-engine-backend-tutorial https://cloud.google.com/developers/ https://developers.google.com/appengine/docs/java/ https://developers.google.com/appengine/docs/java/gettingstarted/introduction
Firebase Platforma wykorzystywana do budowy aplikacji mobilnych oraz webowych. Wcześniejsza wersja (Envolve) umożliwiała aplikacjom dodawanie funkcjonalności czatu. Była jednak wykorzystywana często do synchronizacji i przesyłania informacji, które nie były zwykłymi wiadomościami komunikatora. W 2011 roku nastąpił podział firmy co skutkowało powstaniem Firebase. Przejęta przez Google w 2014 r. Wieloplatformowa (m.in. Android, iOS)
Firebase - Usługi Niektóre z usług jakie oferuje Firebase: Realtime Database – baza danych (posiada REST API) Authentication – uwierzytelnienie użytkowników po stronie klienta (można korzystać z social login providerów jak m. in. Facebook czy Google) Cloud Functions – rozszerza aplikację o backendowe możliwości wykorzystując m. in. Google Cloud Services Hosting – umożliwia hostowanie stron (plików HTML, CSS, Javascript i innych) Google Analytics – daje wgląd do informacji dotyczących użytkowanie aplikacji i statystyk dotyczących interakcji użytkowników. Cloud Messaging – stosowane w celu tworzenia notyfikacji oraz rozsyłania informacji. AdMob – tworzenie reklam w celu uzyskania źródła dochodów w naszej aplikacji.
Korzystanie z Firebase Kroki: Zarejestrować konto na: https://console.firebase.google.com/u/0/ Dodać projekt Przepisać “package name” naszej apki Wygenerować SHA-1 keytoolem Zarejestrować apkę i ściągnąć google-services.json Zmodyfikować plik gradlowe według wskazówek na stronie (po rejestracji) Zmodyfikować reguły Realtime Database. Z poziomu Android Studio jest dostępny assystent, który pomaga z całym procederem.
Korzystanie z Firebase – kroki 2
Korzystanie z Firebase – kroki 3
Uwierzytelnianie w Firebase Należy dodać następującą zależność w build.gradle : FirebaseAuth - klasa zarządzająca uwierzytelnianiem w Firebase. implementation 'com.google.firebase:firebase-auth:16.0.5' public class MainActivity extends Activity { private FirebaseAuth fa; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fa = FirebaseAuth.getInstance(); } }
Uwierzytelnianie w Firebase - rejestracja fa.createUserWithEmailAndPassword(et_user.getText().toString(), et_pass.getText().toString()) .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { FirebaseUser user = fa.getCurrentUser(); } else { Toast.makeText(MainActivity.this, "Authentication failed.", Toast.LENGTH_SHORT).show(); } } });
Uwierzytelnianie w Firebase - logowanie fa.signInWithEmailAndPassword(et_user.getText().toString(), et_pass.getText().toString()) .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { FirebaseUser user = fa.getCurrentUser(); } else { Toast.makeText(MainActivity.this, "Authentication failed.", Toast.LENGTH_SHORT).show(); } } });
Uwierzytelnianie w Firebase - informacje o użytkowniku FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); if (user != null) { String name = user.getDisplayName(); String email = user.getEmail(); Uri photoUrl = user.getPhotoUrl(); boolean emailVerified = user.isEmailVerified(); String uid = user.getUid(); Task<GetTokenResult> tr = user.getIdToken(false); //autorefresh }
Realtime Database - dane Dane w RTDB są trzymane w postaci obiektów JSON. Tworzą one strukturę drzewa. Przykład: { "users": { "user1": { "name": "Michail Mokkas", }, }, "products": { "product1": { "name": "Mleko", } } }
Realtime Database - uprawnienia Wymaga uprawnień do czytania/edycji dla użytkowników z urpawnieniami. Można jednak ustawić na publiczne: Ewentualnie tylko dla wybranych użytkowników: { "rules": { ".read": true, ".write": true } } { "rules": { "users": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" } } } }
Realtime Database - obiekt bazy oraz zapis FirebaseDatabase - klasa, której obiekty reprezentują rtdb. DatabaseReference - referencja do lokacji danych w bazie. Otrzymujemy obiekt reprezentujący bazę poprzez wykorzystanie metody FirebaseDatabase.getInstance() Do zapisu danego obiektu w bazie, wymagany jest obiekt reprezentujący referencję w bazie. Referencję otrzymujemy poprzez metodę getReference("Klasa obiektów") na wczesniej uzyskanym obiekcie FirebaseDatabse. Następnie możemy już zapisać nasze dane poprzez metodę setValue(moj_obiekt) na referencji bazy.
Realtime Database - odczyt Aby nasze dane w bazie były uaktualniane w czasie rzeczywistym, powinniśmy dodać ValueEvenListener do naszej referencji. Metoda onDataChange() jest wykonywana kiedy nasz listener jest dodany i za każdym razem kiedy nastepują zmiany w danych. W razie błędu zostanie wywołana metoda onCancelled().
Realtime Databsse - dodaktowe metody i interfejsy DataSnapshot - reprezentuje dane z lokacji w bazie. push() - dodaje dane i zwraca klucz, który jest potrzebny do dodania kolejnych danych ChildEventListener - interfejs, który jest wykorzystywany do otrzymywania zdarzeń na temat zmian w potomnych lokacjach danego DatabaseReference. onCancelled() - metoda ta wykona się, jezeli pojawił się błąd po stronie serwera lub zostały zmienione uprawnienia. onChildAdded() - metoda ta wykona się, jeżeli pojawi się nowa lokacja potomna. onChildChanged() - metoda ta wykona się, jeżeli dane w lokacji potomnej się zmieniły onChildMoved() - metoda ta wykona się, jeżeli priorytet lokacji potomnej się zmieni. onChildRemoved() - metoda ta wykona się, jeżeli lokacja potomna zostanie usunięta.
Firebase - przykład (Baza ludzi)
Firebase – przykład kont. 1
Firebase – przykład kont. 2
Rezultat - apka
Rezultat na stronie