DynamoDB in einer Spring-Boot-Anwendung, die Spring Data verwendet

DynamoDB in einer Spring-Boot-Anwendung unter Verwendung von Spring-Daten

1. Überblick

In diesem Artikel wirdwe’ll explore the basics of integrating DynamoDB into a Spring Boot Applicationmit einem praktischen, praktischen Beispielprojekt beschrieben.

Wir zeigen, wie Sie eine Anwendung mithilfe von Spring Data für die Verwendung einer lokalen DynamoDB-Instanz konfigurieren. Außerdem erstellen wir 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 in 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 unterAWS Documentation.

Installieren wira local instance of DynamoDB, um die Kosten für die Ausführung einer Live-Instanz zu vermeiden.

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

Hier finden Sie Anweisungen zumrun DynamoDB locally here.

3. Maven-Abhängigkeiten

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


    
    
        org.springframework.data
        spring-data-releasetrain
        Hopper-SR10
        pom
        import
        
    


    
        com.amazonaws
        aws-java-sdk-dynamodb
        1.11.34
    
    
        com.github.derjust
        spring-data-dynamodb
        4.3.1
    

4. Aufbau

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

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

Die oben aufgeführten Zugangs- und Geheimschlüssel sind nur willkürliche Werte für Ihre lokale Konfiguration. Wenn Sie auf eine lokale Instanz von DynamoDB zugreifen, müssen diese Felder mit einigen Werten gefüllt sein, sie müssen jedoch nicht zur tatsächlichen Authentifizierung verwendet werden.

Die Eigenschaften werden dynamisch inthe Spring config aus der Dateiapplication.properties gezogen:

@Configuration
@EnableDynamoDBRepositories
  (basePackages = "com.example.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 enthalten:

  1. ID

  2. MSRP

  3. Cost

5.2 Java Data Model Class

Erstellen Sie eine Datei mit dem NamenProductInfo.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 eineProductRepository-Schnittstelle erstellen, um die CRUD-Funktionalität zu definieren, die wir ausbauen möchten. Repositorys, die zum Lesen und Speichern von Daten in und aus DynamoDB verwendet werden, implementieren diese Schnittstelle:

@EnableScan
public interface ProductInfoRepository extends
  CrudRepository {

    List findById(String id);
}

7. Integrationstest

Als Nächstes erstellen wir einen Integrationstest, um sicherzustellen, dass wir erfolgreich eine Verbindung zur lokalen Instanz von DynamoDB herstellen können:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
@WebAppConfiguration
@ActiveProfiles("local")
@TestPropertySource(properties = {
  "amazon.dynamodb.endpoint=http://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 sampleTestCase() {
        ProductInfo dave = new ProductInfo(EXPECTED_COST, EXPECTED_PRICE);
        ProductInfoRepository.save(dave);

        List result
          = (List) repository.findAll();

        assertTrue("Not empty", result.size() > 0);
        assertTrue("Contains item with expected cost",
          result.get(0).getCost().equals(EXPECTED_COST));
    }
}

8. Fazit

Und wir sind fertig - wir können jetztconnect to DynamoDB from a Spring Boot Application.

Natürlich sollten wir nach Abschluss des Tests vor Ort 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 Beispielprojektover on GitHub verfügbar.