使用Spring Data的Spring Boot应用程序中的DynamoDB

2023/05/18

1. 概述

在本文中,我们将通过一个动手实践的示例项目来探讨将DynamoDB集成到Spring Boot应用程序中的基础知识

我们将演示如何使用Spring Data配置应用程序以使用本地DynamoDB实例。我们还将创建一个示例数据模型和Repository类,并使用集成测试执行实际的数据库操作。

2. DynamoDB

DynamoDB是AWS上完全托管的托管NoSQL数据库,类似于其他NoSQL数据库,例如Cassandra或MongoDB。DynamoDB提供快速、一致和可预测的性能,并且可大规模扩展。

你可以在AWS文档上了解有关DynamoDB的更多信息。

让我们安装DynamoDB的本地实例以避免产生运行实时实例的成本。

对于开发,在本地运行DynamoDB比在AWS上运行更有意义;本地实例将作为可执行JAR文件运行。

你可以在此处找到有关如何在本地运行DynamoDB的说明。

3. Maven依赖

添加以下依赖项以开始使用Spring Data使用DynamoDB:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-releasetrain</artifactId>
            <version>Lovelace-SR16</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-dynamodb</artifactId>
        <version>1.11.64</version>
    </dependency>
    <dependency>
        <groupId>com.github.derjust</groupId>
        <artifactId>spring-data-dynamodb</artifactId>
        <version>5.1.0</version>
    </dependency>
</dependencies>

查看Spring Data ReleaseTrainAWS Java SDK For AmazonDynamoDBSpring Data DynamoDB以获得上述最新版本。

4. 配置

接下来,让我们在application.properties文件中定义以下属性:

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

上面列出的accesskey和secretkey只是你本地配置的任意值。当访问DynamoDB的本地实例时,这些字段需要用一些值填充,但不需要实际进行身份验证。

这些属性将动态地从Spring配置中的application.properties文件中提取出来:

@Configuration
@EnableDynamoDBRepositories
      (basePackages = "cn.tuyucheng.taketoday.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. 数据模型

现在让我们创建一个POJO模型来表示存储在DynamoDB中的数据。

这个POJO将使用类似于Hibernate中使用的注解来定义表名、属性、键和表的其他方面。

5.1 数据模型属性

以下类ProductInfo表示一个包含3个属性元素的表:

  1. ID
  2. MSRP
  3. Cost

5.2 Java数据模型类

让我们在model文件夹中创建一个名为ProductInfo.java的文件:

@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

接下来,我们需要创建一个ProductRepository接口来定义我们想要构建的CRUD功能。用于从DynamoDB读取和保存数据的Repository将实现此接口:

@EnableScan
public interface ProductInfoRepository extends CrudRepository<ProductInfo, String> {

    Optional<ProductInfo> findById(String id);
}

7. 集成测试

接下来,让我们创建一个集成测试,以确保我们可以成功连接到DynamoDB的本地实例:

@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<ProductInfo>)repository.findAll());
    }

    @Test
    public void givenItemWithExpectedCost_whenRunFindAll_thenItemIsFound() {
        ProductInfo productInfo = new ProductInfo(EXPECTED_COST, EXPECTED_PRICE);
        repository.save(productInfo);
        List<ProductInfo> result = (List<ProductInfo>) repository.findAll();

        assertThat(result.size(), is(greaterThan(0)));
        assertThat(result.get(0).getCost(), is(equalTo(EXPECTED_COST)));
    }
}

8. 总结

我们已经完成了-现在我们可以从Spring Boot应用程序连接到DynamoDB

当然,在本地完成测试后,我们应该能够透明地在AWS上使用DynamoDB的实时实例,并运行部署的代码,只需进行微小的配置更改。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章