DynamoDB in een Spring Boot-applicatie met Spring Data

1. Overzicht

In dit artikel, we zullen de basisprincipes verkennen van het integreren van DynamoDB in een Spring Boot-applicatie met een hands-on, praktisch voorbeeldproject.

We laten zien hoe u een applicatie configureert om een ​​lokale DynamoDB-instantie te gebruiken met Spring Data. We zullen ook een voorbeeld van een datamodel en repository-klasse maken en daadwerkelijke databasebewerkingen uitvoeren met een integratietest.

2. DynamoDB

DynamoDB is een volledig beheerde gehoste NoSQL-database op AWS, vergelijkbaar met andere NoSQL-databases zoals Cassandra of MongoDB. DynamoDB biedt snelle, consistente en voorspelbare prestaties en is enorm schaalbaar.

U kunt meer over DynamoDB lezen in de AWS-documentatie.

Laten we installeren een lokaal exemplaar van DynamoDB om te voorkomen dat u de kosten voor het uitvoeren van een live-instantie oploopt.

Voor ontwikkeling is DynamoDB lokaal draaien zinvoller dan draaien op AWS; het lokale exemplaar wordt uitgevoerd als een uitvoerbaar JAR-bestand.

Instructies voor het lokaal uitvoeren van DynamoDB vindt u hier.

3. Maven afhankelijkheden

Voeg de volgende afhankelijkheden toe om met DynamoDB te gaan werken met Spring Data:

  • Spring Data JPA
  • AWS Java SDK DynamoDB
  • Spring Data DynamoDB gemeenschapsmodule
   org.springframework.data spring-data-releasetrain Lovelace-SR16 pom import com.amazonaws aws-java-sdk-dynamodb 1.11.64 com.github.derjust spring-data-dynamodb 5.1.0 

Bekijk Spring Data Release Train, AWS Java SDK For Amazon DynamoDB en Spring Data DynamoDB voor de nieuwste versies van het bovenstaande.

4. Configuratie

Laten we vervolgens de volgende eigenschappen definiëren in het application.properties het dossier:

amazon.dynamodb.endpoint = // localhost: 8000 / amazon.aws.accesskey = sleutel amazon.aws.secretkey = sleutel2 

De hierboven genoemde toegangs- en geheime sleutels zijn slechts willekeurige waarden voor uw lokale configuratie. Bij toegang tot een lokaal exemplaar van DynamoDB moeten deze velden worden gevuld met een aantal waarden, maar zijn ze niet nodig om daadwerkelijk te verifiëren.

De eigenschappen worden dynamisch uit het application.properties bestand in de Spring config:

@Configuration @EnableDynamoDBRepositories (basePackages = "com.baeldung.spring.data.dynamodb.repositories") openbare klasse DynamoDBConfig {@Value ("$ {amazon.dynamodb.endpoint}") private String amazonDynamoDBEndpoint; @Value ("$ {amazon.aws.accesskey}") private String amazonAWSAccessKey; @Value ("$ {amazon.aws.secretkey}") private String amazonAWSSecretKey; @Bean openbaar AmazonDynamoDB amazonDynamoDB () {AmazonDynamoDB amazonDynamoDB = nieuwe AmazonDynamoDBClient (amazonAWSCredentials ()); if (! StringUtils.isEmpty (amazonDynamoDBEndpoint)) {amazonDynamoDB.setEndpoint (amazonDynamoDBEndpoint); } terugkeer amazonDynamoDB; } @Bean openbare AWSCredentials amazonAWSCredentials () {retourneer nieuwe BasicAWSCredentials (amazonAWSAccessKey, amazonAWSSecretKey); }}

5. Het gegevensmodel

Laten we nu een POJO-model maken om de gegevens weer te geven die zijn opgeslagen in DynamoDB.

Deze POJO gebruikt annotaties die vergelijkbaar zijn met die in Hibernate om de tabelnaam, attributen, sleutels en andere aspecten van de tabel te definiëren.

5.1. Gegevensmodelkenmerken

De volgende klas, Product informatie, staat voor een tabel met items die 3 attributen bevat:

  1. ID kaart
  2. MSRP
  3. Kosten

5.2 Java-gegevensmodelklasse

Laten we een bestand maken met de naam ProductInfo.java in uw datamodelmap:

@DynamoDBTable (tableName = "ProductInfo") openbare klasse ProductInfo {privé String-id; private String msrp; private String kosten; @DynamoDBHashKey @DynamoDBAutoGeneratedKey openbare String getId () {retour-id; } @DynamoDBAttribute openbare String getMsrp () {return msrp; } @DynamoDBAttribute public String getCost () {retourkosten; } // standaard setters / constructeurs} 

6. CRUD-opslagplaats

Vervolgens moeten we een Productopslagplaats interface om de CRUD-functionaliteit te definiëren die we willen uitbouwen. Repositories die worden gebruikt om gegevens van en naar DynamoDB te lezen en te bewaren, zullen deze interface implementeren:

@EnableScan openbare interface ProductInfoRepository breidt CrudRepository uit {Optioneel findById (String id); } 

7. Integratietest

Laten we vervolgens een integratietest maken om ervoor te zorgen dat we met succes verbinding kunnen maken met het lokale exemplaar van DynamoDB:

@RunWith (SpringJUnit4ClassRunner.class) @SpringBootTest (classes = Application.class) @WebAppConfiguration @ActiveProfiles ("local") @TestPropertySource (properties = {"amazon.dynamodb.endpoint = // localhost: 8000 /", "amazon.aws .accesskey = test1 "," amazon.aws.secretkey = test231 "}) openbare klasse ProductInfoRepositoryIntegrationTest {privé DynamoDBMapper dynamoDBMapper; @Autowired privé AmazonDynamoDB amazonDynamoDB; @Autowired ProductInfoRepository-opslagplaats; private static final String EXPECTED_COST = "20"; private static final String EXPECTED_PRICE = "50"; @Before public void setup () gooit Uitzondering {dynamoDBMapper = nieuwe DynamoDBMapper (amazonDynamoDB); CreateTableRequest tableRequest = dynamoDBMapper .generateCreateTableRequest (ProductInfo.class); tableRequest.setProvisionedThroughput (nieuwe ProvisionedThroughput (1L, 1L)); amazonDynamoDB.createTable (tableRequest); // ... dynamoDBMapper.batchDelete ((List) repository.findAll ()); } @Test openbare ongeldig gegevenItemWithExpectedCost_whenRunFindAll_thenItemIsFound () {ProductInfo productInfo = nieuwe ProductInfo (EXPECTED_COST, EXPECTED_PRICE); repository.save (productInfo); Lijstresultaat = (Lijst) repository.findAll (); assertThat (result.size (), is (groter dan (0))); assertThat (result.get (0) .getCost (), is (equalTo (EXPECTED_COST))); }} 

8. Conclusie

En we zijn klaar - we kunnen het nu maak verbinding met DynamoDB vanuit een Spring Boot-applicatie.

Na het lokaal voltooien van de tests, zouden we natuurlijk in staat moeten zijn om transparant een live exemplaar van DynamoDB op AWS te gebruiken en de geïmplementeerde code uit te voeren met slechts kleine configuratiewijzigingen.

Zoals altijd is het voorbeeld dat in dit artikel wordt gebruikt, beschikbaar als een voorbeeldproject op GitHub.