V prvi polovici tega članka je bil predstavljen pregled brezžičnega računalništva z AWS Lambda, vključno z gradnjo, uvajanjem in preizkušanjem funkcij AWS Lambda v primerni aplikaciji Java. V 2. delu boste izvedeli, kako integrirati Lambda funkcije z zunanjo bazo podatkov, v tem primeru DynamoDB. Nato bomo s pomočjo AWS SDK poklicali funkcije Lambda iz našega primera aplikacije Java.
AWS Lambda in DynamoDB
DynamoDB je shramba dokumentov NoSQL, ki jo gosti Amazon Web Services (AWS). DynamoDB definira abstrakcije podatkov kot tabele, ki sprejemajo običajne operacije baze podatkov, kot so vstavljanje, pridobivanje, poizvedovanje, posodobitev in brisanje. Kot pri mnogih drugih zbirkah podatkov NoSQL tudi pri DynamoDB shema ni določena, zato imajo lahko nekateri elementi v isti tabeli polja, ki jih druga nimajo.
Ena izmed najboljših lastnosti DynamoDB je model stopenjskega oblikovanja cen. Za razliko od storitve relacijske zbirke podatkov AWS (RDS), pri kateri AWS upravlja vašo bazo podatkov s primerki EC2, ki jih plačate, je DynamoDB plačljiv. Plačate za shranjevanje, ki ga uporabljate, in pretok vaših poizvedb, vendar ne plačate neposredno nobenih osnovnih virtualnih strojev. Poleg tega vam AWS ponuja brezplačno raven, ki podpira do 25 GB prostora, z dovolj pretoka za izvedbo do 200 milijonov zahtev na mesec.
Pri brezžičnem strežniku z AWS Lambda, 1. del, smo razvili preprosto aplikacijo Java brez strežnika, ki uporablja funkcije Lambda. Izvorno kodo za aplikacijo GetWidgetHandler lahko kadar koli prenesete. Če še niste prebrali 1. dela, pred nadaljevanjem predlagam, da se seznanite s kodo aplikacije in primeri iz tega članka.
Naš prvi korak je nastavitev baze podatkov DynamoDB v naši konzoli AWS. Po tem bomo posodobili get-widget
funkcija iz 1. dela za pridobitev gradnika iz tabele DynamoDB.
Nastavite bazo podatkov DynamoDB v AWS
Začeli bomo z ustvarjanjem tabele DynamoDB. V konzoli AWS kliknite Storitve in v razdelku baze podatkov izberite DynamoDB, kot je prikazano na sliki 1.
Steven HainesPo zagonu boste videli nadzorno ploščo DynamoDB. Kliknite Ustvari tabelo , da začnete ustvarjati tabelo, prikazano na sliki 2.
Steven HainesZdaj boste videli stran, prikazano na sliki 3.
Steven HainesDajte tabeli ime (v tem primeru "Widget") in nastavite primarni ključ na id
, tako da ostane kot Vrvica
. Pritisnite Ustvari ko končate, vas bo usmeril na stran tabel DynamoDB. Če boste morali v prihodnosti navigirati na to stran, izberite Storitve -> DynamoDBin kliknite Mize.
V novo tabelo pripomočkov bomo ročno ustvarili vnos, zato kliknite Ustvari element na sliki 5.
Steven HainesDynamoDB bo stran Ustvari element vnaprej naselil z id
polje. Vnesite ID, ki si ga je enostavno zapomniti, na primer "1". Nato pritisnite plus (+) poleg novega ID-ja in dodajte še eno poklicano polje ime
. Vnesite vrednost za ime
polje, na primer "Widget 1". Pritisnite Shrani ko končate.
Posodobite razred GetWidgetHandler
S podatki v naši bazi podatkov moramo naslednjo stvar posodobiti GetWidgetHandler
razreda iz 1. dela. Začeli bomo z dodajanjem odvisnosti DynamoDB v prvotno datoteko POM. Posodobljeno pom.xml
datoteka je prikazana na seznamu 1.
Seznam 1. pom.xml (posodobljeno z odvisnostjo DynamoDB)
4.0.0 com.javaworld.geekcap aws-lambda-java jar 1.0-SNAPSHOT aws-lambda-java //maven.apache.org 1.8 UTF-8 com.amazonaws aws-lambda-java-core 1.1.0 com.amazonaws aws -java-sdk-dynamodb 1.11.135 junit junit 4.12 test org.apache.maven.plugins maven-compiler-plugin 2.0.2 $ {java.version} $ {java.version} org.apache.maven.plugins maven-shadow -plugin 2.3 lažni odtenek paketa
Seznam 1 doda aws-java-sdk-dynamodb
odvisnost datoteke POM iz dela 1. Seznam 2 prikazuje posodobljeno GetWidgetHandler
razred.
Seznam 2. GetWidgetHandler.java (posodobljeno za nalaganje podatkov iz DynamoDB)
paket com.javaworld.awslambda.widget.handlers; uvoz com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; uvoz com.amazonaws.services.dynamodbv2.document.DynamoDB; uvoz com.amazonaws.services.dynamodbv2.document.Item; uvoz com.amazonaws.services.dynamodbv2.document.Table; uvoz com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; uvoz com.javaworld.awslambda.widget.model.Widget; uvoz com.javaworld.awslambda.widget.model.WidgetRequest; javni razred GetWidgetHandler implementira RequestHandler {@Override public Widget handleRequest (WidgetRequest widgetRequest, Context context) {// return new Widget (widgetRequest.getId (), "My Widget" + widgetRequest.getId ()); // Ustvari povezavo z odjemalcem DynamoDB AmazonDynamoDB = AmazonDynamoDBClientBuilder.defaultClient (); DynamoDB dynamoDB = nov DynamoDB (odjemalec); // Pridobite sklic na tabelo pripomočkov Tabela tabel = dynamoDB.getTable ("Widget"); // Pridobimo naš izdelek po ID-ju Item item = table.getItem ("id", widgetRequest.getId ()); if (item! = null) {System.out.println (item.toJSONPretty ()); // Vrnemo nov objekt gradnika vrnemo nov gradnik (widgetRequest.getId (), item.getString ("ime")); } else {vrni nov pripomoček (); }}}
Glavni vmesnik DynamoDB je DynamoDB
predmet. Če želite ustvariti a DynamoDB
na primer potrebujemo odjemalca DynamoDB. Ker bo naša funkcija Lambda delovala v AWS, nam ni treba posredovati poverilnic, zato lahko uporabimo privzetega odjemalca. Upoštevajte, da bomo bazo podatkov lahko poizvedovali samo brez poverilnic, ker get-widget-role
iz dela 1 vsebuje dynamodb: GetItem
dovoljenje.
Iz DynamoDB
na primer, lahko pokličemo getTable ("Widget")
za pridobitev a Tabela
primer. Potem lahko pokličemo getItem ()
na Tabela
primerek, mu posreduje primarni ključ elementa, ki ga želimo pridobiti. Če obstaja element z navedenim primarnim ključem, bo vrnil veljaven odgovor; v nasprotnem primeru se bo vrnil nič
. The Postavka
class omogoča dostop do odzivnih parametrov, zato izvedbo zaključimo z ustvarjanjem novega Pripomoček
objekt, katerega ime je naloženo iz DynamoDB.
Poizvedovanje DynamoDB z DynamoDBMapper
Obstaja več API-jev za poizvedovanje DynamoDB, od klica storitve RESTful do zgornjega vmesnika do nekaj vmesnikov višje ravni. Eden bolj priljubljenih vmesnikov je DynamoDBMapper. Ta vmesnik ponuja podobno konstrukcijo, kot jo lahko najdete pri preslikavi predmetov v relacijske podatke v orodju, kot je hibernacija. Oglejmo si na kratko, kako pridobiti a Pripomoček
iz DynamoDB z uporabo DynamoDBMapper
API.
Prva stvar, ki jo moramo storiti, je dodati nekaj pripisov Pripomoček
razred, ki je prikazan na seznamu 3.
Seznam 3. Widget.java (posodobljeno s pripisi DynamoDBMapper)
paket com.javaworld.awslambda.widget.model; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable; @DynamoDBTable (tableName = "Widget") pripomoček javnega razreda {private String id; ime zasebnega niza; javni pripomoček () {} javni pripomoček (niz niza) {this.id = id; } javni pripomoček (ID niza, ime niza) {this.id = id; this.name = ime; } @DynamoDBHashKey (attributeName = "id") javni niz getId () {return id; } javna void setId (ID niza) {this.id = id; } @DynamoDBAttribute (attributeName = "name") javni niz getName () {return ime; } javna void setName (ime niza) {this.name = name; }}
The DynamoDBTable
pripisuje ime tabele DynamoDB, ki ji pripada Pripomoček
zemljevidi. The DynamoDBHashKey
pripis identificira primarni ključ Pripomoček
tabela. In DynamoDBAttribute
pripis identificira druge atribute razreda, ki preslikajo atribute baze podatkov v DynamoDB. Če ste imeli druge atribute, ki ste jih želeli prezreti, lahko dodate @DynamoDBIgnore
pripis.
Z Pripomoček
razred označen, zdaj lahko posodobimo GetWidgetHandler
razred za uporabo DynamoDBMapper
, ki je prikazan na seznamu 4.
Seznam 4. GetWidgetHandler.java (posodobljeno z DynamoDBMapper)
paket com.javaworld.awslambda.widget.handlers; uvoz com.amazonaws.services.dynamodbv2.AmazonDynamoDB; uvoz com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; uvoz com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; uvoz com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; uvoz com.javaworld.awslambda.widget.model.Widget; uvoz com.javaworld.awslambda.widget.model.WidgetRequest; javni razred GetWidgetHandler izvaja RequestHandler {@Override public Widget handleRequest (WidgetRequest widgetRequest, Context context) {// Ustvari povezavo z odjemalcem DynamoDB AmazonDynamoDB = AmazonDynamoDBClientBuilder.defaultClient (); // Izdelava preslikavnika DynamoDBMapper mapper = nov DynamoDBMapper (odjemalec); // Naložimo pripomoček po ID-ju Widget widget = mapper.load (Widget.class, widgetRequest.getId ()); if (widget == null) {// Nismo našli pripomočka s tem ID-jem, zato vrnite prazen pripomoček context.getLogger (). log ("Pripomočka ni bilo mogoče najti z ID-jem:" + widgetRequest.getId () + "\ n "); vrni nov pripomoček (); } // Vrni pripomoček vrni pripomoček; }}
V prejšnji (1. del) različici GetWidgetHandler
ustvarili smo AmazonDynamoDB
primer, z uporabo AmazonDynamoDBClientBuilder.defaultClient ()
pokličite. Zdaj bomo tega odjemalca uporabili za inicializacijo a DynamoDBMapper
namesto tega.
Razred DynamoDBMapper omogoča dostop do izvrševanja poizvedb, nalaganja predmetov po ID-ju, shranjevanja predmetov, brisanja predmetov itd. V tem primeru gremo mimo DynamoDBMapper
razred pripomočka (Widget.class
) in njegov primarni ključ. Če ima DynamoDB Pripomoček
z navedenim primarnim ključem ga bo vrnil; v nasprotnem primeru se vrne null.
Znova zgradite in nato znova naložite novo datoteko JAR, tako da odprete nadzorno ploščo funkcije Lambda, nato kliknite na Koda in pritisnite Naloži. Ko znova naložite in pozneje pokličete svojo funkcijo, bo AWS Lambda ustvaril nov vsebnik za novo datoteko JAR in jo poslal v primerek EC2. Pričakovati morate, da bo prvi tek počasen.
Če slučajno naletite na OutOfMemoryError
ko ponovno preizkusite svojo funkcijo, izberite Konfiguracija in odprite razdelek Napredne nastavitve. Tu lahko povečate svoj spomin, kot je prikazano spodaj.