Tämän artikkelin alkupuoliskolla oli yleiskatsaus AWS Lambda -palvelimella tapahtuvaan palvelimettomaan laskentaan, mukaan lukien AWS Lambda -toimintojen rakentaminen, käyttöönotto ja testaus Java-esimerkkisovelluksessa. Osassa 2 opit integroimaan Lambda-toiminnot ulkoiseen tietokantaan, tässä tapauksessa DynamoDB. Sitten käytämme AWS SDK: ta Lambda-toimintojen kutsumiseen esimerkkisovelluksestamme.
AWS Lambda ja DynamoDB
DynamoDB on NoSQL-dokumenttikauppa, jota isännöi Amazon Web Services (AWS). DynamoDB määrittelee tietojen abstraktit taulukoiksi, jotka hyväksyvät yleiset tietokantatoiminnot, kuten lisäys, nouto, kysely, päivitys ja poisto. Kuten monien muiden NoSQL-tietokantojen kohdalla, DynamoDB: n mallia ei ole korjattu, joten joillakin saman taulukon kohteilla voi olla kenttiä, joita toiset eivät.
Yksi DynamoDB: n parhaista ominaisuuksista on porrastettu hinnoittelumalli. Toisin kuin AWS Relational Database Service (RDS), jossa AWS hallinnoi tietokantasi käyttämällä maksamiasi EC2-ilmentymiä, DynamoDB on pay-as-you-go. Maksat käyttämästäsi tallennustilasta ja kyselyidesi suoritustasosta, mutta et maksa suoraan mistään taustalla olevista virtuaalikoneista. Lisäksi AWS antaa sinulle ilmaisen tason, joka tukee jopa 25 Gt tilaa ja riittävän läpijuoksun jopa 200 miljoonan pyynnön suorittamiseen kuukaudessa.
Palvelimettomassa laskennassa AWS Lambdalla, osa 1, kehitimme yksinkertaisen, palvelimettoman Java-sovelluksen, joka käyttää Lambda-toimintoja. Voit ladata GetWidgetHandler-sovelluksen lähdekoodin milloin tahansa. Jos et ole vielä lukenut osaa 1, suosittelen tutustumaan sovelluskoodiin ja esimerkkeihin kyseisestä artikkelista ennen jatkamista.
Ensimmäinen askel on määrittää DynamoDB-tietokanta AWS-konsolillemme. Sen jälkeen päivitämme get-widget
toiminto osasta 1 hakeaksesi widgetin DynamoDB-taulukosta.
Määritä DynamoDB-tietokanta AWS: ssä
Aloitetaan luomalla DynamoDB-taulukko. Napsauta AWS-konsolissa Palvelut ja valitse tietokantaosasta DynamoDB kuvan 1 mukaisesti.
Steven HainesKäynnistyksen jälkeen näet DynamoDB-kojelaudan. Klikkaa Luo taulukko -painiketta aloittaaksesi taulukon luomisen, kuten kuvassa 2.
Steven HainesNyt näet kuvassa 3 esitetyn sivun.
Steven HainesAnna taulukolle nimi (tässä tapauksessa "Widget") ja aseta ensisijaiseksi avaimeksi id
, jättäen sen nimellä Merkkijono
. Paina Luoda Kun olet valmis, sinut ohjataan DynamoDB-taulukoiden sivulle. Jos haluat siirtyä tälle sivulle tulevaisuudessa, valitse Palvelut -> DynamoDBja napsauta Taulukot.
Luomme merkinnän manuaalisesti uuteen Widget-taulukkoon, joten napsauta Luo kohde painike, joka näkyy kuvassa 5.
Steven HainesDynamoDB täyttää Luo kohde -sivun valmiiksi id
ala. Anna helposti muistettava tunnus, kuten "1". Paina seuraavaksi plusmerkkiä (+) uuden tunnuksen vieressä ja lisää uusi kenttä nimeltä nimi
. Anna arvo arvolle nimi
kenttä, kuten "Widget 1". Lehdistö Tallentaa kun olet valmis.
Päivitä GetWidgetHandler-luokka
Kun tietokannassamme on tietoja, seuraava asia, joka meidän on tehtävä, on päivittää GetWidgetHandler
luokka osasta 1. Aloitetaan lisäämällä DynamoDB-riippuvuus alkuperäiseen POM-tiedostoon. Päivitetty pom.xml
tiedosto näkyy luettelossa 1.
Listaus 1. pom.xml (päivitetty DynamoDB-riippuvuuteen)
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 testi org.apache.maven.plugins maven-compiler-plugin 2.0.2 $ {java.version} $ {java.version} org.apache.maven.plugins maven-shadow -laajennus 2.3 väärä paketin sävy
Listaus 1 lisää aws-java-sdk-dynamodb
riippuvuus POM-tiedostosta osasta 1. Luettelossa 2 näkyy päivitetty GetWidgetHandler
luokassa.
Listaus 2. GetWidgetHandler.java (päivitetty lataamaan tietoja DynamoDB: ltä)
paketti com.javaworld.awslambda.widget.handlers; tuonti com.amazonaws.services.dynamodbv2.AmazonDynamoDB; tuo com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; tuo com.amazonaws.services.dynamodbv2.document.DynamoDB; tuo com.amazonaws.services.dynamodbv2.document.Item; tuo com.amazonaws.services.dynamodbv2.document.Table; tuo com.amazonaws.services.lambda.runtime.Context; tuo com.amazonaws.services.lambda.runtime.RequestHandler; tuo com.javaworld.awslambda.widget.model.Widget; tuo com.javaworld.awslambda.widget.model.WidgetRequest; public class GetWidgetHandler toteuttaa RequestHandler {@Override public Widget handleRequest (WidgetRequest widgetRequest, Context context) {// palauta uusi Widget (widgetRequest.getId (), "My Widget" + widgetRequest.getId ()); // Luo yhteys DynamoDB AmazonDynamoDB -asiakasohjelmaan = AmazonDynamoDBClientBuilder.defaultClient (); DynamoDB dynamoDB = uusi DynamoDB (asiakas); // Hanki viittaus Widget-taulukon taulukotaulukkoon = dynamoDB.getTable ("Widget"); // Hanki tuotteemme ID-nimikkeellä item = table.getItem ("id", widgetRequest.getId ()); if (item! = null) {System.out.println (item.toJSONPretty ()); // Palauta uusi Widget-objekti Palauta uusi Widget (widgetRequest.getId (), item.getString ("nimi")); } else {return new Widget (); }}}
Tärkein käyttöliittymä DynamoDB: lle on DynamoDB
esine. Voit luoda a DynamoDB
tarvitsemme esimerkiksi DynamoDB-asiakkaan. Koska Lambda-toiminto toimii AWS: ssä, meidän ei tarvitse antaa kirjautumistietoja, joten voimme käyttää oletusasiakasta. Huomaa, että voimme tehdä kyselyn tietokannasta vain ilman kirjautumistietoja, koska get-widget-rooli
osasta 1 on dynamodb: GetItem
lupa.
Alkaen DynamoDB
esimerkiksi voimme soittaa getTable ("Widget")
hakea a Pöytä
ilmentymä. Sitten voimme soittaa getItem ()
on Pöytä
esimerkiksi välittämällä sille haettavan alkion ensisijainen avain. Jos on kohde, jolla on määritetty ensisijainen avain, se palauttaa kelvollisen vastauksen; muuten se palaa tyhjä
. Tuote
luokka tarjoaa pääsyn vasteparametreihin, joten viimeistelemme toteutuksen luomalla uuden Widget
objekti, jonka nimi on ladattu DynamoDB: ltä.
DynamoDB: n kysely DynamoDBMapperilla
On olemassa useita sovellusliittymiä DynamoDB: n kyselyyn RESTful-palvelupuhelusta yllä olevaan matalan tason rajapintaan pariin ylemmän tason rajapintoihin. Yksi suosituimmista käyttöliittymistä on DynamoDBMapper. Tämä käyttöliittymä tarjoaa samanlaisen rakenteen kuin mitä saatat löytää kartoitettaessa objekteja relaatiotietoihin horrostilassa. Tarkastellaan lyhyesti, kuinka a Widget
DynamoDB: ltä DynamoDBMapper
API.
Ensimmäinen asia, joka meidän on tehtävä, on lisätä muutama merkintä Widget
luokka, joka näkyy luettelossa 3.
Listaus 3. Widget.java (päivitetty DynamoDBMapper-merkinnöillä)
paketti com.javaworld.awslambda.widget.model; tuo com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute; tuo com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; tuo com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable; @DynamoDBTable (tableName = "Widget") julkisen luokan Widget {private String id; yksityinen merkkijono nimi; public Widget () {} public Widget (String id) {this.id = id; } public Widget (String id, String name) {this.id = id; tämä.nimi = nimi; } @DynamoDBHashKey (attributeName = "id") public String getId () {return ID; } public void setId (String id) {this.id = id; } @DynamoDBAttribute (attributeName = "nimi") public String getName () {return name; } public void setName (Merkkijonon nimi) {this.name = nimi; }}
DynamoDBTable
merkinnällä määritetään sen DynamoDB-taulukon nimi, johon Widget
karttoja. DynamoDBHashKey
-merkintä tunnistaa ensisijaisen avaimen Widget
pöytä. Ja DynamoDBAttribute
merkintä tunnistaa muut luokkamääritteet, jotka yhdistetään DynamoDB: n tietokannan määritteisiin. Jos sinulla on muita määritteitä, jotka haluat jättää huomiotta, voit lisätä ne @DynamoDBIgnore
merkintä.
Kanssa Widget
luokka on merkitty, voimme nyt päivittää GetWidgetHandler
luokan käyttää DynamoDBMapper
, joka näkyy luettelossa 4.
Listaus 4. GetWidgetHandler.java (päivitetty DynamoDBMapperillä)
paketti com.javaworld.awslambda.widget.handlers; tuonti com.amazonaws.services.dynamodbv2.AmazonDynamoDB; tuo com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; tuo com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; tuo com.amazonaws.services.lambda.runtime.Context; tuo com.amazonaws.services.lambda.runtime.RequestHandler; tuo com.javaworld.awslambda.widget.model.Widget; tuo com.javaworld.awslambda.widget.model.WidgetRequest; public class GetWidgetHandler toteuttaa RequestHandler {@Override public Widget handleRequest (WidgetRequest widgetRequest, kontekstikonteksti) {// Luo yhteys DynamoDB AmazonDynamoDB client = AmazonDynamoDBClientBuilder.defaultClient (); // Rakenna kartoitin DynamoDBMapper mapper = uusi DynamoDBMapper (asiakas); // Lataa widget ID: llä Widget-widget = mapper.load (Widget.class, widgetRequest.getId ()); if (widget == null) {// Emme löytäneet widgetiä tällä tunnuksella, joten palauta tyhjä Widget-konteksti.getLogger (). log. ("Widgetiä ei löydy tunnuksella:" + widgetRequest.getId () + "\ n "); palauta uusi widget (); } // Palauta widgetin palautus-widget; }}
Aikaisemmassa (osa 1) versiossa GetWidgetHandler
loimme AmazonDynamoDB
esimerkiksi käyttämällä a AmazonDynamoDBClientBuilder.defaultClient ()
puhelu. Nyt käytämme kyseistä asiakasta alustamaan a DynamoDBMapper
sen sijaan.
DynamoDBMapper-luokka tarjoaa pääsyn kyselyjen suorittamiseen, objektien lataamiseen tunnisteella, objektien tallentamiseen, objektien poistamiseen ja niin edelleen. Tässä tapauksessa ohitamme DynamoDBMapper
widgetin luokka (Widget.luokka
) ja sen ensisijainen avain. Jos DynamoDB: llä on Widget
määritetyllä ensisijaisella avaimella se palauttaa sen; jos ei, se palauttaa nollan.
Rakenna ja lataa uusi JAR-tiedosto uudelleen avaamalla Lambda-toiminnon koontinäyttö ja napsauttamalla sitten Koodi -välilehti ja paina Lähetä. Kun lataat uudelleen ja soitat myöhemmin toimintoosi, AWS Lambda luo uuden säilön uudelle JAR-tiedostolle ja siirtää sen EC2-ilmentymään. Sinun pitäisi odottaa ensimmäisen ajon olevan hidas.
Jos satut kohtaamaan OutOfMemoryError
kun testaat toimintoasi uudelleen, valitse Kokoonpano -välilehti ja avaa Lisäasetukset-osio. Täällä voit lisätä muistiasi alla olevan kuvan mukaisesti.