DynamoDB in einer Spring Boot-Anwendung mit Spring Data

1. Übersicht

In diesem Artikel werden die Grundlagen der Integration von DynamoDB in eine Spring Boot-Anwendung mit einem praktischen, praktischen Beispielprojekt erläutert.

Wir zeigen, wie Sie eine Anwendung für die Verwendung einer lokalen DynamoDB-Instanz mithilfe von Spring Data konfigurieren. Wir erstellen auch ein Beispiel für ein Datenmodell und eine Repository-Klasse und führen mithilfe eines Integrationstests tatsächliche Datenbankoperationen durch.

2. DynamoDB

DynamoDB ist eine vollständig verwaltete gehostete NoSQL-Datenbank unter AWS, ähnlich wie andere NoSQL-Datenbanken wie Cassandra oder MongoDB. DynamoDB bietet eine schnelle, konsistente und vorhersehbare Leistung und ist massiv skalierbar.

Weitere Informationen zu DynamoDB finden Sie in der AWS-Dokumentation.

Lassen Sie uns eine lokale Instanz von DynamoDB installieren , um die Kosten für die Ausführung einer Live-Instanz zu vermeiden.

Für die Entwicklung ist das lokale Ausführen von DynamoDB sinnvoller als das Ausführen unter AWS. Die lokale Instanz wird als ausführbare JAR-Datei ausgeführt.

Anweisungen zum lokalen Ausführen von DynamoDB finden Sie hier.

3. Maven-Abhängigkeiten

Fügen Sie die folgenden Abhängigkeiten hinzu, um mit Springo mit DynamoDB zu arbeiten:

  • Federdaten JPA
  • AWS Java SDK DynamoDB
  • Spring Data DynamoDB-Community-Modul
   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   

Die neuesten Versionen von Spring Data Release Train, AWS Java SDK für Amazon DynamoDB und Spring Data DynamoDB finden Sie hier.

4. Konfiguration

Als Nächstes definieren wir die folgenden Eigenschaften in der Datei application.properties :

amazon.dynamodb.endpoint=//localhost:8000/ amazon.aws.accesskey=key amazon.aws.secretkey=key2 

Die oben aufgeführten Zugriffs- und Geheimschlüssel sind nur beliebige Werte für Ihre lokale Konfiguration. Beim Zugriff auf eine lokale Instanz von DynamoDB müssen diese Felder mit einigen Werten gefüllt sein, werden jedoch nicht zur tatsächlichen Authentifizierung benötigt.

Die Eigenschaften werden dynamisch aus der Datei application.properties in der Spring-Konfiguration abgerufen :

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

5. Das Datenmodell

Erstellen wir nun ein POJO-Modell, um die in DynamoDB gespeicherten Daten darzustellen.

Dieses POJO verwendet Anmerkungen, die denen im Ruhezustand ähneln, um den Tabellennamen, die Attribute, die Schlüssel und andere Aspekte der Tabelle zu definieren.

5.1. Datenmodellattribute

Die folgende Klasse, ProductInfo , repräsentiert eine Tabelle mit Elementen, die 3 Attribute enthält:

  1. ICH WÜRDE
  2. UVP
  3. Kosten

5.2 Java-Datenmodellklasse

Erstellen wir eine Datei mit dem Namen ProductInfo.java in Ihrem Datenmodellordner:

@DynamoDBTable(tableName = "ProductInfo") public class ProductInfo { private String id; private String msrp; private String cost; @DynamoDBHashKey @DynamoDBAutoGeneratedKey public String getId() { return id; } @DynamoDBAttribute public String getMsrp() { return msrp; } @DynamoDBAttribute public String getCost() { return cost; } // standard setters/constructors } 

6. CRUD-Repository

Als Nächstes müssen wir eine ProductRepository- Schnittstelle erstellen , um die CRUD-Funktionalität zu definieren, die wir ausbauen möchten. Repositorys zum Lesen und Speichern von Daten zu und von DynamoDB implementieren diese Schnittstelle:

@EnableScan public interface ProductInfoRepository extends CrudRepository { Optional findById(String id); } 

7. Integrationstest

Als Nächstes erstellen wir einen Integrationstest, um sicherzustellen, dass eine erfolgreiche Verbindung zur lokalen Instanz von DynamoDB hergestellt werden kann:

@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" }) public class ProductInfoRepositoryIntegrationTest { private DynamoDBMapper dynamoDBMapper; @Autowired private AmazonDynamoDB amazonDynamoDB; @Autowired ProductInfoRepository repository; private static final String EXPECTED_COST = "20"; private static final String EXPECTED_PRICE = "50"; @Before public void setup() throws Exception { dynamoDBMapper = new DynamoDBMapper(amazonDynamoDB); CreateTableRequest tableRequest = dynamoDBMapper .generateCreateTableRequest(ProductInfo.class); tableRequest.setProvisionedThroughput( new ProvisionedThroughput(1L, 1L)); amazonDynamoDB.createTable(tableRequest); //... dynamoDBMapper.batchDelete( (List)repository.findAll()); } @Test public void givenItemWithExpectedCost_whenRunFindAll_thenItemIsFound() { ProductInfo productInfo = new ProductInfo(EXPECTED_COST, EXPECTED_PRICE); repository.save(productInfo); List result = (List) repository.findAll(); assertThat(result.size(), is(greaterThan(0))); assertThat(result.get(0).getCost(), is(equalTo(EXPECTED_COST))); } } 

8. Fazit

Und wir sind fertig - wir können jetzt über eine Spring Boot-Anwendung eine Verbindung zu DynamoDB herstellen .

Nach Abschluss des lokalen Tests sollten wir natürlich in der Lage sein, eine Live-Instanz von DynamoDB unter AWS transparent zu verwenden und den bereitgestellten Code mit nur geringfügigen Konfigurationsänderungen auszuführen.

Wie immer ist das in diesem Artikel verwendete Beispiel als Beispielprojekt auf GitHub verfügbar.