Programiranje

Brezžično računalništvo z AWS Lambda, 2. del

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 Haines

Po zagonu boste videli nadzorno ploščo DynamoDB. Kliknite Ustvari tabelo , da začnete ustvarjati tabelo, prikazano na sliki 2.

Steven Haines

Zdaj boste videli stran, prikazano na sliki 3.

Steven Haines

Dajte 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.

Steven Haines

V novo tabelo pripomočkov bomo ročno ustvarili vnos, zato kliknite Ustvari element na sliki 5.

Steven Haines

DynamoDB 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.

prenos Prenesite kodo Pridobite kodo za posodobljeno aplikacijo GetWidgetHandler. Ustvaril Steven Haines za JavaWorld.

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.

Steven Haines
$config[zx-auto] not found$config[zx-overlay] not found