JAVA USER GROUP POLITECHNICA GEDANENSIS 1/26 Paweł Napieracz 7 marca 2013
»»»» Platforma do hostowania aplikacji webowych. Działa w modelu PAAS. Obsługuje języki: JAVA, Python, Go. Trwałe miejsce do przechowywanie zasobów: DataStore, BlobStore, Google Drive.» Automatyczne skalowanie i load balancing.» API wspomagające wytwarzanie aplikacji. 2/26
» Trzy idee: Easy to build, Easy to maintain, Easy to scale.» Darmowe 10 aplikacji na jedno konto: każda z aplikacji ma swój limit, możliwość przydzielenia mocy procesora i pamięci RAM: + F1 (600MHz, 128MB), +, + F4_1G (2400MHz, 1024MB). Darmowa baza danych NoSQL lub płatny Google Cloud SQL.» Wszystko ma swoje wady i zalety. 3/26
» Środowisko oparte o Jetty 6: serwer www, kontener selwletów Java.» Wspierane technologie: Java Data Objects (JDO), Java Persistence API (JPA), Java Server Faces (JSF) 2.x, Java Server Pages (JSP) + JSTL, Java Servlet API 2.5 (planowane 3.0), Java Architecture for XML Binding (JAXB), Java API for XML Web Services (JAX-WS): + działa jako klient, + wykorzystuje API dostarczone przez Googla limity. JavaMail, XML API: DOM, SAX, XSLT. 4/26
» Technologie częściowo wspierane: Contexts and Dependency Injection (CDI): + do projektu trzeba załączyć bibliotekę.» Technologie nie wspierane: Enterprise Java Beans (EJB), JAX-RPC, Java Database Connectivity (JDBC), Java EE Connector Architecture (JCA), Java Management Extensions (JMX), Java Message Service (JMS), Java Naming and Directory Interface (JNDI), Remote Method Invocation (RMI). 5/26
1. Zarejestrować konto Google App Engine. 2. Pobrać: plugin do Eclipse, App Engine Java SDK: + JRE 5 oraz 6 (jeszcze do stycznia 2013 wersja 1.7.4.), + od wersji 1.7.5. zaleca się używanie JRE 7, + dostarcza biblioteki i lokalny serwer www oraz bazy danych. 3. Utworzyć przykładową aplikację lub zaimportować przykłady. 4. Uruchomić aplikację na lokalnym serwerze. 5. Przetestować działanie i wysłać aplikacje na GAE. 6. Zarządzanie aplikacją poprzez link /_ah/admin 6/26
» App Identity,» Blobstore,» Google Cloud Storage,» Capabilities,» Channel,» Google Cloud Endpoints,» Images,» Logs,» Mail, 7/26
» MemCache,» Multitenancy,» OAuth,» Prospective Search,» Search,» Task Queues,» URL Fetch,» Users,» XMPP. 8/26
» Darmowa przestrzeń na pliki.» Upload plików do 32MB.» Łatwe użycie.» Obsługa BlobStore: serwlet do przyjmowania żądania i przekazania przesłanego pliku do BlobStore: + wiele plików na jedno żądanie, + zwraca BlobKey identyfikujący przesłany plik. serwlet do udostępniania treści z BlobStore: + przekazanie obsługi odpowiedzi oraz BlobKey resztą zajmuje się biblioteka.» Google Cloud Storage (parametr).» Pisanie do pliku. 9/26
10/26» Tworzenie połączenia pomiędzy aplikacją, a przeglądarką: wykorzystanie serwerów Google, JavaScript.» Token zabezpieczenie połączenia.» Przykładowa aplikacja Kółko i Krzyżyk w dokumentacji.
Otworzenie gniazdka do komunikacji klienta z serwerem. 11/26
Wymiana wiadomości klienta B z klientem A. 12/26
» Biblioteka do manipulowania obrazkami.» Zastępuje java.awt.image: brak dostępu AWT: + wygenerowanie Captcha niemożliwe rozwiązanie litetext project, + brak obsługi dla JasperReports podstawa aplikacji dla biznesu.» Przekształcenia: zmiana rozmiaru, obrócenie, odbicie, przycięcie, I m Feeling Lucky.» Obsługuje: JPEG, PNG, WEBP, GIF, BMP, TIFF, ICO. 13/26
» Wykonywanie czynności w tle zainicjowanych przez użytkownika/aplikacje.» Wprowadza asynchroniczność do naszych aplikacji.» Dwie konfiguracje: Push queues domyślny sposób kolejkowania. Pull queues aplikacja, bądź konkretni użytkownicy dzierżawią zadania na określony czas przez określony czas. Pozwalają na większą kontrolę przetwarzanego zadania i umożliwiają na integracje z systemami nie używającymi GAE za pomocą REST API.» Ustawienia: queue.xml, domyślnie uruchamianie 5 zadań na sekundę, należy zabezpieczyć adresy poprzez udostępnienie ich tylko dla roli admin. 14/26
» Push Task: Użycie rozproszonej transakcji bazy danych: em.gettransaction().begin();... Queue queue = QueueFactory.getDefaultQueue(); queue.add(taskoptions.builder.withurl("/report/invoice").param("id ", "111")); em.gettransaction().commit();» Pull Task: Queue q = QueueFactory.getQueue("pull-queue"); q.add(taskoptions.builder.withmethod(taskoptions.method.pull).payload("hello world"));... List<TaskHandle> tasks = q.leasetasks(3600, TimeUnit.SECONDS, 100); 15/26
16/26» Cechy: baza typu NoSQL: + własny język zapytań GQL, + brak relacji. High Replication Datastore (HRD), wspiera atomiczne transakcje wysoka wydajność czytania i pisania, wysoka regularność dostępu do encji, wspierane JDO oraz JPA i niskopoziomowe Datastore API, przystosowany do automatycznego zarządzania skalowalnością dużych zbiorów danych.
» Indeksy: wymaganie przy sortowaniu i filtrowaniu, tworzone drzewo z indeksami kierunkowymi (desc i asc oddzielnie), automatyczne generowane: + zapytania używające tylko filtrowanie po przodku i kluczu, + zapytania używające tylko filtrowanie spr. równość przodka, + zapytania używające filtrowania po jednej nierówności, + zapytania używające filtrowania po przodku, po równości z polem, nierówności na kluczu, + zapytania nie używające filtrowania i sortujące tylko po jednym polu. manualnie w datastore-indexes.xml: + zapytanie z sortowaniem po wielu polach, + zapytania z filtrowaniem po przodku i nierównościach, + zapytanie z jedną albo większą ilością filtrów po nierówności albo równości, + sortowanie po kluczu w kolejności malejącej. 17/26
18/26» Restrykcje: operacje złączeń, filtrowanie danych ze względu na wynik podzapytania, funkcje agregujące: + count, + sum, + avg, + group by + having. filtrowanie tylko po polach indeksowanych, odwzorowanie relacji wiele-do-wielu, brak wspierania niektórych typów danych w stosunku do MySQL, indeksowane pola do 500bajtów, maksymalnie 1MB na pole.
19/26» Zabezpieczenie aplikacji poprzez mechanizm podobny do JAAS.» Zalecane używanie MemCache.» Przemyślenie struktury bazy danych: denormalizacja, rozwiązanie braku funkcji agregujących (count).
Zasób Darmowy limit Blobstore Stored Data 5GB Chanel API 657 000 żądań* / 100 kanałów * Pamięć na kod i pliki statyczne 1GB Datastore Data 1GB Liczba indeksów 200 Operacje czytania / pisania / small 50 000 * Mail 100 żądań* / 2 000 załączników * Mail do administratora 5 000 * Transfer przychodzący / wychodzący 1GB * / 1GB * 20/26 * - limit dzienny
Zasób Darmowy limit Task Queue API 100 000 żądań * Task Queue Stored Task Count 1 000 000 Task Queue Stored Task Bytes 500 MB URL Fetch 657 000 żądań * XMPP API Calls 46 000 000 żądań * XMPP API Data Sent 1 GB * Request Time 60s / 10min dla Cron Jobs 21/26 * - limit dzienny
» Alternatywa: OpenShift lub Jboss AS7 i CapeDwarf. Implementacja funkcji GAE w projekcie CapeDwarf. 22/26
23/26» Dokumentacja (dostęp 06.03.2013) - https://developers.google.com/appengine/docs/java» Wspierane technologie i frameworki (dostęp 06.03.2013) - http://code.google.com/p/googleappengine/wiki/willitplayinjava#jav a_enterprise_edition_(java_ee)_technologies» Maven GAE plugin - https://github.com/maven-gae-plugin/maven-gaeplugin» Filmy instruktarzowe - https://developers.google.com/appengine/docs/videoresources#traini ng» Biała lista dostępnych klas - https://developers.google.com/appengine/docs/java/jrewhitelist
24/26 Aplikacja realizująca podstawowe funkcje portalu wynajmującego samochody, Blobstore API, UrlConnection API, Image API, Email API, CronJobs API.
25/26
26/26